Mat*_*att 18 javascript reactjs redux
我尝试了简单的react,redux,ajax工作示例并遵循Reddit API教程,但我无法创建存储并获取错误:
Uncaught Error: Expected the reducer to be a function.
Run Code Online (Sandbox Code Playgroud)
index.jsx
...
import { createStore, applyMiddleware } from 'redux'
var thunkMiddleware = require('redux-thunk');
var createLogger = require('redux-logger');
var rootReducer = require('./reducers.js');
const loggerMiddleware = createLogger();
function configureStore(initialState) {
return createStore(
rootReducer,
initialState,
applyMiddleware(
thunkMiddleware,
loggerMiddleware
)
)
}
const store = configureStore();
Run Code Online (Sandbox Code Playgroud)
...
rootReducer.js
import { combineReducers } from 'redux';
function products(state = {
isFetching: false,
didInvalidate: false,
items: []
}, action) {
switch (action.type) {
case 'REQUEST_PRODUCTS':
return Object.assign({}, state, {
isFetching: true,
didInvalidate: false
})
case 'RECEIVE_PRODUCTS':
return Object.assign({}, state, {
isFetching: false,
didInvalidate: false,
items: action.posts,
lastUpdated: action.receivedAt
})
default:
return state
}
}
function specialPosts(state = { }, action) {
switch (action.type) {
case RECEIVE_SPECPOSTS:
case REQUEST_SPECPOSTS:
return Object.assign({}, state, {
req: true
})
default:
return state
}
}
const rootReducer = combineReducers({
products,
specialPosts
});
export default rootReducer;
Run Code Online (Sandbox Code Playgroud)
rootReducer的类型是对象,但为什么呢?我应该改变createStore
功能rootReducer.default
吗?
return createStore(
rootReducer.default,
initialState,
applyMiddleware(
thunkMiddleware,
loggerMiddleware
)
)
Run Code Online (Sandbox Code Playgroud)
的package.json
"redux-logger": "^2.6.1",
"react-redux": "^4.4.1",
"react-redux-provide": "^5.2.3",
"redux": "^3.3.1",
"redux-thunk": "^2.0.1",
Run Code Online (Sandbox Code Playgroud)
const rootReducer = combineReducers({
products,
specialPosts
});
const store = createStore( rootReducer, applyMiddleware( thunkMiddleware ));
Run Code Online (Sandbox Code Playgroud)
然后根据各个化简函数返回的初始状态自动创建初始状态。这些单独的状态可以通过state.products
和访问state.specialPosts
问题是由于rootReducer被"require"导入(ES5):
var rootReducer = require('./reducers.js');
Run Code Online (Sandbox Code Playgroud)
如果您通过ES6方法导入它,它将正确地将rootReducer.js的默认值自动保存到rootReducer中:
import rootReducer from './reducers';
Run Code Online (Sandbox Code Playgroud)
我看到你在那个文件中混合了ES5(require)和ES6(import)......我也在混合我的项目,这就是我遇到这个问题的原因.更多信息可以在这里找到:https://medium.com/@kentcdodds/misunderstanding-es6-modules-upgrading-babel-tears-and-a-solution-ad2d5ab93ce0#.2x2p2dx3m
创建 store 时,第一个参数必须是函数,这意味着 reduce( ()=>[]
) 参数
错误:
import {createStore,applyMiddleware} from 'redux';
export default function configureStore(initialState) {
return createStore(
[],
{},
applyMiddleware()
);
}
Run Code Online (Sandbox Code Playgroud)
解决方案:
import {createStore,applyMiddleware} from 'redux';
export default function configureStore(initialState) {
return createStore(
()=>[],
{},
applyMiddleware()
);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
34893 次 |
最近记录: |