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" />
相关推荐
吹晚风吧9 小时前
解决vite打包,base配置前缀,nginx的dist包找不到资源
服务器·前端·nginx
weixin1997010801610 小时前
《施耐德商品详情页前端性能优化实战》
前端·性能优化
不想上班只想要钱10 小时前
模板里 item.xxx 报错 ,报 item的类型为未知
前端·vue
Irene199110 小时前
推荐 React 开发需要在 VS Code 中安装的插件
react.js
妖萌妹儿10 小时前
postman怎么做参数化批量测试,测试不同输入组合
开发语言·javascript·postman
阿琳a_10 小时前
在github上部署个人的vitepress文档网站
前端·vue.js·github·网站搭建·cesium
酉鬼女又兒10 小时前
零基础快速入门前端ES6 核心特性详解与蓝桥杯 Web 考点实践(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·职场和发展·蓝桥杯·es6·css3·html5
Zk.Sun11 小时前
【RK3588 Mali610 适配 Qt6 】
前端·javascript·vue.js
不想吃菠萝11 小时前
vue3+ts 使用postcss-pxtorem依赖进行rem适配
前端·javascript·vue.js·postcss
人民广场吃泡面11 小时前
React新手快速入门学习指南(2026最新版)
前端·react.js·前端框架