【问题标题】:React useContext with "setState"用“setState”反应useContext
【发布时间】:2020-12-09 14:49:33
【问题描述】:

我最近开始使用带有 useContext Hook 的 Context React Api。 我观察到,当我们有一个状态变量,即 const someState = useState(state, setState) 时,一些 开发人员直接在提供者值中传递 setSate,然后在子组件中调用它。 这是一个好习惯吗?

当您不使用上下文时,您必须创建一个处理程序来“访问”子组件中的 setState。 我仍在使用处理程序函数并将它们传递给提供者值,以从上下文中导入它们 在儿童中。

在上下文中传递 setState 是一种好的做法吗?我仍然有一些疑问,因为通常您不能将 setState 直接传递给组件。 性能上是否有任何差异或我应该考虑的任何其他缺点?

谢谢。

【问题讨论】:

    标签: reactjs setstate use-context


    【解决方案1】:

    如果我理解正确,区别在于,在一种方式中,状态是从父组件设置的,而在另一种方式中,状态是从子组件设置的。 有时人们这样做是为了避免在更改状态时循环渲染。应该没有缺点,但使用处理函数是常规方法。

    【讨论】:

    • 嗨@Amel。感谢你的回复。所以,如果我直接使用,比如说 context.setState({...newState}),在子组件中,子组件会重新渲染,而其他所有东西都会监听 useContext?但是,如果我在子组件中使用处理程序,则状态将从父组件更改,并且只有父组件会重新呈现?还是相反?
    【解决方案2】:

    编辑:我实际上认为我弄错了,但我不确定。如果您编写自己的具有状态的提供程序,我的回复对这种情况有效。如果你只是使用提供setter的默认provider,我会同意Amel的回复。


    我个人不会这样做,但这更像是一种观点。但是,与往常一样,这在很大程度上取决于您想要达到的目标。

    这样做的一个积极方面是,useState 给定的状态设置器在每次重新渲染时始终保持不变。如果您传递自定义值,您应该避免它过于频繁地更改,因为使用 useContext 监听更改的每个组件都会重新渲染。

    我仍然希望通过回调传递一个自定义对象(例如,来自 useMemo 以避免不必要的重新渲染)来设置状态。如果你想在未来提供更多的东西,它会更容易扩展。

    类似这样的东西(非常简单的例子,这样当然没有意义,只是为了理解):

    function MyProvider({children}) {
       const [state, setState] = useState(0);
       const provided = useMemo(() => ({
           value: state,
           setValue: (value) => setState(value)
       }, [value]);
       return <MyContext.Provider value={provided}>{children}</MyContext.Provider>;
    }
    

    在使用上下文的每个地方都无需更改代码就可以更容易地进行扩展。但是,我仍然认为传递 setter 并没有什么特别糟糕的,如果这是您想要实现的。

    【讨论】:

    • 谢谢@Reductio。是的,我使用的是默认上下文提供程序。我从来没有考虑过创建自己的。我将尝试您的解决方案,看看它是如何工作的。它可能对我的一个组件有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2020-12-03
    • 2021-03-16
    • 2018-11-03
    • 1970-01-01
    • 2020-01-23
    相关资源
    最近更新 更多