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" />
相关推荐
广州华水科技12 小时前
单北斗GNSS变形监测系统在水利工程安全保障中的应用与优势分析
前端
yqcoder12 小时前
CSS 外边距重叠(Margin Collapsing):现象、原理与完美解决方案
前端·css
山楂树の13 小时前
图像标注大坑:img图片 + Canvas 叠加标注,同步放大后标注位置偏移、对不齐?详解修复方案及亚像素处理原理
前端·css·学习·canva可画
本山德彪13 小时前
我做了一个拼豆图纸生成器,把照片秒变图纸
前端
DTrader13 小时前
用TS无法实盘量化? - 实盘均线策略
前端·api
进击的夸父13 小时前
vfojs:Vue 超集架构,外壳React灵魂Vue
前端
编程老船长13 小时前
解决不同项目需要不同 Node.js 版本的问题
前端·vue.js
Wect13 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·算法·typescript
漫游的渔夫13 小时前
前端开发者做 Agent:别写成一次请求,用 5 步受控循环防止 AI 乱跑
前端·人工智能·typescript
薛定猫AI15 小时前
【深度解析】Gemma Chat 本地 AI 编程 Agent:Electron + MLX + 开源模型的离线 Vibe Coding 实战
javascript·人工智能·electron