受控组件 & 非受控组件

p,pre,span,div,code { font-size: 16px }

在 React 中表单组件可分为两类,受控与非受控组件.

一、 受控组件

设置了 value 的 <input> 是一个受控组件。 对于受控的 <input>,渲染出来的 HTML 元素始终保持 value 属性的值。例如:

render() {
    return <input type="text" value="Hello"/>
}

上面的代码将渲染出一个值为 Hello! 的 input 元素。用户在渲染出来的元素里输入任何值都不起作用,因为 React 已经赋值为 Hello!。如果想响应更新用户输入的值,就得使用 onChange 事件:

 constructor(props) {
   super(props);
   this.state={value:‘Hello‘};
   this.handleChange=this.handleChange.bind(this);
  }
  handleChange(event) {
    this.setState({value: event.target.value});
  }
  render() {
    var value = this.state.value;
    return <input type="text" value={value} onChange={this.handleChange} />;
  }

上面的代码中,React 将用户输入的值更新到 <input> 组件的 value 属性。这样实现响应或者验证用户输入的界面就很容易了。

二、 非受控组件

没有设置 value(或者设为 null) 的 <input> 组件是一个非受控组件。对于非受控的 <input> 组件,渲染出来的元素直接反映用户输入。例如:

render() {
    return <input type="text"/>
}

上面的代码将渲染出一个空值的输入框,用户输入将立即反应到元素上。和受控元素一样,使用 onChange 事件可以监听值的变化。

如果想给组件设置一个非空的初始值,可以使用 defaultValue 属性。例如:

render() {
    return <input type="text" defaultValue="Default Value">
}

上面的代码渲染出来的元素和受控组件一样有一个初始值,但这个值用户可以改变并会反应到界面上。同样地, 类型为 radiocheckbox 的<input> 支持 defaultChecked 属性, <select> 支持 defaultValue 属性。

 render() {
      return (
          <div>
            <input type="radio" name="opt" defaultChecked /> Option 1
            <input type="radio" name="opt" /> Option 2
            <select defaultValue="C">
              <option value="A">Apple</option>
              <option value="B">Banana</option>
              <option value="C">Cranberry</option>
            </select>
          </div>
      );
    }

需要注意的是,默认值只适用于第一次渲染,在重渲染阶段将不会适用。

三、checkbox和radio

checkbox 和 radio 比较特殊, 如果在 onChange 事件中调用了 preventDefault ,那么浏览器不会更新 checked 状态,即便事实上组件的值已经 checked 或者 unchecked 了 。

class HelloWorld extends React.Component{
    constructor(props){
        super(props);
        this.handleChange=this.handleChange.bind(this);
        this.state={checked:true};
    }
    handleChange(e){
        e.preventDefault();
        this.setState((prevState) => {
            return {checked:!prevState.checked};
        });
    }
    render(){
        return (<div>
            <input type="checkbox" checked={this.state.checked} onChange={this.handleChange} />点击我
            <br/>{String(this.state.checked)}
            </div>)
    }
}

ReactDOM.render(<HelloWorld/>,document.body);

在上面的例子中,虽然this.state.checked的值已经改变,但是checkbox的值确没有变,解决这个问题有三种方法:

1) 避免调用e.preventDefault,比如将上例的e.preventDefault注释掉就可以了;

2) 在setTimeout中处理checked的修改

handleChange(e){
      window.setTimeout(() => {
        this.setState((prevState) => {
            return {checked:!prevState.checked};
        });
      },0);
    }

3) 使用click事件

时间: 2024-10-24 08:37:54

受控组件 & 非受控组件的相关文章

【vue】父组件主动调用子组件 /// 非父子组件传值

一  父组件主动调用子组件: 注意:在父组件使用子组件的标签上注入ref属性,例如: <div id="home"> <v-header ref="header"></v-header> <hr> 首页组件 <button @click="getChildData()">获取子组件的数据和方法</button> </div> 父组件主动获取子组件的数据和方法: 1

react路由组件&amp;&amp;非路由组件

<Route exact path="/Home" component={Home}/> 1.路由组件:只有包裹在Route组件里的才能使用`this.props.location`, 2.非路由组件:假如有个需求,是面包屑或者导航组件里需要拿到`this.props.location`(导航组件或者面包屑一般不会包裹在`Route`里吧),那么直接这么写显然就不行了. 这个时候`withRouter`修饰一下,就可以这么写了. . 原文地址:https://www.cnb

受控组件&amp;&amp;非受控组件

声明,本博客摘自:https://segmentfault.com/a/1190000002675685 表单组件像 input.textarea 不同于其它的原生组件,因为它们会随着用户交互而改变.这些组件提供了接口方便我们管理这些交互. 交互属性 表单组件提供了一些受用户交互影响的属性 value,支持input.textarea checked,支持input type类型是checkbox或者radio selected,支持option 在HTML中,textarea 的值是通过子属性

浅谈react受控组件与非受控组件

最近在使用蚂蚁金服出品的一条基于react的ant-design UI组件时遇到一个问题,编辑页面时input输入框会展示保存前的数据,但是是用defaultValue就是不起作用,输入框始终为空值而不是具体的传入的值.具体编辑页面中文本框相关的代码如下:         ... //render方法上面的内容省略  <FormItem       label="问题描述:"       hasFeedback      {...props.formItemLayout}  &g

React 受控组件和非受控组件

需求用户名自动获取 onChange用户状态发生改变 就获取值 就是时时获取值 使用onChange 点击按钮 获取密码 只要绑定了点击事件 就可以获取值 通过 let usercont=event.target.value;//获取用户的值 ref获取值的另外一种用法 密码: <input type="password" ref={this.Myrefs}></input> Myrefs = React.createRef();//创建一个承装ref的容器 M

react 表单(受控组件和非受控组件)

我们知道表单元素与其他的普通DOM元素来说是不一样的,它们保存了自己的一些状态. 我们主要说的就是表单元素中的受控组件和非受控组件. 受控组件就是这个组件的状态是我们(react)控制的,这个组件的行为是完全受到我们控制的,所以叫做受控组件,比如: 1 class NameForm extends React.Component { 2 constructor(props) { 3 super(props); 4 this.state = {value: ''}; 5 6 this.handle

GUI编程(三)-----非容器组件

常用的非容器组件有:JLabel.JTextField.JPasswordField.JRadioButton.JCheckBox.JComboBox.JTextArea. 基本用法: public static void main(String[] args) { JFrame frame= new JFrame("注册"); frame.setSize(500, 400); frame.setLocationRelativeTo(null); //创建一个面板 JPanel pan

vue2.0父子组件以及非父子组件如何通信

1.父组件 >>> 子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: <parent> <child :child-msg="msg"></child> //这里必须要用 - 代替驼峰 </parent> data(){ return { msg: [1,2,3] }; } 子组件通过props来接收数据: 方式1: props: ['childMsg'] 方式2 : props: { chi

vue 2 使用Bus.js进行兄弟(非父子)组件通信 简单案例

vue2中废弃了$dispatch和$broadcast广播和分发事件的方法.父子组件中可以用props和$emit().如何实现非父子组件间的通信,可以通过实例一个vue实例Bus作为媒介,要相互通信的兄弟组件之中,都引入Bus,之后通过分别调用Bus事件触发和监听来实现组件之间的通信和参数传递. 首先需要在任意地方添加一个bus.js 在bus.js里面 写入下面信息 1 import Vue from 'vue' 2 export default new Vue; 在需要通信的组件都引入B