清空 Redux 商店

Clear Redux Store

我有一个网络套接字,它接受一个名为 PushMessage 的对象并将其发送到 React 页面,该页面随后会实时更新。其工作方式是用户搜索他希望显示的 PushMessage,然后将其传入。但是,现在发生的情况是,如果用户搜索第一个 PushMessage,则会显示该 PushMessage,但如果他或然后她搜索另一个 PushMessage,它们都显示了。我只想显示其中的第二个。为了做到这一点,我觉得我需要清除 Redux 存储(return 到它的初始空状态)。但是,我不知道该怎么做。

我的 Reducer 由:

var Redux = require('redux');
var _ = require('lodash');

var pushNotificationDefaultState = {};


var pushMessageReducer = function(state, action) {
    switch(action.type) {
        case 'RECEIVED_PUSH_MESSAGE':
            var obj = JSON.parse(action.PushMessage);
            return _.assign({}, state, obj);
        default:
            if (typeof state === 'undefined') {
                return pushNotificationDefaultState;
            }

            return state;
    }
};

module.exports = Redux.combineReducers({
    pushMessages: pushMessageReducer
});

在我的组件中:

function mapStateToProps(state) {
    return state;
}


var AppContainer = connect(
    mapStateToProps,
    null
)(App);

任何帮助都将不胜感激。提前致谢。

您可以通过多种方式实现这一目标,我将向您展示我将如何实现。让我们立即查看您的状态 - 因为您使用的是联合减速器,所以您正在拆分您的状态:

{
  pushMessages: { pushMessages state in here }
}

所以 combineReducers 是伟大的,当你想把你的应用程序拆分成某种 "substates",认为 redux 在这种情况下仍然是单一商店。现在你只有 pushMessages.

的单个子状态

我会使用该组件并设置一个操作来向它添加一条消息(也许最终会删除一条消息)。我正在使用 immutable.js 因为我碰巧喜欢使用它和 IMO 它使 redux 很好用,因为无论如何状态应该是不可变的(再次,个人意见)。

这是你的减速器:

 var pushMessageReducer = function(state = immutable.Map(), action) {
    if (action && action.type) {
        switch (action.type) {

            case actions. RECEIVED_PUSH_MESSAGE:
                return state.update('messages', immutable.List(),
                    (oldMessages) => oldMessages.push(action.PushMessage)
                );


            default:
                return state;
        }
    }
    return state;
}

因此,它所做的就是像这样设置您的状态:

{
   pushMessages: {
      messages: [ ... all your messages pushed in here] 
   }
}

因为您使用的是 combine reducer,所以您的容器应该订阅它的 pushMessages 子状态,所以在您的组件中您将拥有 this.props.messages 和您的消息数组。 (如果你还没有订阅子状态,它只是 this.props.pushMessages.messages。要显示最后一个项目,你真正需要的是这样的东西(这是使用 lodash,你当然可以在 vanilla js 或任何你想要的东西中做到这一点)

 constructor(props) {
    super(props);
    this.getLastMessage = this.getLastMessage.bind(this);
 }     

  getLastMessage() {
      return _.last(this.props.messages);
  }

  render() {

     return(
         <div>
           Last Message : {this.getLastMessage())
         </div>
     );
  }

所以也许您不希望列表包含所有内容而只显示最后一个(我不确定您要查找的确切业务逻辑是什么)但您可以轻松添加 REMOVE_PUSH_MESSAGE 操作然后从该消息数组中弹出或拼接。 (然后你可以只显示 this.props.message 而没有 _.last)。希望这对您有所帮助!

编辑:

以下是我将如何设置您的容器:

import immutable from 'immutable';
import { connect } from 'react-redux';
import Component from './component';
import * as actionCreators from './action-creators';

function mapStateToProps(state) {
    const normalizedState = state.get('pushMessageReducer', immutable.Map()).toJS();

    return {
        messages: normalizedState.messages
    };
}

function mapDispatchToProps(dispatch, ownProps) {
    return {
        myAction: actionCreators.myAction.bind(null, dispatch)
    };
}


export default function(component = Component) {
    return connect(mapStateToProps, mapDispatchToProps)(component);
}

你会注意到 mapStateToProps 中的 normalizedState,我用它来获取我想在此容器中使用的状态部分,除非你的应用程序只有 1 个智能组件,否则你可能不会做这个。它只是获取我在这个容器中使用的部分状态(来自不可变状态),在你的情况下它是 pushMessages。所以现在在你连接的这个组件中,你的项目应该有 this.props.messages。我还使用 mapDispatchToProps 来绑定我的动作,因为它可以让你在你的动作创建者中调度,这使得异步非常容易。

正确连接组合代码后(我不知道在这里连接动作),您应该在 action.PushMessage 上用新消息触发 RECEIVED_PUSH_MESSAGE 动作创建者。然后连接到你的 mapStateToProps 更新你的组件 this.props.messages,它应该只呈现列表中的最后一项。