【发布时间】:2019-06-29 02:49:48
【问题描述】:
我有一个包含两组按钮(功能和目标)的界面。当我单击一个按钮时,我希望它从一个团队转到另一个团队。我正在使用 react 和 redux 来实现这一点。我唯一的问题是,当状态更新并且我成功控制台记录更新状态时,组件不会,除非我使用 forceUpdate()。我不明白的是,既然状态更新成功,组件不应该自动重新渲染吗?
一些.js
class Some extends React.Component{
constructor(props){
super(props)
this.state = {
selectedFeatures:[],
selectedTargets:[]
}
}
setStateFromProps(){
this.setState({
selectedFeatures: this.props.features,
selectedTargets: this.props.targets,
}, console.log(this.state.selectedFeatures, this.state.selectedTargets))
}
componentDidMount(){
this.setStateFromProps()
}
render(){
const { features, targets} = this.props
const updateLists =(selectedFeature, flag) =>{
let index
if (flag){
index = features.indexOf(selectedFeature)
features.splice(index, 1);
targets.push(selectedFeature)
this.props.addFeature({features, targets})
}else{
index = targets.indexOf(selectedFeature)
targets.splice(index, 1);
features.push(selectedFeature)
this.props.addFeature({targets, features})
}
console.log(this.state.selectedFeatures, this.state.selectedTargets)
}
return (
<div>
{this.state.selectedFeatures.map(feature => {
return <div><button key={feature} onClick={() => updateLists(feature, true)}>{feature}</button> <br /></div>
})}
<br />
{this.state.selectedTargets.map(target => {
return <div><button key={target} onClick={() =>updateLists(target, false)} >{target}</button> <br /></div>
})}
</div>
);
}
}
const mapDispatchToProps =(dispatch) =>{
return {
addFeature: (data) => dispatch(featureAddedToTargets(data)),
}
}
const mapStateToProps= (state)=>{
return { selectedFeature:state.addFeatureReducer.selectedFeature,
features: state.addFeatureReducer.features,
targets: state.addFeatureReducer.targets
};
}
export default connect(mapStateToProps, mapDispatchToProps)(Some);
如您所见,当我点击一个按钮时,我触发了 updateLists 函数,该函数将使计算更改发送到我们唯一的操作,带有更新的功能和目标按钮的新数据,并且该操作将更改状态减速机。
featureAddedToTargets 操作
export const featureAddedToTargets = (data) =>{
return {
type: FEATURE_CHANGED,
data
}
}
addFeatureReducer
const initialState = {
features:['f1','f2','f3','f4','f5'],
targets:['t1','t2']
}
const addFeatureReducer = (state=initialState, action) =>{
switch(action.type){
case FEATURE_CHANGED:
console.log("action: ", action)
return {...state , state, features: action.data.features, targets: action.data.targets};
default:
return state;
}
}
export default combineReducers({ addFeatureReducer })
正如我所说,Some 组件不会重新渲染,并且按钮组保持不变,即使 reducer 中的 initialState 已更改,因此 Some 组件中的 props 也已更改。我想了解为什么会这样。
【问题讨论】: