我总是使用react-redux connect
来配置道具,但我需要使用react Component
来使用生命周期方法。我注意到我从商店抓到的道具似乎是静态的,并且随着商店的更新而不会更新。
代码:
class AlertModal extends Component {
title
isOpen
message
componentDidMount() {
const { store } = this.context
const state = store.getState()
console.log('state', state)
console.log('store', store)
this.unsubscribe = store.subscribe(() => this.forceUpdate())
this.title = state.get('alertModal').get('alertModalTitle')
this.isOpen = state.get('alertModal').get('isAlertModalOpen')
this.message = state.get('alertModal').get('alertModalMessage')
this.forceUpdate()
}
componentWillUnmount() {
this.unsubscribe()
}
updateAlertModalMessage(message) {
this.context.store.dispatch(updateAlertModalMessage(message))
}
updateAlertModalTitle(title) {
this.context.store.dispatch(updateAlertModalTitle(title))
}
updateAlertModalIsOpen(isOpen) {
this.context.store.dispatch(updateAlertModalIsOpen(isOpen))
}
render() {
console.log('AlertModal rendered')
console.log('AlertModal open', this.isOpen) <======= stays true when in store it is false
return (
<View
如何设置title
,isOpen
和message
,以便它们始终反映商店的价值?
答案 0 :(得分:8)
它应该是这样的。在您的确认组件中:
const mapStateToProps = (state) => {
return { modalActive: state.confirmation.modalActive };
}
export default connect(mapStateToProps)(Confirmation);
在reducer索引文件中,应该是这样的:
const rootReducer = combineReducers({
confirmation: ConfirmationReducer
});
我相信你在这里有自己的称为ConfirmationReducer的reducer文件。它应该是这样的。
import { ON_CONFIRM } from '../actions';
const INITIAL_STATE = {modalActive: true};
export default function(state = INITIAL_STATE, action) {
console.log(action);
switch (action.type) {
case ON_CONFIRM:
return { ...state, modalActive: action.payload };
}
return state;
}
确保编写自己的动作创建者,以创建具有上述类型和布尔类型相关有效负载的动作。
最后,您应该可以从Confirmation组件中的商店访问该属性,如下所示:
{this.props.modalActive}
您尚未发布完整代码,因此很难为确切方案提供解决方案。希望这可以帮助。快乐的编码!
答案 1 :(得分:2)
对我来说问题是我将this.props.myObject分配给一个没有深度克隆的变量,所以我用
修复了它let prev = Object.assign({}, this.props.searchData)
我在做什么
let prev = this.props.searchData
所以我打扰了整个页面。在我看来安静的菜鸟。
答案 2 :(得分:1)
这可能对您有帮助
componentWillReceiveProps(nextProps) {
console.log();
this.setState({searchData : nextProps.searchData})
}