react受控组件与非受控组件区别在于:
- 受控组件中输入框的值由其change事件接管,做对应的数据劫持操作,例如可以对输入框的值进行合法输入校验(匹配正则),此时表单数据由 React 组件来管理(“受开发者控制”)。
步骤:
a.创建一个state值绑定在输入框的value上;
b.输入框绑定change事件传入事件e;
c.change事件中得到输入框的值然后赋值改变state值;
d.数据组装提交到后台;
import axios from "axios";
import React, { useState, useEffect } from "react";
function ControlledComponent() {
const [userName, setUsername] = useState("小明");
function doSumbit() {
const data = {
name: userName,
};
console.log(data)
axios("xxx", data);
}
useEffect(() => {
console.log(userName);
}, [userName]);
return (
<>
<input value={userName} onChange={(e) => {setUsername(e.target.value);} }></input>
<button onClick={doSumbit}>提交</button>
</>
);
}
export default ControlledComponent;
- 非受控组件则是同过ref直接获取输入框的值,只获取到最后状态的结果值,在输入过程中做不到对输入值的操作,此时表单数据将交由 DOM 节点来处理(“不受开发者控制”)。
步骤:
a.创建一个ref实例绑定到输入框的ref上;
b.通过ref.current.value获取输入框的值进行数据组装提交到后台;
import axios from "axios";
import React, { useRef } from "react";
function NotControlledComponent() {
const inputRef = useRef();
function doSumbit() {
const data = {
name: inputRef.current.value,
};
console.log(data);
axios("xxx", data);
}
return (
<>
<input ref={inputRef}></input>
<button onClick={doSumbit}>提交</button>
</>
);
}
export default NotControlledComponent;
注:本文使用的react hooks 写的例子,详情参考官网:在大多数情况下,我们推荐使用 受控组件 来处理表单数据