React中受控组件和非受控组件

147 阅读2分钟

非受控组件

首先,我们创建了一个input表单。当我们启动我们的应用的时候,你可以向Input表单里面输入任何值并且可以看到变化,即使我们没有给任何的处理函数在我们的代码中。因为这是Html的原生事件,它管理着自己的内部状态。

import React from 'react';

const App = () => (
  <div>
    <label>
      My uncontrolled Input: <input type="text" />
    </label>
  </div>
);

export default App;

input.gif

非受控组件 VS 受控组件

当我们在这个例子中引入React State和Hooks时。

import React, { useState } from 'react';

const App = () => {
  const [value, setValue] = useState('');

  const handleChange = event => setValue(event.target.value);

  return (
    <div>
      <label>
        My still uncontrolled Input:
        <input type="text" onChange={handleChange} />
      </label>

      <p>
        <strong>Output:</strong> {value}
      </p>
    </div>
  );
};

export default App;

运行效果如下 在这里插入图片描述 现在,我们可以看到当我们更改input表单里面的值时,输出的value值也会相应的产生变化。这时候我们问一下自己,这个为什么还是非受控组件呢?

先别急,我们来看下一个例子

import React, { useState } from 'react';

const App = () => {
  const [value, setValue] = useState('Hello React');

  const handleChange = event => setValue(event.target.value);

  return (
    <div>
      <label>
        My still uncontrolled Input:
        <input type="text" onChange={handleChange} />
      </label>

      <p>
        <strong>Output:</strong> {value}
      </p>
    </div>
  );
};

export default App;

代码运行效果 在这里插入图片描述 你能发现这个例子和上面那个例子有什么不同的地方吗?在这个例子中,我们给了value一个初始值"hello react"。但是我们可以发现,当我们启动应用的时候,input表单里面的值依旧为空。只有我们开始输入的时候,input表单和output才似乎开始同步。这里为什么要用似乎呢?其实,Input表单中的字段实际上还是跟踪的是它自己的内部状态,然而output跟踪的React中state的值,他们能够同步是靠handleChange函数。这就是为什么启动时他们的值不一样的原因了。

从非受控组件到受控组件

当我们将input表单中value值与React中的state进行绑定,input表单就不会使用它内部的状态,而是你提供的state值。当我们现在向input表单中输入值的时候,表单的字段和输出的值就会同步更新拉。这个表单已经从非受控组件变成了受控组件。

import React, { useState } from 'react';

const App = () => {
  const [value, setValue] = useState('Hello React');

  const handleChange = event => setValue(event.target.value);

  return (
    <div>
      <label>
        My controlled Input:
        <input type="text" value={value} onChange={handleChange} />
      </label>

      <p>
        <strong>Output:</strong> {value}
      </p>
    </div>
  );
};

export default App;

在这里插入图片描述