首先,我想提一下,我改变两种方法之间唯一的事情是setState vs通过Redux商店。不改变任何东西,即组件等setState的作品,但还原商店更新不
如果我使用setState的方法,我可以关闭我的模式,但如果我通过商店,它不会关闭。任何想法为什么?
这里是我的减速器:
import 'babel-polyfill';
import * as types from '../actions/actionTypes';
const initialState = {
modals: {
"modal1": { isDisplayed: true },
"modal2": { isDisplayed: false }
}
};
export default (state = initialState, action) => {
switch (action.type) {
case types.SET_IS_DISPLAYED_MODAL :
return Object.assign({}, state, {
modals: action.modals
})
default: return state
}
}
}
这里是我的onClick行动的两个版本是应该关闭模式。
这是的setState版本,它的工作原理:
displayModal(modalId, value)
{
let modals = this.props.modals;
modals[modalId].isDisplayed = value;
return setState({modals: modals});
}
而这里通过了Redux店里发生的版本,它不关我的情态。
displayModal(modalId, value)
{
let modals = this.props.modals;
modals[modalId].isDisplayed = value;
return this.props.actions.displayModal(modals);
}
没有太多的动作,但在这里它是:
export const displayModal = (modals) => {
return {
type: types.SET_IS_DISPLAYED_MODAL,
modals
};
}
只要你看看它的样子在我的部分,那就是:
render() {
return(
<div>
<div>Some info...</div>
{this.props.modals["modal1"].isDisplayed
? <Modal1 />
: null}
{this.props.modals["modal2"].isDisplayed
? <Modal2 />
: null}
</div>
);
}
BTW,我知道我正在打击行动和减速器。我也知道,如果我在我的mapStateToProps中放置了一个调试器,我正在为它更新状态。所以我知道行动和减速器都在做他们应该做的事情。
更新: 我只是试了一些东西,这解决了这个问题。我最后一行添加到mapStateToProps并在我的组件更新部分:
function mapStateToProps(state) {
return {
modals: state.modals,
isModal1Displayed: state.modals["modal1"].isDisplayed // Just added this line
}
}
,并改变了代码,在我的组件:
render() {
return(
<div>
<div>Some info...</div>
{this.props.isModal1Displayed
? <Modal1 />
: null}
</div>
);
}
您可以在连接组件的位置添加代码的一部分吗? – diedu
只需更新原始帖子即可。我没有检查this.props.modals [“modal1”]。isDisplayed,而是在mapStateToProps中为它创建了一个新的道具。我认为它在mapStateToProps中看起来有点时髦,但它工作正常。任何想法为什么最初的代码失败? – Sam