【问题标题】:React state vs variable vs function call反应状态 vs 变量 vs 函数调用
【发布时间】:2020-10-18 21:15:43
【问题描述】:

这是我的项目:

import React, { useState } from 'react';

const Component = () => {
  const [number, setNumber] = useState(1);
  const by2 = !(number%2)
  const by3 = !(number%3)
  const by5 = !(number%5)
  const by7 = !(number%7)
  const by11 = !(number%11)

  return(
    <>
      {by2 && <div>Divisible by 2</div>}
      {by3 && <div>Divisible by 3</div>}
      {by5 && <div>Divisible by 5</div>}
      {by7 && <div>Divisible by 7</div>}
      {by11 && <div>Divisible by 11</div>}
      <button onClick={() => setNumber(prev => prev +1)}>click me</button>
    </>
  )
}
export default Component

我希望它这样做:给定初始状态

const [number, setNumber] = useState(1);

以及增加它的按钮

<button onClick={() => setNumber(prev => prev +1)}>click me</button>

其他 5 个组件只有在它们的条件为真时才会出现。

  const by2 = !(number%2)
  const by3 = !(number%3)
  const by5 = !(number%5)
  const by7 = !(number%7)
  const by11 = !(number%11)

问题是,这行得通!我在 by2、by3、by5 等中所做的逻辑就像我想要的那样工作。但同时我想:什么时候可以在组件内部使用变量或函数调用?过去我遇到过一些问题,其中变量没有像我希望的那样在重新渲染中更新它们的值。所以我觉得我应该使用状态,甚至是这样的函数调用:

  const by2 = () => !(number%2)
  const by3 = () => !(number%3)
  const by5 = () => !(number%5)
  const by7 = () => !(number%7)
  const by11 = () => !(number%11)

  {by2() && <div>Divisible by 2</div>}
  {by3() && <div>Divisible by 3</div>}
  {by5() && <div>Divisible by 5</div>}
  {by7() && <div>Divisible by 7</div>}
  {by11() && <div>Divisible by 11</div>}

所以我想知道的是,选择这 3 种方法有什么影响?在这种情况下我可以使用变量而不是状态,并且在这种情况下不带参数的函数调用与使用变量相同吗?

【问题讨论】:

标签: reactjs dom use-state react-functional-component rerender


【解决方案1】:

我肯定会说,在这种简单的情况下,使用变量或函数调用也是一样的。当调用setNumber 时,您正在重新渲染您的组件并且变量应该正确更新。

也许在你上一个项目中,你说变量没有更新,还有别的东西......

【讨论】:

    【解决方案2】:

    在这个简单的例子中,两种方法都是相似的。它们没有太大区别。

    但是,如果您在状态更新时定义函数,则函数将被重新定义,这不是预期的。当您将函数用作子组件的道具时,您可能会遇到问题。因为这些函数将在每次渲染时重新定义,这可能会触发子元素的重新渲染,这在所有情况下都可能不希望出现。为了避免这种情况,我们使用useCallbackuseMemoReact.Memo 等。

    由于您的所有变量都依赖于状态,因此每当状态更新时,变量也会随之更新。因此,对于您的需求,定义变量非常适合。

    在什么情况下我可以使用变量而不是状态

    • 当您不希望组件在更新值时重新呈现时,您只需将这些对象/值定义为变量。
    • 当您希望在值更改/更新时重新渲染组件时,将所有这些对象/值定义为状态,如本例中的number

    希望这会有所帮助。

    【讨论】:

    • 我不明白你说的第一件事。如果我的函数定义发生变化,为什么我会遇到问题?这似乎正是我想要的,因为在将来重新渲染时我会在执行 by2() 时需要另一个值,那么问题是什么?导致子元素重新渲染的原因是状态不是吗?为什么函数或变量会成为问题?
    • 考虑一下,如果您将这些函数之一作为道具传递给子级,并且相同的道具用作子级中useEffect 的依赖项。然后当这个父组件因为状态改变而被重新渲染时,函数将被重新定义并且函数引用将被改变,这将触发子组件useEffect,这可能不是预期的。这是我们使用 useCallbackuseMemoReact.Memo 的地方,具体取决于用例
    • 欲了解更多信息,请参考this关于我正在谈论的问题以及修复。
    猜你喜欢
    • 2021-03-01
    • 2011-06-21
    • 2022-01-10
    • 2011-05-20
    • 1970-01-01
    • 2014-08-08
    • 2021-10-23
    • 2019-07-24
    相关资源
    最近更新 更多