当Reducer 中的store 发生变化时,useSelector 不会更新。ReactJS Redux

Dan*_*nha 40 javascript ecmascript-6 reactjs react-redux react-hooks

我正在改变减速机的状态。在调试时,我检查了状态是否真的改变了。但是组件没有更新。

成分:

function Cliente(props) {
    const dispatch = useDispatch()
    const cliente = useSelector(({ erpCliente }) => erpCliente.cliente)
    const { form, handleChange, setForm } = useForm(null)

...

function searchCepChangeFields() {
    //This call the action and change the store on reducer
    dispatch(Actions.searchCep(form.Cep))  
        .then(() => {   
            // This function is only taking values ??from the old state. 
            // The useSelector hook is not updating with store
            setForm(form => _.setIn({...form}, 'Endereco', cliente.data.Endereco))
            setForm(form => _.setIn({...form}, 'Uf', cliente.data.Uf))
            setForm(form => _.setIn({...form}, 'Cidade', cliente.data.Cidade))
            setForm(form => _.setIn({...form}, 'Bairro', cliente.data.Bairro))                  
        })
}
Run Code Online (Sandbox Code Playgroud)

减速器:

 case Actions.SEARCH_CEP:
        {
            return {
                ...state,
                data: { 
                    ...state.data,
                    Endereco: action.payload.logradouro,
                    Bairro: action.payload.bairro,
                    UF: action.payload.uf,
                    Cidade: action.payload.cidade                    
                }
            };
        }  
Run Code Online (Sandbox Code Playgroud)

ela*_* BA 43

注意:您最好开始使用redux-toolkit来防止在您的代码中引用它,这是使用 redux 的一种更好且几乎是必须的方式

在处理对象时,您面临的问题非常普遍,道具不会改变,因为您正在更改对象属性,但对象本身不会从反应方面改变。

即使你给它一个全新的对象,react 也不会看到属性对象发生变化,因为引用保持不变。

你需要像这样创建一个新的引用:

Object.assign(state.data,data);

return {
  ...state,
  data: { 
    ...state.data,
    Endereco: action.payload.logradouro,
    Bairro: action.payload.bairro,
    UF: action.payload.uf,
    Cidade: action.payload.cidade                    
  }
}
Run Code Online (Sandbox Code Playgroud)

要添加更多内容,您可以了解解决此问题的 Immer 库。

  • 我的天啊!太感谢了!我花了 3 个多小时试图解决这个问题,但我没有看到任何关于此的信息。你简直帮了我很多忙!谢谢 (4认同)
  • 是我的问题还是OPs代码和这个答案没有任何区别? (2认同)
  • 在Object.assign()中,第二个参数“data”来自哪里? (2认同)
  • 数据对象从哪里来? (2认同)

Vic*_*tar 14

没有必要

Object.assign(state.data, data);
Run Code Online (Sandbox Code Playgroud)

总是在更改数组或对象的数据时

return(
  object: {...state.object, a: 1, b: 2},
  array: [...state.array, 1, 2, 3]
)
Run Code Online (Sandbox Code Playgroud)

这 3 个点 ( ...) 确保您创建一个新对象。在 redux 上,您必须始终创建一个新对象,而不仅仅是更新状态。这样 redux 就不会验证您的数据是否已更改。

当有嵌套对象或数组时,是一样的

只需注意:

initialState = {
 object: {
     ...object,
     anotherObject:{
        ...anotherObject,
        a: 1,
        b: 2
      }
   }
}
Run Code Online (Sandbox Code Playgroud)