【问题标题】:Update a specific property in each object in redux state在 redux 状态下更新每个对象中的特定属性
【发布时间】:2020-02-04 06:20:41
【问题描述】:

我想在 redux 状态下更新每个对象的特定属性,并假设我有这种主要状态

networkFailure: true
employer: {
  signUp: {
    data: null
    error: null
    loading: true
  }
}
user: {
  signUp: {
    data: null
    error: null
    loading: false
  }
}

假设我遇到了网络故障,那么 networkFailure 状态变为 true ,我需要加载 signUp employer 的状态以及所有加载状态到其他对象的 false

这可以在一个减速器中完成吗?或以更好的方式做的任何建议? 我为雇主、用户和网络设置了 3 个减速器功能

【问题讨论】:

    标签: reactjs redux reducers


    【解决方案1】:

    我认为有两种方法: 1. 使用 redux-thunk 并调度一个动作,然后在动作函数中调度 3 个动作,这些动作返回调度函数给你。像这样:

    function setErrorAction() {
      return dispatch => {
          const networkError = {type: "network/singup/error"}
          const employer Error = {type: "employer/singup/error"}
          const userError = {type: "user/singup/error"}
    
          dispatch(networkError)
          dispatch(employer)
          dispatch(userError)
      }
    }
    
    1. 编写一个钩子函数,它可以访问调度函数,该函数暴露函数来调度动作,当你调用钩子函数时,它会将动作调度给reducer,但这是一种集中业务的方式。像这样:
    import {useDispatch} from "react-redux";
    
    function useAuthError() {
       const dispatch = useDispatch();
    
       function setError() {
          const networkError = {type: "network/singup/error"}
          const employer Error = {type: "employer/singup/error"}
          const userError = {type: "user/singup/error"}
    
          dispatch(networkError)
          dispatch(employer)
          dispatch(userError)
       };
    
       return {
          setError
       }
    }
    

    【讨论】:

    • 这是一个很好的解决方案,但是调度多个动作对于这种事情并不好,假设我还有 10 个状态然后我必须调度 10 个动作
    • 你说得对,但是redux不能一个动作更新多个reducer,要知道redux没有这个功能。
    【解决方案2】:

    here找到一个答案

    其实当网络故障发生时,对我来说重置应用状态就可以了,

    所以我已经在根 reducer 中重置了应用程序状态

    const rootReducer = (state, action) => {
      if (action.type === 'NETWORK_ERROR') {
        state = undefined
      }
      return appReducer(state, action)
    }
    

    这会将其他减速器的状态保持为默认状态

    【讨论】:

      猜你喜欢
      • 2019-12-07
      • 2018-07-01
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 2021-05-28
      • 2021-06-26
      • 1970-01-01
      • 2018-05-26
      相关资源
      最近更新 更多