新的反应和减少,所以玩一些非常简单的代码,看看它是如何工作的.当我尝试将combineReducers方法传递给redux存储时,我得到一个错误.如果我删除combinedReducers并将reducer直接传递到商店,一切正常.
let store = createStore(rootReducer);
Run Code Online (Sandbox Code Playgroud)
错误
未捕获错误:对象无效作为React子对象(找到:具有键{reducer}的对象).如果您要渲染子集合,请使用数组,或使用React附加组件中的createFragment(object)包装对象.检查App的渲染方法.
使用combineReducers时为什么会出错?如果我想添加更多减速器怎么办?我认为这是什么结合了减速器?
main.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { createStore, combineReducers } from 'redux';
import App from './components/app';
let reducer = (state=0, action) => {
switch (action.type) {
case 'INCREASE':
return state+1
case 'DECREASE':
return state-1
default: return state
}
}
const rootReducer = combineReducers({
reducer:reducer
});
let store = createStore(rootReducer);
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>
, document.querySelector('.container'));
Run Code Online (Sandbox Code Playgroud)
//app.js
import React, { Component } from 'react';
import {connect} from 'react-redux';
class App extends Component {
render() {
let {number, increase, decrease} = this.props
return(
<div>
<div>{number}</div>
<button onClick={e=>increase()}>+</button>
<button onClick={e=>decrease()}> - </button>
</div>
);
}
}
let mapStateToProps = state => ({
number: state
})
let mapDispatchToProps = dispatch => ({
increase: () => dispatch({type: 'INCREASE'}),
decrease: () => dispatch({type: 'DECREASE'})
});
export default connect(mapStateToProps, mapDispatchToProps)(App);
Run Code Online (Sandbox Code Playgroud)
Chr*_*ies 12
组合reducers采用reducers的哈希并返回reducer.生成的reducer表示与hash相同形状的对象.
所以,这样的电话:
combineReducers({ name: nameReducer})
Run Code Online (Sandbox Code Playgroud)
会产生一个看起来像这样的状态对象:
{ name: 'Joe Shmo' }
Run Code Online (Sandbox Code Playgroud)
在您的示例中,您将生成一个如下所示的全局状态树:
{ reducer: 0 }
Run Code Online (Sandbox Code Playgroud)
但是你试图number
在你的房子里拉出一个叫做这个的房产mapStateToProps
.
如果您将reducer声明更改为如下所示:
const number = (state=0, action) => {
switch (action.type) {
case 'INCREASE':
return state+1
case 'DECREASE':
return state-1
default: return state
}
}
const rootReducer = combineReducers({
number
});
Run Code Online (Sandbox Code Playgroud)
然后改变你mapStateToProps
的样子:
const mapStateToProps = ({number}) => ({number});
Run Code Online (Sandbox Code Playgroud)
你的代码应该开始工作了.
https://redux.js.org/docs/basics/Reducers.html
import { combineReducers } from 'redux'
const todoApp = combineReducers({
visibilityFilter,
todos
})
export default todoApp
Run Code Online (Sandbox Code Playgroud)
请注意,这等效于:
export default function todoApp(state = {}, action) {
return {
visibilityFilter: visibilityFilter(state.visibilityFilter, action),
todos: todos(state.todos, action)
}
}
Run Code Online (Sandbox Code Playgroud)
你也可以给他们不同的键,或者以不同的方式调用函数。这两种编写组合减速器的方法是等效的:
const reducer = combineReducers({
a: doSomethingWithA,
b: processB,
c: c
})
function reducer(state = {}, action) {
return {
a: doSomethingWithA(state.a, action),
b: processB(state.b, action),
c: c(state.c, action)
}
}
Run Code Online (Sandbox Code Playgroud)
并且不要忘记连接每个部分
@connect(state => ({
reducerName: state[partStoreName]
}))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14621 次 |
最近记录: |