React的数据绑定

1、React的事件处理

(1)通过onXxx属性指定事件处理函数(注意大小写)

a.React使用的是自定义(合成)事件,而不是使用的是原生的DOM事件---为了更好的兼容性

b.React中的事件是通过事件委托方式处理的(委托给组件最外层的元素)----为了高效

(2)通过event.target得到发生事件的DOM元素对象-----不要过度使用ref

javascript 复制代码
<div id="test"></div>
<script>

    class Demo extends React.Component{
        const { inputRef1 } = this

        showData=()=>{
            alert(inputRef1.value)
        }

        showData2=(e)=>{
             alert(e.target.value)
        }
        render(){
            return (
                <input type="text" ref={ this.inputRef1 }  />
                <button onClick={ showData }>展示</button>

                 <input type="text" onBlur={ showData2 }/>
            )
        }
    }
ReactDOM.render( <Demo />,document.getElementById("test") )
</script>

由于第二个输入框的失焦事件是发生在它本身上的,可以利用绑定的事件的e.target,来获取它的DOM,从而获取数据

2、非受控组件

javascript 复制代码
<div id="test"></div>
<script>

    class Demo extends React.Component{
        
        showData=(e)=>{
            e.preventDefault() //阻止表单提交,默认刷新页面
            alert( this.username.value,this.passward.value )
        }

        render(){
            return (
                <form>
                    用户名:<input type="text" ref={ c=>this.username = c } name="username" />
                     密码:<input type="passward" ref={ c=>this.passward = c } name="passward"/>
                    <button onClick={ showData }>提交</button>
                </form>
                
            )
        }
    }
 ReactDOM.render( <Demo />,document.getElementById("test") )
</script>

这种在使用时获取数据的组件就是非受控组件

3、受控组件

javascript 复制代码
<div id="test"></div>
<script>

    class Demo extends React.Component{

        state={ 
            username:"",
            passward:""
        }

        saveUserName=(e)=>{
            this.setState({ username:e.target.value })
        }
        savePassward=(e)=>{
            this.setState({ passward:e.target.value })
        }

        showData=(e)=>{
            e.preventDefault() //阻止表单提交,默认刷新页面
            alert( this.state.username,this.state.passward )
        }

        render(){
            return (
                <form onClick={ showData }>
                    用户名:<input type="text" onChange={ this.saveUserName } name="username" />
                     密码:<input type="passward" onChange={ this.savePassward } name="passward"/>
                    <button>提交</button>
                </form>
                
            )
        }
    }
 ReactDOM.render( <Demo />,document.getElementById("test") )
</script>

页面上所有输入类的DOM,随着你的输入,就会把内容更新到状态state里,等到你使用的时候,可以直接从state里获取,类似于Vue的数据双向绑定,这就是受控组件。

4、高阶函数及函数柯里化

高阶函数

1、若函数A,接收的参数是一个函数,那么A就可以称之为高阶函数

2、若函数A,调用的返回值依然是一个函数,那么A也是高阶函数

如Promise、setTimeout、arr.map等

函数柯里化

通过函数调用继续返回函数的方式,实现多次接受参数最后统一处理的函数编码形式

对3部分进行优化

javascript 复制代码
<div id="test"></div>
<script>

    class Demo extends React.Component{

        state={ 
            username:"",
            passward:""
        }

        //保存表单数据到状态中
        saveFormData=(dataType)=>{
            return ( event )=>{
                this.setState({ [dataType]:event.target.value })
            }
        }

        showData=(e)=>{
            e.preventDefault() //阻止表单提交,默认刷新页面
            alert( this.state.username,this.state.passward )
        }

        render(){
            return (
                <form onClick={ showData }>
                    用户名:<input type="text" onChange={ this.saveFormData('username') } name="username" />
                     密码:<input type="passward" onChange={ this.saveFormData('passward') } name="passward"/>
                    <button>提交</button>
                </form>
                
            )
        }
    }
 ReactDOM.render( <Demo />,document.getElementById("test") )
</script>

解释

当 React 渲染这行代码时:

html 复制代码
<input type="text" onChange={this.saveFormData('username')} name="username" />

1、首先执行 this.saveFormData('username'):把字符串 'username' 传给 saveFormDatadataType 参数;

此时 saveFormData 函数开始执行:

javascript 复制代码
saveFormData = (dataType) => { // 此时 dataType = 'username'
  return (event) => { // 这行只是「返回一个函数」,内层函数还没执行
    this.setState({ [dataType]: event.target.value })
  }
}

执行结果:saveFormData('username') 执行后,返回了一个「待执行的内层函数」 (这个内层函数被赋值给了输入框的 onChange 属性);

2、你在输入框输入内容,触发 onChange 事件

当你在用户名输入框敲入「张三」时,输入框的 change 事件被触发:

React 会自动调用 onChange 上绑定的「内层函数」,并把「事件对象 event」传给这个内层函数;

此时内层函数开始执行,执行的代码是

javascript 复制代码
(event) => {
  // event.target 就是当前输入框元素,event.target.value 就是你输入的「张三」
  // [dataType] 是 ES6 计算属性名,等价于「username」
  this.setState({ username: '张三' })
}

5、不用柯里化的写法

html 复制代码
<div id="test"></div>
<script>

    class Demo extends React.Component{

        state={ 
            username:"",
            passward:""
        }

        //保存表单数据到状态中
        saveFormData=(dataType,event)=>{
            this.setState({ [dataType]:event.target.value })
        }

        showData=(e)=>{
            e.preventDefault() //阻止表单提交,默认刷新页面
            alert( this.state.username,this.state.passward )
        }

        render(){
            return (
                <form onClick={ showData }>
                    用户名:<input type="text" onChange={(event)=> { this.saveFormData('username',event) } } name="username" />
                     密码:<input type="passward" onChange={(event)=> { this.saveFormData('passward',event) } } name="passward"/>
                    <button>提交</button>
                </form>
                
            )
        }
    }
 ReactDOM.render( <Demo />,document.getElementById("test") )
</script>
html 复制代码
<input type="text" onChange={ event=> this.saveFormData('username',event) } name="username" />
相关推荐
爱看书的小沐1 小时前
【小沐杂货铺】基于Three.js渲染三维无人机Drone(WebGL / vue / react )
javascript·vue.js·react.js·无人机·webgl·three.js·drone
天若有情6734 小时前
从 try-catch 回调到链式调用:一种更优雅的 async/await 错误处理方案
前端·异常处理·前端开发·async·异步·await·异步编程
ShenJLLL8 小时前
vue部分知识点.
前端·javascript·vue.js·前端框架
恋猫de小郭9 小时前
你是不是觉得 R8 很讨厌,但 Android 为什么选择 R8 ?也许你对 R8 还不够了解
android·前端·flutter
PineappleCoder9 小时前
告别“幻影坦克”:手把手教你丝滑规避布局抖动,让页面渲染快如闪电!
前端·性能优化
武帝为此10 小时前
【Shell变量替换与测试】
前端·chrome
CappuccinoRose10 小时前
CSS 语法学习文档(十九)
前端·css·属性·flex·grid·学习资源·格式化上下文
雷电法拉珑11 小时前
财务数据批量采集
linux·前端·python