[英]react, how to not mutate state without deepcloning?
您的数据存储在 state (可能是 redux 状态)
并且您正在使用 formik 来修改您的数据。
在代码中,
let { data } = props // from redux state
// suppose data is somewhat deep like
// data = {
// p1: {
// p11: {
// },
// p12: [{
// p122
// }, {
// p123
// }]
// },
// p2
// }
const handleSubmit = (values) => {
dispatch({
type: 'setData',
payload: {
data: values
}
})
})
<Formik initialValues={_.cloneDeep(data)} enableReinitialize onSubmit={handleSubmit} />
//减速器看起来像
const reducer = (state={}, action) => {
return produce(state, (draft) => {
if (action.type === 'setData') {
draft.data = action.payload.data
}
})
}
请注意,我正在使用_.cloneDeep(data)
克隆data
,以防止 state 发生变异。
当数据平坦时,使用{...data}
是安全的,但是当数据很深(有对象有对象)时,就不是那么容易了
除了深度克隆还有其他方法吗? 我想知道immer.js
是否可以在这里提供帮助。
我不确定我是否理解这个问题,因为不清楚你为什么首先需要 deepClone,除非你的减速器有副作用并改变了有效载荷而不是 state。 在这种情况下,您也可以在有效负载数据上调用produce
,例如:
const reducer = (state={}, action) => {
return produce(state, (draft) => {
if (action.type === 'setData') {
const dataToStore = produce(action.payload, payloadDraft => {
payloadDraft.name = payloadDraft.name.toUpperCase()
})
draft.data = dataToStore
}
})
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.