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" />
相关推荐
爱勇宝8 小时前
大多数人不是在使用 AI 赚钱,而是在帮 AI 公司赚钱
前端·后端·程序员
冬奇Lab9 小时前
每日一个开源项目(第143篇):page-agent - 纯 JS 的网页 GUI Agent,无需截图、无需插件、无需后端
前端·人工智能·agent
To_OC11 小时前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
IT_陈寒14 小时前
React的这个渲染问题连官方文档都没说清楚
前端·人工智能·后端
追逐时光者15 小时前
别再满网找零散工具了,腾讯 QQ 浏览器这个“帮小忙”工具箱真能省时间
前端·后端
To_OC17 小时前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
Asmewill17 小时前
grep&curl命令学习笔记
前端
stringwu17 小时前
Flutter 开发必备:MVI 架构的高效实现指南
前端·flutter
用户21366100357218 小时前
Vue2组件化开发与父子通信
前端·vue.js
Momo__18 小时前
TypeScript satisfies 操作符——比 as 更安全的类型守门员
前端·typescript