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 库。
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)
归档时间: |
|
查看次数: |
40232 次 |
最近记录: |