美文网首页
react受控组件和非受控组件

react受控组件和非受控组件

作者: 水晶草720 | 来源:发表于2022-03-21 14:52 被阅读0次

1. 非受控组件

React 要编写一个非受控组件,可以使用ref 来从DOM节点中获取表单数据,就是非受控组件。例如下面的代码使用非受控组件接受一个表单的值:

import React, { Component } from 'react'
export default class App extends Component {
  myusername=React.createRef()
  render() {
    return (
        <div>
            {/* 非受控写法 */}
            <h1>登录页</h1>
            <input type="text" ref={this.myusername} defaultValue="huanhuan"/>
            <button onClick={()=>{console.log(this.myusername.current.value)}}>登录</button> 
            <button onClick={()=>{console.log(this.myusername.current.value="")}}>Reset</button> 
      </div>
    )
  }
}

2. 受控组件

在HTML中,标签<input>、<textarea>、<select>的值的改变通常是根据用户输入进行更新。在React中,可变状态通常保存在组件的状态属性中,并且只能使用 setState() 更新,而呈现表单的React组件也控制着在后续用户输入时该表单中发生的情况,以这种由React控制的输入表单元素而改变其值的方式,称为:“受控组件”。

import React, { Component } from 'react'
import Child from './components/Child'
export default class App extends Component {
    myusername = React.createRef()
    state = {
        username: 'kerwin'
    }
    render() {
        return (
            <div>
                {/* 受控写法  只需要通过控制 this.state 传值方式即可 */}
                <h1>登录页</h1>
                <input type="text" ref={this.myusername} value={this.state.username}
                   
                    onChange={(event) =>
                        {
                            console.log(event.target.value);
                            this.setState({
                            username:event.target.value
                            })
                        }
                    }/>
                <button onClick={() => { console.log(this.state.username); }}>登录</button>
                <button onClick={() => {
                    // console.log(this.myusername.current.value = "")
                    this.setState({
                        username:""
                        })
                }}>Reset</button>
                 {/* 子组件也可以通过传值方式 */}
                <Child myvalue={this.state.username}></Child>
            </div>
        )
    }
}

3. 受控组件案例 列表查询

import React, { Component } from 'react'
export default class Cinema extends Component {
    constructor() {
        super()
        this.state = {
            cinemalist: [{ cinameId: 1, name: "水晶草", address: "北京市朝阳区西大望路蓝堡国际中心1座2101" },
                { cinameId: 2, name: "李晓艺", address: "北京市通州区西大望路蓝堡国际中心1座2106" },
                { cinameId: 3, name: "李乐乐", address: "北京市朝阳区西大望路蓝堡国际中心1座2106" },
                { cinameId: 4, name: "李佳佳", address: "北京市朝阳区西大望路蓝堡国际中心1座2106" }],
            mytext:""
        }
    }
    //后面讲的声明周期函数 更适合发送ajax
    render() {
        return (
            <div>
                <input type="text" value={this.state.mytext} onChange={(evt) => {
                    this.setState({
                        mytext:evt.target.value
                    })
                }} />
                {
                    this.getCinemalist().map((item) =>
                        <dl key={item.cinameId}>
                            <dt>{item.name}</dt>
                            <dd>{item.address}</dd>
                        </dl>
                    )
                }
            </div>
        )
    }
    getCinemalist() {
        let mytext = this.state.mytext.toUpperCase()
        return this.state.cinemalist.filter(item => item.name.toUpperCase().includes(mytext) || item.address.toUpperCase().includes(mytext))
        
    }
}
// filter
//filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素

4. 受控组件案例 list增加和删除

import React, { Component } from 'react'
export default class app extends Component {
    a = 100;
    myref = React.createRef()

    state = {
      list:[{
          id: "1",
          mytext: "春天来了",
          isChecked:false
      },{
        id: "2",
          mytext: "冬天走了,春天还远吗",
          isChecked:false
    },{
        id: "3",
          mytext: "春天来了,夏天还远吗",
          isChecked:true
            }],
        mytext:""
    };
   
  render() {
      var newList= this.state.list.map((item,index) => <li key={index}>{item.key}</li> )
    return (
        <div>
            <input ref={this.myref} value={this.state.mytext} onChange={(event) => { this.setState({ mytext: event.target.value }) } } /> 
            <button onClick={this.handleClick2}>add2</button>
            <ul>
                {
                    this.state.list.map((item,index)=>
                        <li key={item.id}>
                            <input type="checkbox" checked={item.isChecked} onChange={() => 
                                this.handleChange(index)} />
                            <span style={{textDecoration:item.isChecked?"line-through":""}} dangerouslySetInnerHTML={{__html: item.mytext}}></span>
                            <input onClick={()=>this.handleDelClick(index)} type="button" value="del" />
                        </li>
                    )
                }
            </ul>         
            <div className={this.state.list.length === 0?'':'hidden'}> 待办事项暂无!</div>
      </div>
    )
    }
    handleChange = (index) => {
        console.log(index)
        let newlist = [...this.state.list]
        newlist[index].isChecked = !newlist[index].isChecked
        this.setState({
            list:newlist
        })
    }
    handleClick2 = () => {
        this.state.list.push({ "mytext": this.myref.current.value,id:Math.random()*111111})
      this.setState({list:this.state.list})
    }
    handleDelClick = (id) => {
        console.log("click2", id)
        let newlist = this.state.list.concat() //拷贝一个数组 slice(0)   [...arr]     Array.from(arr)  Object.assign([],arr);
        newlist.splice(id, 1)
        this.setState({list:newlist})
    }
}

相关文章

  • React 的几个注意点

    受控组件和无状态组件 非受控组件推荐使用受控组件来实现表单. 在受控组件中, 表单数据是有React组件处理如果让...

  • React 初探之 受控组件 VS 非受控组件

    概述 React 中的受控组件和非受控组件都是针对于表单数据而言的。React 推荐使用受控组件来处理表单数据。 ...

  • React 受控组件和非受控组件

    https://goshakkk.name/controlled-vs-uncontrolled-inputs-r...

  • [React]受控组件和非受控组件

    受控组件 我们先来看一个例子 我们要经常使用表单来搜集用户输入,例如 等元素都要绑定一个c...

  • react 受控组件和非受控组件

    受控组件 在html中, 表单元素 , , 一般保存自己的状态并根据用户的输入更新。在react中一般根据组...

  • React 受控组件和非受控组件

    1.受控组件的基本使用 在 HTML 中,表单元素(如