React学习笔记【5】(受控与非受控组件 高阶函数及函数柯里化)

学习地址:https://www.bilibili.com/video/BV1wy4y1D7JT
官方文档:

非受控组件与受控组件

  1. 非受控组件
    现用现取(ref使用过多)
<script type="text/babel">
    class LogIn extends React.Component {
        // 提交事件
        handleSubmit = (event) => {
            event.preventDefault(); //阻止默认事件 阻止表单提交
            let { username, password } = this;
            alert(`您输入的用户名是:${username.value},您输入的密码是:${password.value}`);
        }
        render() {
            return (
                <div>
                    <form action="" onSubmit={this.handleSubmit}>
                        <label>用户名:</label>
                        <input type="text" placeholder="请输入用户名" ref={c => this.username = c} name="username" />  &nbsp;
                        <label>密码:</label>
                        <input type="password" placeholder="请输入密码" ref={c => this.password = c} name="password" />  &nbsp;
                        <button>登录</button>
                    </form>
                </div>
            )
        }
    };
    ReactDOM.render(<LogIn />, document.getElementById('test'));
</script>
  1. 受控组件
    页面中所有输入类的DOM,随着输入维护到state中,使用时直接从状态中去取。(ref使用较少)
<script type="text/babel">
    class LogIn extends React.Component {
        // 初始化数据
        state={
            username:'',
            password:''
        }
        // 赋值state.username
        changeUsername=(event)=>{
            this.setState({username:event.target.value});
        }
        // 赋值state.password
        changePassword=(event)=>{
            this.setState({password:event.target.value})
        }
        // 提交事件
        handleSubmit = (event) => {
            event.preventDefault();//阻止默认事件 阻止表单提交
            let { username, password } = this;
            alert(`您输入的用户名是:${this.state.username},您输入的密码是:${this.state.password}`);
        }
        render() {
            return (
                <div>
                    <form action="" onSubmit={this.handleSubmit}>
                        <label>用户名:</label>
                        <input type="text" placeholder="请输入用户名" onChange={this.changeUsername} name="username" />  &nbsp;
                        <label>密码:</label>
                        <input type="password" placeholder="请输入密码" onChange={this.changePassword} name="password" />  &nbsp;
                        <button>登录</button>
                    </form>
                </div>
             )
       }
    };
    ReactDOM.render(<LogIn />, document.getElementById('test'));
</script>

高阶函数:如果一个函数符合下面两个规范中的任何一个,那么该函数就是高阶函数

  1. 若A函数接收到的参数是一个函数,那么A函数就可以称之为高阶函数。
  2. 若A函数调用的返回值仍是一个函数,那么A就可以称之为高阶函数。

函数的柯里化:通过函数调用继续返回函数的方式,实现多次接受参数最后统一处理的函数编码形式。

<script type="text/babel">
    class LogIn extends React.Component {
        // 初始化数据
        state={
            username:'',
            password:''
        }
        // 表单赋值
        changeForm=(dataType)=>{
            return (event)=>{
                this.setState({[dataType]:event.target.value});
            }
        };
        // 提交事件
        handleSubmit = (event) => {
            event.preventDefault();//阻止默认事件 阻止表单提交
            let { username, password } = this;
            alert(`您输入的用户名是:${this.state.username},您输入的密码是:${this.state.password}`);
        }
        render() {
            return (
                <div>
                    <form action="" onSubmit={this.handleSubmit}>
                        <label>用户名:</label>
                        <input type="text" placeholder="请输入用户名" onChange={this.changeForm('username')} name="username" />
                        <label>密码:</label>
                        <input type="password" placeholder="请输入密码" onChange={this.changeForm('password')} name="password" />
                        <button>登录</button>
                    </form>
                 </div>
            )
        }
    };
    ReactDOM.render(<LogIn />, document.getElementById('test'));
</script>

不用函数柯里化的写法

<script type="text/babel">
    class LogIn extends React.Component {
        // 初始化数据
        state = {
            username: '',
            pasword: ''
        }
        // 表单赋值
        changeForm = (dataType, event) => {
            this.setState({ [dataType]: event.target.value });
        };
        // 提交事件
        handleSubmit = (event) => {
            event.preventDefault();//阻止默认事件 阻止表单提交
            let { username, password } = this;
            alert(`您输入的用户名是:${this.state.username},您输入的密码是:${this.state.password}`);
        }
        render() {
            return (
                <div>
                    <form action="" onSubmit={this.handleSubmit}>
                        <label>用户名:</label>
                        <input type="text" placeholder="请输入用户名" onChange={(event) => { this.changeForm('username', event) }} name="username" />  &nbsp;
                        <label>密码:</label>
                        <input type="password" placeholder="请输入密码" onChange={(event) => { this.changeForm('password', event) }} name="password" />  &nbsp;
                        <button>登录</button>
                    </form>
                </div>
            )
        }
    };
    ReactDOM.render(<LogIn />, document.getElementById('test'));
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值