非受控组件:现用现取
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>react中的受控组件与非受控组件</title>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone@7/babel.min.js"></script>
<script src="https://unpkg.com/prop-types@15.8.1/prop-types.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
const root = ReactDOM.createRoot(document.getElementById('root'));
class MyComponent extends React.Component {
sevaDate = (e) => {
const { name, password } = this;
alert(`用户名:${name.value},密码:${password.value}`);
}
render() {
return (
<form onSubmit={this.sevaDate}>
<input type="text" ref={c => this.name = c}></input>
<input type="password" ref={c => this.password = c}></input>
<button type="submit">提交</button>
</form>
);
}
};
root.render(<MyComponent />);
</script>
</body>
</html>
受控组件
类似于vue中的数据双向绑定
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>react中的受控组件与非受控组件</title>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone@7/babel.min.js"></script>
<script src="https://unpkg.com/prop-types@15.8.1/prop-types.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
const root = ReactDOM.createRoot(document.getElementById('root'));
class MyComponent extends React.Component {
state = {
name: '',
password: ''
}
sevaDate = (e) => {
e.preventDefault();// 阻止表单提交的默认行为
alert(`用户名:${this.name},密码:${this.password}`);
}
sevaName = (e) => {
this.name = e.target.value; // 将输入框的值赋值给state中的name
}
sevaPassword = (e) => {
this.password = e.target.value; // 将输入框的值赋值给state中的password
}
render() {
return (
<form onSubmit={this.sevaDate}>
<input type="text" onChange={this.sevaName}></input>
<input type="password" onChange={this.sevaPassword}></input>
<button type="submit">提交</button>
</form>
);
}
};
root.render(<MyComponent />);
</script>
</body>
</html>
总结
尽量少写非受控组件因为受控组件里一个ref都没有(官方建议少用ref)