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" />
相关推荐
qq_5295993813 分钟前
react js循环滚动
前端·javascript·react.js
索西引擎24 分钟前
【React】严格模式:开发阶段质量保障的静态分析机制
前端·react.js·前端框架
玉宇夕落31 分钟前
详细流式输出学习
前端
秃头披风侠_郑37 分钟前
【uniapp】一文让你学会微信小程序+APP+H5全平台实战指南
前端·微信小程序·uni-app
嘟嘟071737 分钟前
从零搞懂 RAG 文档处理:逐行拆解 Loader 和 Splitter,一行代码背后发生了什么
前端
come1123440 分钟前
Vue 3 与现代 JavaScript 常用语法指南
前端·javascript·vue.js
dsyyyyy110141 分钟前
用JavaScript实现排序算法
开发语言·javascript·排序算法
槑有老呆43 分钟前
从零搭建 LLM 流式对话前端:一文读懂 SSE、二进制流与 Vue 3 响应式
前端·javascript
没落英雄43 分钟前
7. 从零开始搭建一个 AI Agent —— UI 卡片渲染系统
前端·人工智能·架构
前端缘梦1 小时前
LangGraph 核心特性技术详解:流式输出、持久化、记忆体系与中断实战。
前端·人工智能·程序员