受控组件&非受控组件

100 阅读1分钟

受控组件

  • 受控组件进行了数据双向绑定
  • 适用于需要精确控制表单输入的场景: 如立即报错
export default function App() {
  const [v, setV] = useState("");

  const tap = () => {
    console.log(v);
  };

  return (
    <div className="App">
      <input type="text" value={v} onChange={(e) => setV(e.target.value)} />
      <button onClick={tap}>提交</button>
    </div>
  );
}

非受控组件

  • 非受控组件的优点是简单易用
  • 适用于简单的表单,或者当表单处理逻辑相对简单,不需要精确控制表单输入时。
  • 不适用于立即报错, 需要用户点击提交按钮后, 获取到数据才能检查报错
export default function App() {
  const dom = useRef<HTMLInputElement>(null);

  const tap = () => {
    console.log(dom.current?.value);
  };

  return (
    <div className="App">
      <input type="text" ref={dom} />
      <button onClick={tap}>提交</button>
    </div>
  );
}
  • 上传文件适合使用非受控组件
  • 当需要对具体DOM元素进行操作时,例如上传文件或访问原生方法等,非受控组件更加灵活
export default function App() {
  const dom = useRef<HTMLInputElement>(null);

  const tap = () => {
    if (!dom.current) return alert("请选择文件");
    const files = dom.current.files;
    if (files) alert(`开始上传${files[0].name}`);
  };

  return (
    <div className="App">
      <input type="file" ref={dom} />
      <button onClick={tap}>提交</button>
    </div>
  );
}