从多个组件获取受控输入时如何在React中最大化性能?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从多个组件获取受控输入时如何在React中最大化性能?相关的知识,希望对你有一定的参考价值。

我创建了具有多个子组件的父组件。这些子组件中的每一个都有向下传递到父组件的数据,该父组件会将这些数据发送到api调用。结构看起来像这样

const ParentComponent = () => {
  const [child1input, setChild1Input] = useState("");
  const [child2input, setChild2Input] = useState("");
  const [child3input, setChild3Input] = useState("");
  const [child4input, setChild4Input] = useState("");

  const submitData = async () => {
    const payload = {
      input1: child1input,
      input2: child2input,
      input3: child3input,
      input4: child4input
    };

    await axios.post('route', {...payload});
  }

  return (
    <Fragment>
      <Child1 input={child1input} setInput={setChild1Input} />
      <Child2 input={child2input} setInput={setChild2Input} />
      <Child3 input={child3input} setInput={setChild3Input} />
      <Child4 input={child4input} setInput={setChild4Input} />
      <Button onClick={submitData}>Submit</Button>
    </Fragment>
  );
};

现在很清楚,每个组件每次更新父组件的状态(输入框的每次击键)都会更新父组件,因此每个子组件也都会更新。这会对性能产生巨大影响,并导致输入文本框的行为过于缓慢。

我想知道,我将如何处理某个子组件中一个文本框的输入更改,而不会导致所有内容重新呈现?

答案

您可以将React.memo用于Child组件,将useCallback用于Parent一个

const handleInput1 = useCallback(
    (e) => {
        setChild1Input(e.target.value)
    },[setChild1Input],
)
<Child1 input={child1input} setInput={handleInput1} />

------------------------------------------------------

export default React.memo(Child1);

以上是关于从多个组件获取受控输入时如何在React中最大化性能?的主要内容,如果未能解决你的问题,请参考以下文章

在 React 中更改受控输入值时发出警告

react 获取input标签的输入值

react-生命周期

浅谈react受控组件与非受控组件

受控组件和不受控组件的区别

React 组件中的事件处理组件(受控非受控)函数柯里化