使用redux store

时间:2017-05-20 04:46:38

标签: reactjs react-native redux react-redux

我总是使用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

如何设置titleisOpenmessage,以便它们始终反映商店的价值?

3 个答案:

答案 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})
}