0
点赞
收藏
分享

微信扫一扫

React基础 -- 表单及高阶组件

王栩的文字 2022-03-13 阅读 88

理解

  • 受控组件就是可以被 react 状态控制的组件
  • react 中,inputtextarea 等组件默认是非受控组件(输入框内部的值是用户控制,和React无关)但是也可以转化成受控组件,就是通过 onChange 事件获取当前输入内容,将当前输入内容作为 value 传入,此时就成为受控组件
  • 好处:可以通过 onChange 事件控制用户输入,使用正则表达式过滤不合理输入

非受控组件

代码演示

<!-- 引入react核心库 -->
<script src="../js/react.development.js"></script>
<!-- 引入react-dom,用于支持react操作DOM -->
<script src="../js/react-dom.development.js"></script>
<!-- 引入babel,用于将jsx转为js -->
<script src="../js/babel.min.js"></script>

<script type="text/babel">
    class Login extends React.Component {
        handleSubmit = (e) => {
            e.preventDefault()  // 阻止表单提交
            const { username, password } = this
            alert(`您输入的用户名是${username.value},密码是${password.value}`)
        }
        render() {
            return (
                <form onSubmit={this.handleSubmit}>
                    用户名:<input ref={cur => this.username = cur} type="text" name='username' />
                    密码:<input ref={cur => this.password = cur} type="password" name='password' />
                    <button>提交</button>
                </form>
            )
        }
    }

    ReactDOM.render(<Login />, document.getElementById('test'))
</script>

受控组件

代码演示

<!-- 引入react核心库 -->
<script src="../js/react.development.js"></script>
<!-- 引入react-dom,用于支持react操作DOM -->
<script src="../js/react-dom.development.js"></script>
<!-- 引入babel,用于将jsx转为js -->
<script src="../js/babel.min.js"></script>

<script type="text/babel">
    class Login extends React.Component {
        // 数据初始化
        state = {
            username: '',
            password: ''
        }

        // 保存用户名到状态中
        usernameEvent = (e) => {
            this.setState({ username: e.target.value })
        }
        // 保存密码到状态中
        passwordEvent = (e) => {
            this.setState({ password: e.target.value })
        }
        handleSubmit = (e) => {
            e.preventDefault()  // 阻止表单提交
            const { username, password } = this.state
            alert(`您输入的用户名是${username},密码是${password}`)
        }

        render() {
            return (
                <form onSubmit={this.handleSubmit}>
                    用户名:<input onChange={this.usernameEvent} type="text" name='username' />
                    密码:<input onChange={this.passwordEvent} type="password" name='password' />
                    <button>提交</button>
                </form>
            )
        }
    }

    ReactDOM.render(<Login />, document.getElementById('test'))
</script>

高阶函数

概念

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

  • 若A函数,接收的参数是一个函数,那么A就可以称之为高阶函数
  • 若A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函数
    • 常见的高阶函数:PromisesetTimeoutarr.map()等等

柯里化

  • 通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式
<!-- 引入react核心库 -->
<script src="../js/react.development.js"></script>
<!-- 引入react-dom,用于支持react操作DOM -->
<script src="../js/react-dom.development.js"></script>
<!-- 引入babel,用于将jsx转为js -->
<script src="../js/babel.min.js"></script>

<script type="text/babel">
    class Login extends React.Component {
        // 数据初始化
        state = {
            username: '',
            password: ''
        }

        saveFormData = (dataType) => {
            return (e) => {
                this.setState({ [dataType]: e.target.value })
            }
        }
        handleSubmit = (e) => {
            e.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'))
</script>
举报

相关推荐

0 条评论