zoukankan      html  css  js  c++  java
  • (六)React的事件处理,受控非受控组件,高阶函数和函数柯里化

    (六)React的事件处理,受控非受控组件,高阶函数和函数柯里化

    事件简介:

        (1).通过onXxx属性指定事件处理函数(注意大小写)
             a.React使用的是自定义(合成)事件, 而不是使用的原生DOM事件 —————— 为了更好的兼容性
             b.React中的事件是通过事件委托方式处理的(委托给组件最外层的元素) ————————为了的高效
        (2).,通过event.target得到发生事件的DOM元素对象 ——————————不要过度使用ref
    其实就是告诉你react是怎么使用相应的事件

    受控组件和非受控组件

    案例就是写一个表单 获取你所输入的组件值

    非受控组件:

    就是获取数据就是你需要input的数据时候然后就获取 即用即获取

    	//创建组件
    		class Login extends React.Component{
    			handleSubmit = (event)=>{
    				event.preventDefault() //阻止表单提交
    				const {username,password} = this
    				alert(`你输入的用户名是:${username.value},你输入的密码是:${password.value}`)
    			}
    			render(){
    				return(
    					<form onSubmit={this.handleSubmit}>
    						用户名:<input ref={c => this.username = c} type="text" name="username"/>
    						密码:<input ref={c => this.password = c} type="password" name="password"/>
    						<button>登录</button>
    					</form>
    				)
    			}
    		}
    		//渲染组件
    		ReactDOM.render(<Login/>,document.getElementById('test'))
    

    受控组件:

    指的就是没有双向数据绑定 需要使用相关事件进行获取相关的数据 从而进行数据上传

    		//创建组件
    		class Login extends React.Component{
    
    			//初始化状态
    			state = {
    				username:'', //用户名
    				password:'' //密码
    			}
    
    			//保存用户名到状态中
    			saveUsername = (event)=>{
    				this.setState({username:event.target.value})
    			}
    
    			//保存密码到状态中
    			savePassword = (event)=>{
    				this.setState({password:event.target.value})
    			}
    
    			//表单提交的回调
    			handleSubmit = (event)=>{
    				event.preventDefault() //阻止表单提交
    				const {username,password} = this.state
    				alert(`你输入的用户名是:${username},你输入的密码是:${password}`)
    			}
    
    			render(){
    				return(
    					<form onSubmit={this.handleSubmit}>
    						用户名:<input onChange={this.saveUsername} type="text" name="username"/>
    						密码:<input onChange={this.savePassword} type="password" name="password"/>
    						<button>登录</button>
    					</form>
    				)
    			}
    		}
    		//渲染组件
    		ReactDOM.render(<Login/>,document.getElementById('test'))
    

    高阶函数和函数柯里化

    高阶函数:如果一个函数符合下面2个规范中的任何一个,那该函数就是高阶函数。
        1.若A函数,接收的参数是一个函数,那么A就可以称之为高阶函数。
        2.若A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函数。
    常见的高阶函数有:Promise、setTimeout、arr.map()等等

    函数的柯里化:通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式。
        function sum(a){
            return(b)=>{
                return (c)=>{
                    return a+b+c
                }
            }
        }

    重点记忆:(怎么解决event和传入的参数 回调参数后边写括号(保证返回值是函数))

    在页面结构中调用函数不能直接在后边写上小括号 比如 onchange={ this.saveData(‘keyName’) } ,这样的后果就会直接运行完成了。
    为什么呢? 这样写就是把saveData的返回值当做了回调,而不是把saveData这个方法作为回调,所以onchange这个方法就没有去执行你这个saveData了

    举例子:使用表单输入数据 最后展示出来输入的数据
    下面的onChange写的回调函数把自己的的标识(username)传了进去,但是上面也说了,你这样写括号就是直接把函数的返回值给了Onchange作为回调,而不是每次调用你这个函数作为回调。而且你这个的返回值是undefined所以就不会一直去执行了,怎么解决,就是直接返回一个函数作为onChange的回调 ()=>{}
    这样子就来可以解决undefined不执行的问题了。而且你的这个event就是在这个匿名函数里面的。为什么 因为onChange的回调函数就是你的这个返回值,事件源本事的event当然就是在这里。所以这就是高阶函数。。

    class Login extends React.Component{
    			//初始化状态
    			state = {
    				username:'', //用户名
    				password:'' //密码
    			}
    
    			//保存表单数据到状态中
    			saveFormData = (dataType)=>{
    				return (event)=>{
    					this.setState({[dataType]:event.target.value})
    				}
    			}
    
    			//表单提交的回调
    			handleSubmit = (event)=>{
    				event.preventDefault() //阻止表单提交
    				const {username,password} = this.state
    				alert(`你输入的用户名是:${username},你输入的密码是:${password}`)
    			}
    			render(){
    				return(
    					<form onSubmit={this.handleSubmit}>
    						用户名:<input onChange={this.saveFormData('username')} type="text" name="username"/>
    						密码:<input onChange={this.saveFormData('password')} type="password" name="password"/>
    						<button>登录</button>
    					</form>
    				)
    			}
    		}
    		//渲染组件
    		ReactDOM.render(<Login/>,document.getElementById('test'))
    

    另一种方法解决 不用函数的柯立化解决

    	//创建组件
    		class Login extends React.Component{
    			//初始化状态
    			state = {
    				username:'', //用户名
    				password:'' //密码
    			}
    
    			//保存表单数据到状态中
    			saveFormData = (dataType,event)=>{
    				this.setState({[dataType]:event.target.value})
    			}
    
    			//表单提交的回调
    			handleSubmit = (event)=>{
    				event.preventDefault() //阻止表单提交
    				const {username,password} = this.state
    				alert(`你输入的用户名是:${username},你输入的密码是:${password}`)
    			}
    			render(){
    				return(
    					<form onSubmit={this.handleSubmit}>
    						用户名:<input onChange={event => this.saveFormData('username',event) } type="text" name="username"/>
    						密码:<input onChange={event => this.saveFormData('password',event) } type="password" name="password"/>
    						<button>登录</button>
    					</form>
    				)
    			}
    		}
    		//渲染组件
    		ReactDOM.render(<Login/>,document.getElementById('test'))
    
    咫尺远近却无法靠近的那个你,才敢让你发觉你并不孤寂
  • 相关阅读:
    java基础之java今生前世
    java线程的方便调用方式
    await和async更多的理解
    asp.net mvc webapi 实用的接口加密方法
    微信小程序开发心得
    为IEnumerable<T>添加RemoveAll<IEnumerable<T>>扩展方法--高性能篇
    微软常用的组件设计思想-‘工厂的工厂类’
    尝试asp.net mvc 基于controller action 方式权限控制方案可行性
    cookie 和session 详解
    sql注入详解
  • 原文地址:https://www.cnblogs.com/tcz1018/p/15407133.html
Copyright © 2011-2022 走看看