Javascript React useState钩子影响状态中使用的默认变量,而不考虑扩展运算符、Object.assign等
我是经验丰富的js/React开发人员,但遇到了我无法解决的问题,我不知道如何解决它 我有一个具有许多不同状态的上下文提供程序,但有一个状态如下所示:Javascript React useState钩子影响状态中使用的默认变量,而不考虑扩展运算符、Object.assign等,javascript,reactjs,ecmascript-6,react-hooks,use-state,Javascript,Reactjs,Ecmascript 6,React Hooks,Use State,我是经验丰富的js/React开发人员,但遇到了我无法解决的问题,我不知道如何解决它 我有一个具有许多不同状态的上下文提供程序,但有一个状态如下所示: const defaultParams = { ordering: 'price_asc', page: 1, perPage: 15, attrs: {}, } const InnerPageContext = createContext() export const InnerPageContextProvider = (
const defaultParams = {
ordering: 'price_asc',
page: 1,
perPage: 15,
attrs: {},
}
const InnerPageContext = createContext()
export const InnerPageContextProvider = ({ children }) => {
const [params, setParams] = useState({ ...defaultParams })
const clearParams = () => {
setParams({...defaultParams})
}
console.log(defaultParams)
return (
<InnerPageContext.Provider
value={{
params: params,
setParam: setParam,
clearParams:clearParams
}}
>
{children}
</InnerPageContext.Provider>
)
}
除了第三个方法外,上述方法都不起作用,在第三个方法中,我硬编码了与defaultParams
相同的对象。
其思想是将dafult参数保存在某个位置,当用户清除参数时,将其还原。
你们有什么好主意吗
编辑:
以下是我更新参数的方式:
const setParam = (key, value, type = null) => {
setParams(old => {
if (type) {
old[type][key] = value
} else old[key] = value
console.log('Params', old)
return { ...old }
})
}
请说明如何更新“参数” 如果代码“params.attrs.test=true”中有类似的内容,则将更改defaultParams 如果
old[type]
不是简单类型,它会在defaultParams中存储对同一对象的引用defaultParams.attrs===params.attrs
。因为在初始化过程中,您可以分解对象,但不能分解其嵌套对象
问题在这里:old[type][key]=value
解决方案:
const setParam = (key, value, type = null) => {
setParams(old => {
if (type) {
old[type] = {
...old[type],
key: value,
}
} else old[key] = value
return { ...old }
})
}
我想我们需要更多的背景来了解你是如何使用它的。举个(无可否认相当粗糙的)例子,一切似乎都如预期的那样运行。所以我假设问题在于这里没有显示的代码。
const [params, setParams] = useState(defaultParams)
const clearParams = () => {
setParams({
ordering: 'price_asc',
page: 1,
perPage: 15,
attrs: {},
})
}
const setParam = (key, value, type = null) => {
setParams(old => {
if (type) {
old[type][key] = value
} else old[key] = value
console.log('Params', old)
return { ...old }
})
}
const setParam = (key, value, type = null) => {
setParams(old => {
if (type) {
old[type] = {
...old[type],
key: value,
}
} else old[key] = value
return { ...old }
})
}