redux 不更新 reducer 后的视图
Redux does not update the view after the reducer
已解决:字段表单中的默认值与我想象的不同。
我不知道我在做什么[化学狗图片在这里]。
我的组件称为 loadForm 并通过 thunk 操作从 API 调用加载数据:
class loadForm extends Component {
constructor(props) {
super(props);
}
/* Loads data to the form */
componentDidMount() {
let action = getAppoThunk(this.props.routeParams.id);
this.props.dispatch(action);
console.log('DidMount appoArray>>'+ JSON.stringify(this.props.appo));
}
componentWillReceiveProps(nextProps) {
if (Object.keys(nextProps.appoArrayProp).length != Object.keys(this.props.appoArrayProp).length ) {
console.log('WWWW NOT THE SAME nextProps >>'+ JSON.stringify(nextProps.appo));
console.log('WWWW NOT THE SAME thisProps >>' + JSON.stringify(this.props.appo));
let action = getAppoThunk(this.props.routeParams.id);
this.props.dispatch(action); // thunk middleware dispatch
} else {
console.log('ARE THE SAME this.props.appo>>' + JSON.stringify(this.props.appo));
}
}
渲染:
return(
<form onSubmit={this.handleSubmit}>
<label htmlFor="for_owner">Eingentümer (owner):</label>
<input name="owner" defaultValue={this.props.appo.owner} />
</form>
);
this.props.appo 实际上已更新但视图未更改:
更新
非常感谢大家的帮助,从一开始我的 reducer 就是:
case RECEIVE_ONE_APPO
Object.assign({}, state, {
appArrayPop: action.appArrayPop
});
为了降低复杂性,我删除了数组选项,用一个简单的字符串替换它,而且,我删除了所有其他的 reducer,所以我的 reducer 现在只是:
const initialState = {
eigentumer: 'initial' // owner
};
const appo_rdcer = (state = initialState, action) => {
switch (action.type){
case RECEIVE_ONE_APPO:
return Object.assign({}, state, {
eigentumer: action.eigentumer
});
然后我注意到一些奇怪的事情:
return (
<div id="responsive" className="modal hide fade" tabIndex="-1" >
<Modal aria-labelledby='modal-label'
style={modalStyle}
backdropStyle={backdropStyle}
show={this.state.showModal}
>
<Modal.Header>
<Modal.Title>Modal Überschrift 1 --> {this.props.eigentumer} </Modal.Title>
</Modal.Header>
<Modal.Body>
<form onSubmit={this.handleSubmit}>
<label htmlFor="for_owner">Eigentümer: 2 --> {this.props.eigentumer} </label>
<input className="form-control" id="for_owner" name="owner" defaultValue={this.props.eigentumer} />
</form>
</Modal.Body>
<Modal.Footer>
<Button onClick={() => browserHistory.push('/appointments')}>Close</Button>
<Button bsStyle="primary">Änderungen speichern</Button>
</Modal.Footer>
</Modal>
</div>
);
结果:
因此,{this.props.eigentumer} 在位置 1 和 2 中更新,但在
defaultValue={this.props.eigentumer} 这就是视图未更新的原因。现在我需要 read this 知道为什么会这样。
非常感谢您的帮助。
如何改变appoArrayProp
?如果您正在处理同一个对象,并且只是删除或添加键,nextProps
和 this.props
指向同一个对象,并且它们将始终相等。是的,它不直观,但就是这样。
假设您有对象 appoArrayProp
:
appoArrayProp = {
"foo": 1,
"bar": 2
}
如果您通过简单地添加或删除 属性 来更改它,nextProps.appoArrayProp
和 this.props.appoArrayProp
将指向同一个对象:
appoArrayProp = {
"foo": 1,
"bar": 2,
"newProp": 3
}
和 Object.keys().length 比较总是 return 为真。解决方案是创建一个新对象,复制当前 appoArrayProp 的属性,在新对象中添加或删除键,然后将其作为 属性:
传递
appoArrayProp = Object.assign({}, appoArrayProp)
/* Do changes to appoArrayProp and render component */
已解决:字段表单中的默认值与我想象的不同。
我不知道我在做什么[化学狗图片在这里]。
我的组件称为 loadForm 并通过 thunk 操作从 API 调用加载数据:
class loadForm extends Component {
constructor(props) {
super(props);
}
/* Loads data to the form */
componentDidMount() {
let action = getAppoThunk(this.props.routeParams.id);
this.props.dispatch(action);
console.log('DidMount appoArray>>'+ JSON.stringify(this.props.appo));
}
componentWillReceiveProps(nextProps) {
if (Object.keys(nextProps.appoArrayProp).length != Object.keys(this.props.appoArrayProp).length ) {
console.log('WWWW NOT THE SAME nextProps >>'+ JSON.stringify(nextProps.appo));
console.log('WWWW NOT THE SAME thisProps >>' + JSON.stringify(this.props.appo));
let action = getAppoThunk(this.props.routeParams.id);
this.props.dispatch(action); // thunk middleware dispatch
} else {
console.log('ARE THE SAME this.props.appo>>' + JSON.stringify(this.props.appo));
}
}
渲染:
return(
<form onSubmit={this.handleSubmit}>
<label htmlFor="for_owner">Eingentümer (owner):</label>
<input name="owner" defaultValue={this.props.appo.owner} />
</form>
);
this.props.appo 实际上已更新但视图未更改:
更新
非常感谢大家的帮助,从一开始我的 reducer 就是:
case RECEIVE_ONE_APPO
Object.assign({}, state, {
appArrayPop: action.appArrayPop
});
为了降低复杂性,我删除了数组选项,用一个简单的字符串替换它,而且,我删除了所有其他的 reducer,所以我的 reducer 现在只是:
const initialState = {
eigentumer: 'initial' // owner
};
const appo_rdcer = (state = initialState, action) => {
switch (action.type){
case RECEIVE_ONE_APPO:
return Object.assign({}, state, {
eigentumer: action.eigentumer
});
然后我注意到一些奇怪的事情:
return (
<div id="responsive" className="modal hide fade" tabIndex="-1" >
<Modal aria-labelledby='modal-label'
style={modalStyle}
backdropStyle={backdropStyle}
show={this.state.showModal}
>
<Modal.Header>
<Modal.Title>Modal Überschrift 1 --> {this.props.eigentumer} </Modal.Title>
</Modal.Header>
<Modal.Body>
<form onSubmit={this.handleSubmit}>
<label htmlFor="for_owner">Eigentümer: 2 --> {this.props.eigentumer} </label>
<input className="form-control" id="for_owner" name="owner" defaultValue={this.props.eigentumer} />
</form>
</Modal.Body>
<Modal.Footer>
<Button onClick={() => browserHistory.push('/appointments')}>Close</Button>
<Button bsStyle="primary">Änderungen speichern</Button>
</Modal.Footer>
</Modal>
</div>
);
结果:
因此,{this.props.eigentumer} 在位置 1 和 2 中更新,但在 defaultValue={this.props.eigentumer} 这就是视图未更新的原因。现在我需要 read this 知道为什么会这样。
非常感谢您的帮助。
如何改变appoArrayProp
?如果您正在处理同一个对象,并且只是删除或添加键,nextProps
和 this.props
指向同一个对象,并且它们将始终相等。是的,它不直观,但就是这样。
假设您有对象 appoArrayProp
:
appoArrayProp = {
"foo": 1,
"bar": 2
}
如果您通过简单地添加或删除 属性 来更改它,nextProps.appoArrayProp
和 this.props.appoArrayProp
将指向同一个对象:
appoArrayProp = {
"foo": 1,
"bar": 2,
"newProp": 3
}
和 Object.keys().length 比较总是 return 为真。解决方案是创建一个新对象,复制当前 appoArrayProp 的属性,在新对象中添加或删除键,然后将其作为 属性:
传递appoArrayProp = Object.assign({}, appoArrayProp)
/* Do changes to appoArrayProp and render component */