龙空技术网

React-表单受控与非受控处理

啊咸蛋哟 73

前言:

如今各位老铁们对“react不写constructor”都比较注重,朋友们都想要学习一些“react不写constructor”的相关文章。那么小编在网上汇集了一些对于“react不写constructor””的相关内容,希望朋友们能喜欢,同学们一起来了解一下吧!

1、受控组件

html中的表单元素是可输入的,也就是有自己的可变状态,而,React中可变状态通常保存在state中,并且只能通过setState()方法来修改,React将state与表单元素值value绑定到一起,由state的值来控制表单元素的值,那么受控组件其实就是受到React控制的表单元素。

代码示例

1、在state中添加一个状态,作为表单元素的value值(控制表单元素的来源)

2、给表单元素绑定change事件,将表单元素的值设置为sate的值(控制表单元素值的变化)

// 受控组件示例Class FormExample extends React.Component {   //简化语法   state = {        txt: '',        content: '',        city:'shanghai',        isChecked: false   }   handleChange = e => {    this.setState({        txt: e.target.value    })    }   handleContent = e => {    this.setState({        content: e.target.value    })    }   handleCity = e => {    this.setState({        city: e.target.value    })    }   handleChecked = e => {    this.setState({       isChecked: e.target.checked    })    }    render() {        return (            <div>                {/* 文本框 */}                <input type="text" value={this.state.txt} onChange={this.handleChange} />                <br/>                {/* 富文本框 */}                <textarea value={this.state.content} onChange={this.handleContent}></textarea>                <br/>                {/* 下拉框 */}                <select value={this.state.city} onChange={this.handleCity}>                    <option value="shanghai">上海</option>                    <option value="shenzhen">深圳</option>                    <option value="guangdong">广东</option>                </select>                <br/>                {/* 复选框 */}                <input type="checkbox" checked={this.state.isChecked} onChange={this.handleChecked} />            </div>        )    }}

上面的代码,事件方法有一点啰嗦,可以进一步优化。

// 多表单元素优化Class FormExample extends React.Component {   state = {        txt: '',        content: '',        city:'bj',        isChecked: false   }  //  1 给表单元素添加name属性,名称与state相同  //  2 根据表单元素类型获取对应值  //  3 在change事件处理程序中通过[name] 来修改对应的state   handleForm = e => {        // 获取当前DOM对象        const target = e.target        // 根据类型获取值        const value = target.type === 'checkbox'            ? target.checked            : target.value        // 获取name        const name = target.name        this.setState({           [name]: value        })    }    render() {        return (            <div>                {/* 文本框 */}                <input  name="txt" type="text"value={this.state.txt} onChange={this.handleChange} />                <br/>                {/* 富文本框 */}                <textarea name="content" value={this.state.content} onChange={this.handleContent}></textarea>                <br/>                {/* 下拉框 */}                <select name="city" value={this.state.city} onChange={this.handleCity}>                    <option value="shanghai">上海</option>                    <option value="shenzhen">深圳</option>                    <option value="guangdong">广东</option>                </select>                <br/>                {/* 复选框 */}                <input name="isChecked" type="checkbox" checked={this.state.isChecked} onChange={this.handleChecked} />            </div>        )    }}
2、非受控组件

借助于ref, 使用原生DOM方式来获取表单元素值,ref的作用是获取DOM或组件

// 非受控组件class App extends React.Component {    constructor() {        super()        // 1. 调用React.createRef()方法创建一个ref对象        this.txtRef = React.createRef()    }        getTxt = () => {        // 3. 通过ref对象获取到文本框的值        console.log('文本框值为', this.txtRef.current.value)    }    render() {        return(            <div>                 // 2. 将创建好的ref对象添加到文本框中                <input type="text" ref={this.txtRef} />                <button onClick={this.getTxt}>获取文本框的值</button>            </div>        )    }}

#前端##失业##每日一诗#

------------------------------------------------------

秦时明月汉时关,

万里长征人未还。

但使龙城飞将在,

不教胡马度阴山。

------ 出塞 【唐】王昌龄

标签: #react不写constructor