前言
我们在谈论受控组件的时候,会去使用父子通信的方式去进行数据传递,从而达到组件的受控,其实并非这一种方案,当我们对表单组件进行受控处理的时候,往往会使用 ref 命令去进行数据传递,使用传统的父子通信当然可以实现,只不过对于表单组件来说,ref 更加的便捷
使用父子通信解决表单域的数据传输问题
既然说是表单域组件,那么我们就写一个表单域组件出来
import React, { Component } from 'react';
import Field from './Field';
export default class App extends Component {
render() {
return (
<section>
<h1>登录页面</h1>
<Field label="用户名" type="text"></Field>
<Field label="密码" type="password"></Field>
<button>Login</button>
<button>clear</button>
</section>
);
}
}
import React, { Component } from 'react';
export default class App extends Component {
render() {
return (
<section style={{ backgroundColor: 'green' }}>
<label htmlFor="">{this.props.label}</label>
<input type={this.props.type} />
</section>
);
}
}

接下来我们想点击登录,获取到用户名以及密码,点击清除会把表单中的数据清空
如果我们使用父子通信的方法来实现的话
父组件:
import React, { Component } from 'react';
import Field from './Field';
export default class App extends Component {
constructor() {
super();
this.state = {
username: '',
password: '',
};
}
render() {
return (
<section>
<h1>登录页面</h1>
<Field
label="用户名"
type="text"
value={this.state.username}
iptValue={value => {
this.setState({
username: value,
});
}}
></Field>
<Field
label="密码"
type="password"
value={this.state.password}
iptValue={value => {
this.setState({
password: value,
});
}}
></Field>
<button
onClick={() => {
console.log({
username: this.state.username,
password: this.state.password,
});
}}
>
Login
</button>
<button
onClick={() => {
this.setState({
username: '',
password: '',
});
}}
>
clear
</button>
</section>
);
}
}
子组件:
import React, { Component } from 'react';
export default class App extends Component {
render() {
return (
<section style={{ backgroundColor: 'green' }}>
<label htmlFor="">{this.props.label}</label>
<input
type={this.props.type}
value={this.props.value}
onChange={e => {
this.props.iptValue(e.target.value);
}}
/>
</section>
);
}
}

OK,我们实现了,但是明显看来是比较繁琐的,一直在传来传去的
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

评论(0)