Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在useReducer()钩子中使用React上下文API有哪些优点和缺点?_Javascript_Reactjs_React Hooks_React Context - Fatal编程技术网

Javascript 在useReducer()钩子中使用React上下文API有哪些优点和缺点?

Javascript 在useReducer()钩子中使用React上下文API有哪些优点和缺点?,javascript,reactjs,react-hooks,react-context,Javascript,Reactjs,React Hooks,React Context,我正在处理一个web应用程序,我正在使用React上下文,而不使用useReducer()钩子。这是我如何在应用程序中使用上下文的一个简单示例: const [stateValue, setStateValue] = useState(""); const [stateValue1, setStateValue1] = useState(""); const contextValue : MainContext = { stateValue:

我正在处理一个web应用程序,我正在使用React上下文,而不使用useReducer()钩子。这是我如何在应用程序中使用上下文的一个简单示例:

const [stateValue, setStateValue] = useState("");
const [stateValue1, setStateValue1] = useState("");
const contextValue : MainContext = {
      stateValue: stateValue,
      setStateValue: setStateValue,
      stateValue1: stateValue1,
      setStateValue1: setStateValue1
}
因此,我将contextValue传递给我的上下文提供程序,每当子组件必须更改stateValuex时,它只调用setStateValuex,以便触发所有子组件中stateValuex的重新呈现。
用useReducer()钩子代替上下文有什么利弊?

使用钩子或自定义钩子时,它们的状态是独立的。
这意味着假设您在组件A和B中使用了useReducer。A、B中useReducer的状态完全不同,而如果您使用contextAPI,状态是相同的。

我将把它作为两个问题来处理:1)使用状态的优缺点与使用状态的优缺点之比
与使用状态的优缺点之比
与上下文的优缺点之比。然后把这些答案粘在一起

useReducer
如果您有一个复杂的状态,需要确保所有更新逻辑都在一个集中的位置,那么它可能会很有用<另一方面,code>useState
适用于不需要这种控制的简单状态

props是将值从一个组件传递到其子组件的标准方式。如果你在短距离内通过它,这是最简单和最好的方法。如果需要在组件树的很长一段时间内传递值,则上下文非常有用。如果在很多情况下,组件接收到的道具不是为自身,而是为了将其转发给子组件,那么这可能表明上下文比道具更好

const contextValue : MainContext = {
  stateValue: stateValue,
  setStateValue: setStateValue,
  stateValue1: stateValue1,
  setStateValue1: setStateValue1
}
注:如果你的上下文值是一个对象。如果不这样做,则每次渲染时都将创建一个全新的对象,这将强制任何使用上下文的组件也进行渲染

const contextValue: MainContext = useMemo(() => {
  return {
    stateValue: stateValue,
    setStateValue: setStateValue,
    stateValue1: stateValue1,
    setStateValue1: setStateValue1
  }
}, [stateValue, stateValue1])