javascript 在react中使用了太多的useState钩子,我该如何重构它?

llmtgqce  于 2023-06-28  发布在  Java
关注(0)|答案(2)|浏览(162)

useState钩子很棒。我主要使用useState钩子来初始化某些状态,我还将函数传递给子组件来更改状态。然而,我意识到我开始在我的父页面组件中使用太多的useState钩子。这看起来和感觉都是错误的,因为我开始在父页面组件中有大约6-10个useState钩子
如果不显示代码,有没有更好的方法来做到这一点?也许是一个更好的实践,或者是一个更好的重构方法。
谢谢

wh6knrhe

wh6knrhe1#

每当你遇到这样的问题时,你应该首先看看你是否可以把你的组件分成多个小的。然而,有些情况下,这不是一个选择。在这些情况下,我建议使用useReducer。

// before

const {cache, setCache } = useState({});
const {posts, setPosts } = useState({});
const {loading, setLoading } = useState(false);

// Would become after refactor

const initialState = {
  cache: {},
  posts:{},
  loading: false
}

const [state, dispatch] = useReducer(reducer, initialState);
iibxawm4

iibxawm42#

我相信优化useState的最好方法是解耦不必要的关系。无论你是否使用useState在react组件内部,将它们与useContext、useReducer或任何其他方法共享。将所有内容放在一个对象树中并不能优化性能。因此,将上述内容更改为单个useReducer只会将问题转移到其他地方。
最优化的解决方案是只耦合必要的依赖项。即使用多个状态处理程序-即多个上下文提供程序,或多个useReducers,zustand或做一些聪明的新useSignal,它本质上是要做同样的事情,只听最小量的差异。
如果需要,您仍然可以通过中央useEffect在这些多个状态之间订阅。
一个简单的useContext示例:

<ProviderStateX>
  <ProviderStateY>
    <ProviderStateZ>

      <MyComNeedsX>
        <MyCompNeedsXY>
          <MyCompChildNeedsY>
        </>
        <MyCompNeedsXZ>
          <MyCompChildNeedsZ>
        </>
      </> 
    </> 
  </> 
</>

有一些更整洁的选项没有嵌套的提供程序,但这个例子是针对“上下文”的,请原谅这个双关语。
一个更好,更干净的解决方案可能是使用信号,多个zustand状态或原生js代理,只监听你的react组件关心的一件事,以防止不必要的重新渲染。

相关问题