6.收集表单数据

在大多数情况下,我们推荐使用受控组件来处理表单数据。在一个受控组件中,表单数据是由 React 组件来管理的。另一种替代方案是使用非受控组件,这时表单数据将交由 DOM 节点来处理。

1.非受控组件(即存即用)

//1.创建组件
        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="text" name = "password"/>
                        <button>登录</button>
                    </form>
                )
            }
        }
        //2.渲染
        ReactDOM.render(<Login />, document.getElementById('test'))

2.受控组件(将表单信息存入state中,再从state中取用)

//1.创建组件
        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="text" name = "password"/>
                        <button>登录</button>
                    </form>
                )
            }
        }
        //2.渲染
        ReactDOM.render(<Login />, document.getElementById('test'))

3. 柯里化

概念:
高阶函数:
1. 若A函数,接受的参数是一个函数,那么A就可以成为高阶函数
2. 若A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函数
例如:Promise、setTimeout、arr.map()
函数柯里化:通过函数调用继续返回函数

上述问题用柯里化表达可减少函数的定义量

        //1.创建组件
        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="text" name="password" />
                        <button>登录</button>
                    </form>
                )
            }
        }
        //2.渲染
        ReactDOM.render(<Login />, document.getElementById('test'))

4. 另一种表达

标签中的onChange属性需要接收一个函数,如果对该函数传参,则含义就变为了调用该函数,onChange属性无法正常接收,柯里化方式是将该函数的返回值赋给onChange,既实现了传参,又传递了函数。
当然,我们也可以直接在标签中写入一个函数,来接收参数,表达如下:

    //1.创建组件
    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="text" name="password" />
                    <button>登录</button>
                </form>
            )
        }
    }
    //2.渲染
    ReactDOM.render(<Login />, document.getElementById('test'))
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容