React脱围机制

51 阅读1分钟

你可能不需要Effect

根据 props 或 state 来更新 state 

假设你有一个包含了两个 state 变量的组件:firstNamelastName。你想通过把它们联结起来计算出 fullName。此外,每当 firstNamelastName 变化时,你希望 fullName 都能更新。你的第一直觉可能是添加一个 state 变量:fullName,并在一个 Effect 中更新它:

function Form() {

  const [firstName, setFirstName] = useState('Taylor');

  const [lastName, setLastName] = useState('Swift');



  // 🔴 避免:多余的 state 和不必要的 Effect

  const [fullName, setFullName] = useState('');

  useEffect(() => {

    setFullName(firstName + ' ' + lastName);

  }, [firstName, lastName]);

  // ...

}

大可不必这么复杂。而且这样效率也不高:它先是用 fullName 的旧值执行了整个渲染流程,然后立即使用更新后的值又重新渲染了一遍。让我们移除 state 变量和 Effect:

function Form() {

  const [firstName, setFirstName] = useState('Taylor');

  const [lastName, setLastName] = useState('Swift');

  // ✅ 非常好:在渲染期间进行计算

  const fullName = firstName + ' ' + lastName;

  // ...

}

如果一个值可以基于现有的props或state计算得出,不要把它作为一个state,而是在渲染期间直接计算这个值。这将使你的代码更快(避免了多余的“级联”更新)更简洁(移除了一些代码)以及更少出错(避免了一些因为不同的 state 变量之间没有正确同步而导致的问题)