reactjs 使用钩子将状态设置为相同的值会导致重新渲染吗?

z9smfwbn  于 2023-01-02  发布在  React
关注(0)|答案(5)|浏览(226)

使用钩子,如果我用和state相同的值调用setState,它会重新呈现组件吗?
如果是,如何避免?
例如:

const [state, setState] = useState(foo)

...
// any where in the code
setState(foo)

考虑到foo可以是任何事物,例如{}trueprops.bar或来自组件外部的变量(常量)。

twh00eeo

twh00eeo1#

如果使用相同的值调用setState,它不会重新呈现组件。
试试这个:

import React, { useState, useEffect } from "react";

const foo = { foo: 'bar' };

export default ({ name }) => {
  const [state, setState] = useState(foo);
  console.log("rendered!");
  useEffect(() => {
    setState(foo);
    console.log("state reset!");
  });

  const handleClick = () => {
    console.log("handleClick!");
    setState(foo);
    // setState({ ...foo, bar : 'baz' });
  }

  return (<div>
  <h1>Hello {name}!</h1>
  <button onClick={handleClick}>Click Me</button>
  </div>);
};

你会注意到,即使点击按钮,因为值没有改变,它也不会重新呈现组件。如果你改变调用setState的参数,它会重新呈现组件。
这里有一个Code Sample作为参考。
尝试在handleClick方法中注解第一个setState并取消注解第二个setState,以查看差异。

wa7juj8i

wa7juj8i2#

总结一下
如果你的状态是一个原始值(数字,字符串,布尔值,...),那么使用setState钩子设置相同的值将不会触发重新渲染。如果你的状态是一个对象或数组,那么它的行为将有所不同。
https://overreacted.io/how-are-function-components-different-from-classes/
https://dmitripavlutin.com/value-vs-reference-javascript/

91zkwejq

91zkwejq3#

这是一个与js语法相关的问题,就像===操作一样。

let times = 0
const init = {name: 'Bob'}
function App() {
  const [state, setState] = useState(init)
  function modify() {
    setState({name: 'Bob'})
  }
  function modify2() {
    setState(init)
  }
  times ++
  return (
    <div className="App">
      <p>{ times }</p>
      <button onClick={modify}>Same Value Will Rerender</button>
      <button onClick={modify2}>Same Reference Never Rerender</button>
    </div>
  );
}

这是一个Code Sandbox
您可以重写 Package 器方法:

let times = 0
const init = {name: 'Bob'}
function App() {
  const [state, setState] = useState(init)
  function modify3() {
    setState2({ name: 'Bob' })
  }
  function setState2(value) {
    if (value.name === state.name) {
      return
    }
    setState(value)
  }
  times ++
  return (
    <div className="App">
      <p>{ times }</p>
      <button onClick={modify3}>Same Value Will Not Rerender Yet</button>
    </div>
  );
}
ulydmbyx

ulydmbyx4#

有点晚了,但是我发现了一个奇怪的情况,用相同的值设置状态会触发重新渲染两次,然后通常会起作用。将状态设置为2会触发重新渲染两次。
有什么解释吗?

export default function App() {
  const [state, setState] = React.useState(1);
  console.log("App rendered");
  console.log({ state });

  return (
    <div className="App">
      <button
        onClick={() => {
          setState(1);
        }}
      >
        update state with same value
      </button>
      <button
        onClick={() => {
          setState(2);
        }}
      >
        update state with different value
      </button>
      <div>state:{state}</div>
    </div>
  );
}
dxxyhpgq

dxxyhpgq5#

你可以读这篇文章吗?它有很好的信息与主题:
https://stackoverflow.com/a/55374111/17262218

相关问题