【问题标题】:React-redux cross access state valueReact-redux 跨访问状态值
【发布时间】:2016-01-02 02:35:10
【问题描述】:

在过去的两周里,我一直在使用 redux,但我遇到了一个问题,我想访问/更改另一个 reducer 的状态值。我怎样才能做到这一点?

例如:我有两个组件 'A-Component' 和 'Message-component' 其中有 'A-actions'、'Message-actions' 和 'A-reducer'、'Message-reducer分别为strong>'

当调用 'A-Component' 的动作时,它将调用相应的 reducer 函数,我需要更新 Message-reducer 状态值,该值将显示消息框

A 动作

导出函数添加(数据){ 返回 { 类型:[types.ONADD,types.ONADDSUCCESS,types.ONADDFAIL], 有效载荷:{ 响应:api.add(data).then(response => response), 数据 } }; }

A-减速器

导出默认 createReducer(initialState, { [types.ONADD](状态){ 返回 { ...状态, 消息:'更新记录' }; } });

上面提到的消息状态值是消息reducer的状态值。我想从 A-reducer 更新消息状态值 进而更新消息组件。这在 redux 中可行吗?

我尝试了各种中间件,但都失败了。

提前致谢!

【问题讨论】:

    标签: reactjs redux redux-framework


    【解决方案1】:

    如果您在 Message-actions 中已有更新操作

    我认为您可以在触发 ONADDSUCCESS 时直接调度更新操作。

    // Message action
    export function MessageUpdate (data) {
      return {
        type: ...,
        data,
      }
    }
    // A action
    export function add(data) {
      return dispatch => {
        dispatch({
          type: types.ONADD
        });
    
        // code for your add event
        api.add(data).then( response => {
          (() => {
            dispatch(MessageUpdate(response));
            return dispatch({
              type: types.ONADDSUCCESS,
            })
          })()
        });
      }
    }
    

    希望这个回答能回答您的问题。

    【讨论】:

      【解决方案2】:

      我认为您以错误的方式处理此问题。您应该尽可能地规范化您的数据,然后可能使用连接装饰器来组成您的 UI 所需的状态。例如,消息可以嵌套在“朋友”的节点下,但最好将它们放在自己的存储中,然后创建一个函数,根据关系从朋友那里选择消息。这为您免费提供聚合(您有 3 条未读消息)。看看reselect,以一种很好的(和缓存的)方式做到这一点。

      编辑:

      您可以编写调度多个操作的中间件:

      export default (store) => (next) => (action) => {
         if(!action.types){
           return next(action);
         }
      
         action.types.forEach(type => {
           next({
             type,
             payload: action.payload
           })
         });
      }
      

      然后像这样从 Action Creator 调用它:

      export function addMessage(message){
        return {
          types: ['ADD_MESSAGE', 'UPDATE_USER'],
          payload: message
        }
      }
      

      【讨论】:

      • 我没有尝试从我的 A 组件访问消息状态值,我只需要更新我的 A-reducer 中的消息状态值,并且消息组件是单个组件
      • 我已经为我的异步调用执行此操作,但我的情况是,当我从任何减速器传递消息状态值时,我的消息减速器应该得到更新,或者我需要调用消息操作显示消息函数
      • 我想我错过了你的意思......你能展示一些(伪)代码来说明你面临的问题吗?
      • 我创建了一个中间件,它在触发操作成功时触发操作link
      猜你喜欢
      • 2020-10-26
      • 2020-06-17
      • 2021-11-07
      • 2017-04-02
      • 1970-01-01
      • 2020-11-05
      • 2021-03-08
      • 2016-11-14
      • 2020-10-07
      相关资源
      最近更新 更多