我目前有一个reducer,它执行状态的深层复制,并使用更新后的值返回它。
function countableItems(state = initialState, action) {
switch (action.type) {
case types.ADD_TO_SUM:
let denomMap = findDenomination(state.denomGroups, action),
nestedCopy = Immutable.fromJS(state);
return nestedCopy.setIn(['denomGroups', denomMap.group, denomMap.key, denomMap.index, 'sum'], parseFloat(action.value)).toJS();
default:
return state;
}
}
在我的显示组件的渲染功能中,我在this.props.denoms
中看到了正确的更新值。render()
函数构建了子<DenomInput>
组件,当我设置断点时,我看到了正确的数据传递
render() {
let denomGroups = this.props.denoms.map((denom, i) => {
return (
Object.keys(denom).map((key) => {
let denoms = denom[key].map((item, i) => {
return <DenomInput denom={item} onDenomChange={this.onDenomChange} key={i}></DenomInput>
});
return (<div className="col"><h2>{key}</h2>{denoms}</div>)
})
);
});
return (
<div className="countable-item-wrapper">
<div className="row">
{denomGroups}
</div>
</div>
);
}
然而,当<DenomInput>
组件呈现时,它呈现的值与最初设置的值相同
import React, { Component } from 'react';
import PropTypes from 'prop-types';
class DenomInput extends Component {
constructor(props) {
super(props);
this.state = { denom: props.denom }
this.handleKeyUp = this.handleKeyUp.bind(this);
}
handleKeyUp = (e) => {
this.props.onDenomChange(e.target.value, this.state.denom.name);
}
render() {
return (
<div className="input-group denom">
<span className="input-group-addon">{this.state.denom.label}</span>
<input
type="text"
className="form-control"
onChange={this.handleKeyUp}
value={this.state.denom.sum} />
<span className="input-group-addon">{this.state.denom.count | 0}</span>
</div>
);
}
}
DenomInput.PropTypes = {
denom: PropTypes.object.isRequired,
onDenomChange: PropTypes.function
}
export default DenomInput;
我错过了使用React和Redux更新视图的哪些内容?
答案 0 :(得分:3)
可能componentWillReceiveProps可以做到这一点。每当从父级接收新数据时,它将更新组件的状态,并再次调用render
函数。
尝试
class DenomInput extends Component {
...
componentWillReceiveProps(nextProps) {
this.setState({ denom: nextProps.denom })
}
...
}
答案 1 :(得分:1)
看起来您正在使用商店中的道具播种初始状态。然后从组件状态进行渲染,但永远不会更新组件状态。它们只被设置一次,因为构造函数仅在呈现组件时被调用。要修复,请完全删除此组件状态,然后将其连接到redux存储,或更新组件状态onChange。我建议删除本地状态。我发现保持两个状态同步很容易出错。
constructor(props) {
super(props);
this.state = { denom: props.denom }
this.handleKeyUp = this.handleKeyUp.bind(this);
}
handleKeyUp = (e) => {
this.props.onDenomChange(e.target.value, this.state.denom.name);
this.setState({ denom: /*new state identitcal to change in redux store*/ })
}
edit2:提升状态的一个例子。步骤是:
1.连接其中一个父组件,并使用mapStateToProps函数获取相应的状态片。
2.将道具通过连接的父组件传递给DenomInput
4.在this.denomsChange中,发出适当的动作。目前还不清楚这是什么,因为你没有在帖子中包含你的行动。
class DenomInput extends Component {
...
render() {
return (
<div className="input-group denom">
<span className="input-group-addon">{this.props.denom.label}</span>
<input
type="text"
className="form-control"
onChange={this.handleKeyUp}
value={this.props.denom.sum} />
<span className="input-group-addon">{this.props.denom.count | 0}</span>
</div>
);
}
}
export default DenomInput;