• React中受控组件与非受控组件的使用


    受控组件

    受控组件的步骤:
    1.在state中添加一个状态,作为表单元素的value值(控制表单元素值的来源)
    2.给表单元素绑定change事件,将表单元素的值设置为state的值(这样就可以控制表单元素值的变化)
    

    受控组件的简单使用 index.js

    import React from 'react'; //这个是react这个包,我们是需要的
    import ReactDOM from 'react-dom'; //这个是react的虚拟dom
    
    class ShowCont extends React.Component { 
    
    	state = {
        txet: '',
        city: 'sh',
        isChecked:''
      }
      // input的事件
      changeTextHandler = (e) => { 
        this.setState({
          txet:e.target.value
        })
        console.log(this.state.txet)
      }
      // 下拉框的事件
      cityHandler = (e) => { 
        this.setState({
          city:e.target.value
        })
      }
      // 复选框的事件
      changeCheck = (e) => { 
        this.setState({
          isChecked:e.target.checked
        })
      } 
      // 获取的是所有的值
      getAllHandler = () => { 
        console.log('获取的是所有的值:',this.state)
      }
    
      render() { 
        return (
          <div>
            {/* 普通的input */}
            <input type="text" value={this.state.txet} onChange={this.changeTextHandler} />
            {/* 下拉 */}
            <select value={this.state.city}  onChange={this.cityHandler} >
              <option value="sh">上海</option>
              <option value="bj">北京</option>
            </select>
            {/* 复选框 */}
            <input type="checkbox" checked={this.state.isChecked} onChange={ this.changeCheck} />
            <button onClick={this.getAllHandler}>获取值</button>
          </div>
        )
      }
    }
    
    ReactDOM.render(<ShowCont/>, document.getElementById('root'))
    
    

    受控组件的原理

    文本框和文本域,下拉框操作的是value属性,通过change事件去更新。
    复选框是通过checked属性和change事件去更新。
    

    我们的发现

    上面有不同的表单元素,如果表单元素有很多。
    那我们是不是都要写不同的事件。去设置值呢?
    这样操作会很麻烦的。
    所以我们需要优化一下上面的代码。
    我们发现:1.给表单元素添加name属性,名称与state相同。
    value={this.state.txet} name='txet'
    
    2.根据表单元素的类型获取对应的值
    const formValue = target.type === 'checkbox' 
     ? target.checked : target.value
    
    3.在change事件中通过{name}来需要改对应的state中的值
    this.setState({
        [name]:formValue
    })
    

    优化上面的代码 index.js

    import React from 'react'; //这个是react这个包,我们是需要的
    import ReactDOM from 'react-dom'; //这个是react的虚拟dom
    
    class ShowCont extends React.Component { 
    	state = {
        txet: '',
        city: 'sh',
        isChecked:''
      }
      // input
      changeTextHandler = (e) => { 
        // 获取当前的dom对象
        let target = e.target
        // 根据类型获取值(key值)
        let name = target.name
        // 获取表单中的值
        const formValue = target.type === 'checkbox' ? target.checked : target.value
        // 设置值
        this.setState({
          [name]:formValue
        })
      }
     
      // 获取的是所有的值
      getAllHandler = () => { 
        console.log('获取的是所有的值:',this.state)
      }
    
      render() { 
        return (
          <div>
            {/* 普通的input */}
            <input type="text" value={this.state.txet} name='txet' onChange={this.changeTextHandler} />
            {/* 下拉 */}
            <select value={this.state.city} name='city'  onChange={this.changeTextHandler} >
              <option value="sh">上海</option>
              <option value="bj">北京</option>
            </select>
            {/* 复选框 */}
            <input type="checkbox" checked={this.state.isChecked} name='isChecked' onChange={ this.changeTextHandler} />
            <button onClick={this.getAllHandler}>获取值</button>
          </div>
        )
      }
    }
    
    ReactDOM.render(<ShowCont/>, document.getElementById('root'))
    

    非受控组件的使用方式

    // 1.调用React.createRef()方法创建一个ref对象
    this.textRef = React.createRef()
    
    // 2.将创建好的ref对象添加到文本框中 
    <input type="text" ref={this.textRef} />
    
    // 3. 通过ref对象获取文本框中的值
    console.log('文本框中的值是:',this.textRef.current.value);
    

    index.js使用非受控组件

    import React from 'react'; //这个是react这个包,我们是需要的
    import ReactDOM from 'react-dom'; //这个是react的虚拟dom
    
    class ShowCont extends React.Component { 
      constructor() { 
        super()
        // 1.调用React.createRef()方法创建一个ref对象
        this.textRef = React.createRef()
      }
      getText = () => { 
        // 3. 通过ref对象获取文本框中的值
        console.log('文本框中的值是:',this.textRef.current.value);
      }
    
      render() { 
        return (
          <div>
            {/* 2.将创建好的ref对象添加到文本框中 */}
            <input type="text" ref={this.textRef} />
            <button onClick={this.getText}>获取文本框中的值</button>
          </div>
        )
      }
    }
    
    ReactDOM.render(<ShowCont/>, document.getElementById('root'))
    
    
  • 相关阅读:
    数据库日志文件很大,如何变小!
    导出到CSV文件乱码的问题
    JQuery 常用方法一览
    马云在阿里巴巴十周年晚会上的激情演讲
    jqueryeasyui(替代 extjs) 介绍
    写一个ajax程序就是如此简单
    ASP.NET 3.5之屠龙刀
    因并发而生,因云计算而热(专家聊天实录)
    专家访谈:为什么我们需要Erlang
    《写给大家看的设计书》封面评选结果揭晓
  • 原文地址:https://www.cnblogs.com/IwishIcould/p/16343782.html
Copyright © 2020-2023  润新知