redux-observable - action$.ofType 不是函数
redux-observable - action$.ofType is not a function
我正在尝试使用 redux-observable 做一个小的 POC,所以请耐心等待,我所有的代码都在一个文件中 (index.js)
我收到此错误:
action$.ofType is not a function
在下面标记的代码行:
index.js
//@flow
import { createStore, applyMiddleware } from 'redux'
import { combineReducers } from 'redux-immutable'
import { Provider } from 'react-redux'
import Vepo from './components/vepo/Vepo'
import keywords from './components/keywords/keywords.reducer'
import categories from './components/categories/categories.reducer'
import initialState from './config/config'
import { composeWithDevTools } from 'remote-redux-devtools'
import React from 'react'
import devToolsEnhancer from 'remote-redux-devtools'
import Rx from 'rxjs/Rx'
import { ajax } from 'rxjs/observable/dom/ajax'
import { createEpicMiddleware } from 'redux-observable'
import { } from 'redux-observable'
const FETCH_CATEGORIES = 'FETCH_CATEGORIES'
const FETCH_CATEGORIES_FULFILLED = 'FETCH_CATEGORIES_FULFILLED'
// action creators
const fetchCategories = Categories => ({ type: FETCH_CATEGORIES, payload: Categories });
const fetchCategoriesFulfilled = payload => ({ type: FETCH_CATEGORIES_FULFILLED, payload });
// epic
const fetchCategoriesEpic = action$ =>
action$.ofType(FETCH_CATEGORIES)<=======================THIS LINE
.mergeMap(() =>
ajax.getJSON(`https://localhost:4000/categories`)
.map(response => fetchCategoriesFulfilled(response))
);
const categories1 = (state = {}, action) => {
switch (action.type) {
case FETCH_CATEGORIES_FULFILLED:
return [action.payload.login]
default:
return state;
}
};
const reducer = combineReducers(
{
searchForm: combineReducers(
{
keywords,
categories
})
}
)
const store = createStore(
reducer,
initialState,
applyMiddleware(fetchCategoriesEpic)
//composeWithDevTools(createEpicMiddleware(fetchCategoriesEpic))
)
const App = () => (
<Provider store={store}>
<Vepo />
</Provider>
)
export default App
这个错误听起来好像我没有正确导入 redux-observable。我使用 webpack 2。我已经完成了 yarn add redux-observable
,这是所有需要的,然后我可以只做 import xxx
但我在上面的代码中正确导入了吗?我不确定如何导入 redux-observable。我在文档中看不到它正在完成。
package.json
{
"name": "vepo",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node node_modules/react-native/local-cli/cli.js start",
"test": "jest"
},
"rnpm": {
"assets": [
"./app/fonts"
]
},
"jest": {
"preset": "react-native",
"moduleNameMapper": {
"\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js",
"\.(css|less)$": "<rootDir>/__mocks__/styleMock.js"
}
},
"dependencies": {
"flow-typed": "^2.0.0",
"immutable": "^3.8.1",
"native-base": "^2.1.0",
"react": "16.0.0-alpha.6",
"react-native": "^0.43.3",
"react-native-multiple-choice": "^0.0.8",
"react-native-select-multiple": "^1.0.3",
"react-native-vector-icons": "^4.0.0",
"react-redux": "^5.0.3",
"redux": "^3.6.0",
"redux-immutable": "^4.0.0",
"redux-observable": "^0.14.1",
"reselect": "^3.0.0",
"rxjs": "^5.2.0",
"yoga": "^0.0.0"
},
"devDependencies": {
"babel-eslint": "^7.1.1",
"babel-jest": "19.0.0",
"babel-preset-react-native": "1.9.1",
"eslint": "^3.17.0",
"eslint-plugin-flowtype": "^2.30.3",
"eslint-plugin-jsx": "^0.0.2",
"eslint-plugin-react": "^6.10.0",
"eslint-plugin-react-native": "^2.3.1",
"flow-bin": "^0.42.0",
"jest": "19.0.2",
"jest-cli": "^19.0.2",
"react-test-renderer": "~15.4.1",
"redux-devtools": "^3.3.2",
"remote-redux-devtools": "^0.5.7"
}
}
I am unsure how to import redux-observable. I cannot see it being done in the docs.
设置 redux-observable 在文档中有描述:https://redux-observable.js.org/docs/basics/SettingUpTheMiddleware.html但是看起来你确实看到了,因为你正在导入它。
您的设置方式几乎是正确的,事实上您已经注释掉了正确设置的代码。
applyMiddleware(fetchCategoriesEpic)
//composeWithDevTools(createEpicMiddleware(fetchCategoriesEpic))
您不小心将 Epic 按原样传递给 applyMiddleware
,而不是将其作为参数传递给 createEpicMiddleware
applyMiddleware(createEpicMiddleware(fetchCategoriesEpic))
应该可以解决!
根据我的说法,如果您使用的是纱线,那么要添加一个包,您必须使用 yarn add your-package-name
而您所做的是 yarn install redux-observable
请将其更改为 yarn add redux-observable
什么时候用yarn install
?当您已经在 package.json
和 运行 中定义了您的包名称时使用 yarn install
只是 yarn install
使其工作并在几秒钟内安装所有包。
干杯 :)
我正在尝试使用 redux-observable 做一个小的 POC,所以请耐心等待,我所有的代码都在一个文件中 (index.js)
我收到此错误:
action$.ofType is not a function
在下面标记的代码行:
index.js
//@flow
import { createStore, applyMiddleware } from 'redux'
import { combineReducers } from 'redux-immutable'
import { Provider } from 'react-redux'
import Vepo from './components/vepo/Vepo'
import keywords from './components/keywords/keywords.reducer'
import categories from './components/categories/categories.reducer'
import initialState from './config/config'
import { composeWithDevTools } from 'remote-redux-devtools'
import React from 'react'
import devToolsEnhancer from 'remote-redux-devtools'
import Rx from 'rxjs/Rx'
import { ajax } from 'rxjs/observable/dom/ajax'
import { createEpicMiddleware } from 'redux-observable'
import { } from 'redux-observable'
const FETCH_CATEGORIES = 'FETCH_CATEGORIES'
const FETCH_CATEGORIES_FULFILLED = 'FETCH_CATEGORIES_FULFILLED'
// action creators
const fetchCategories = Categories => ({ type: FETCH_CATEGORIES, payload: Categories });
const fetchCategoriesFulfilled = payload => ({ type: FETCH_CATEGORIES_FULFILLED, payload });
// epic
const fetchCategoriesEpic = action$ =>
action$.ofType(FETCH_CATEGORIES)<=======================THIS LINE
.mergeMap(() =>
ajax.getJSON(`https://localhost:4000/categories`)
.map(response => fetchCategoriesFulfilled(response))
);
const categories1 = (state = {}, action) => {
switch (action.type) {
case FETCH_CATEGORIES_FULFILLED:
return [action.payload.login]
default:
return state;
}
};
const reducer = combineReducers(
{
searchForm: combineReducers(
{
keywords,
categories
})
}
)
const store = createStore(
reducer,
initialState,
applyMiddleware(fetchCategoriesEpic)
//composeWithDevTools(createEpicMiddleware(fetchCategoriesEpic))
)
const App = () => (
<Provider store={store}>
<Vepo />
</Provider>
)
export default App
这个错误听起来好像我没有正确导入 redux-observable。我使用 webpack 2。我已经完成了 yarn add redux-observable
,这是所有需要的,然后我可以只做 import xxx
但我在上面的代码中正确导入了吗?我不确定如何导入 redux-observable。我在文档中看不到它正在完成。
package.json
{
"name": "vepo",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node node_modules/react-native/local-cli/cli.js start",
"test": "jest"
},
"rnpm": {
"assets": [
"./app/fonts"
]
},
"jest": {
"preset": "react-native",
"moduleNameMapper": {
"\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js",
"\.(css|less)$": "<rootDir>/__mocks__/styleMock.js"
}
},
"dependencies": {
"flow-typed": "^2.0.0",
"immutable": "^3.8.1",
"native-base": "^2.1.0",
"react": "16.0.0-alpha.6",
"react-native": "^0.43.3",
"react-native-multiple-choice": "^0.0.8",
"react-native-select-multiple": "^1.0.3",
"react-native-vector-icons": "^4.0.0",
"react-redux": "^5.0.3",
"redux": "^3.6.0",
"redux-immutable": "^4.0.0",
"redux-observable": "^0.14.1",
"reselect": "^3.0.0",
"rxjs": "^5.2.0",
"yoga": "^0.0.0"
},
"devDependencies": {
"babel-eslint": "^7.1.1",
"babel-jest": "19.0.0",
"babel-preset-react-native": "1.9.1",
"eslint": "^3.17.0",
"eslint-plugin-flowtype": "^2.30.3",
"eslint-plugin-jsx": "^0.0.2",
"eslint-plugin-react": "^6.10.0",
"eslint-plugin-react-native": "^2.3.1",
"flow-bin": "^0.42.0",
"jest": "19.0.2",
"jest-cli": "^19.0.2",
"react-test-renderer": "~15.4.1",
"redux-devtools": "^3.3.2",
"remote-redux-devtools": "^0.5.7"
}
}
I am unsure how to import redux-observable. I cannot see it being done in the docs.
设置 redux-observable 在文档中有描述:https://redux-observable.js.org/docs/basics/SettingUpTheMiddleware.html但是看起来你确实看到了,因为你正在导入它。
您的设置方式几乎是正确的,事实上您已经注释掉了正确设置的代码。
applyMiddleware(fetchCategoriesEpic)
//composeWithDevTools(createEpicMiddleware(fetchCategoriesEpic))
您不小心将 Epic 按原样传递给 applyMiddleware
,而不是将其作为参数传递给 createEpicMiddleware
applyMiddleware(createEpicMiddleware(fetchCategoriesEpic))
应该可以解决!
根据我的说法,如果您使用的是纱线,那么要添加一个包,您必须使用 yarn add your-package-name
而您所做的是 yarn install redux-observable
请将其更改为 yarn add redux-observable
什么时候用yarn install
?当您已经在 package.json
和 运行 中定义了您的包名称时使用 yarn install
只是 yarn install
使其工作并在几秒钟内安装所有包。
干杯 :)