【发布时间】:2017-02-05 18:30:55
【问题描述】:
我无法更新我的 redux 存储,正如我在 chrome 中的 redux 工具中看到的那样,动作被调度,但是它返回一个新的处理程序对象,其中反映了更改但主存储没有更改,作为结果组件没有获得更新的值。 下面是我的代码的 sn-p。
为chrome附加redux js工具
实际商店
export default function () {
return{
flowType : 'IAU',
customerId : 'fasfa',
actNumber : 'asfas'
};
}
合并所有减速器
import DataReducer from './DataReducer';
import Handler from './ReducerHandler'
const allReducers =Redux.combineReducers({
appdata : DataReducer,
handler : Handler
});
export default allReducers;
使用渲染表单。
import {setFlowType,setUserId,setServiceNumber} from './actions/Index';
let {createStore} = Redux
let {connect, Provider} = ReactRedux
const store = createStore(allReducers, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__());
........
........
`ReactDOM.render(<Provider store={store}><UserInputForm/></Provider>,document.getElementById('UserInput'));`
减速器
var initialState = {
customerId : 'blablabla',
actNumber : 'blabla'
};
export default function(data=initialState,action) {
switch(action.type) {
case 'ACCOUNT_NUMBER_CHANGED':
return Object.assign({},data,{actNumber : action.actNumber});
case 'USERID_CHANGED':
return Object.assign({},data,{customerId : action.customerId});
}
}
用户输入表单
var UserInputForm = React.createClass({
render: function(){
return (
<div className="container-fluid">
<div className="row">
<div className="col-sm-3"></div>
<div className="col-sm-8">
<div className="row">
<div className="form-group">
<div className="col-sm-4">
<label htmlFor="UserId" >User Id</label>
</div>
<div className="col-sm-8">
<input type="text" id="UserId" className="form-control" defaultValue={this.props.storeData.customerId} onChange={(event) => this.props.setUserId(event)}></input>
</div>
</div>
</div>
<div className="row">
<div className="form-group">
<div className="col-sm-4">
<label htmlFor='ServiceNumber'>serviceNumber</label>
</div>
<div className="col-sm-8">
<input type="text" id="ServiceNumber" className="form-control" defaultValue={this.props.storeData.actNumber} onChange={(event) => this.props.setServiceNumber(event)}></input>
</div>
</div>
</div>
<div className="col-sm-1"></div>
</div>
</div>
</div>
);
}
});
function matchDispatchToProps(dispatch){
return bindActionCreators( {setUserId :setUserId , setServiceNumber:setServiceNumber}, dispatch);
}
export default connect(mapStateToProps,matchDispatchToProps)(UserInputForm);
动作创作者
export const setUserId = function (event) {
return{
type : types.USERID_CHANGED,
customerId : event.target.value
}
}
export const setServiceNumber = function (event) {
return{
type : types.ACCOUNT_NUMBER_CHANGED,
actNumber : event.target.value
}
}
【问题讨论】:
-
如果主存储没有改变,那么减速器就没有被正确调用。
-
reducer 函数名称是什么?你没有。
-
我有一个单独的reducer文件,默认导出。
-
啊哈,所以您在该文件中只有一个减速器,这是默认设置,您稍后在导入时将其命名为 DataReducer
import DataReducer from './DataReducer';?