Javascript React useState钩子影响状态中使用的默认变量,而不考虑扩展运算符、Object.assign等

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 = (

我是经验丰富的js/React开发人员,但遇到了我无法解决的问题,我不知道如何解决它

我有一个具有许多不同状态的上下文提供程序,但有一个状态如下所示:

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 }
    })
  }