У меня есть интерфейс с двумя командами кнопок (функции и цели).Когда я нажимаю на кнопку, я хочу, чтобы одна команда перешла к другой команде.Я реализую это с реакцией и избыточностью.Моя единственная проблема заключается в том, что когда состояние обновляется, и я успешно сохраняю в журнале обновленное состояние, компонент не будет работать, если я не использую forceUpdate ().Что я не понимаю, так это то, что, поскольку состояние обновляется успешно, не должен ли компонент автоматически перерисовываться?
Some.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 не выполняет повторную визуализацию, а команда кнопок остается неизменной, даже если в initialState в редукторе изменились и, следовательно, реквизиты.Некоторые компоненты также изменились.Я хочу понять, почему это происходит.
введите описание изображения здесь