受控组件和非受控组件

本文详细介绍了React中的受控组件和非受控组件。受控组件通过事件处理函数控制表单数据,而非受控组件则允许数据自由流动,通过setState更新状态。文中给出了实例代码,强调了在实际应用中如何管理和处理表单数据,并提醒避免过度使用ref。
摘要由CSDN通过智能技术生成

受控组件和非受控组件


一、React中的事件处理?

1. 通过onXxx属性指定事件处理函数(注意大小写)

1)	React使用的是自定义(合成)事件, 而不是使用的原生DOM事件——兼容性
(这里指的是React对onclick事件进行了再封装变成了onClick)

2)	React中的事件是通过事件委托方式处理的(委托给组件最外层的元素)——更高效
(类似于<u>  <li></li><li></li><li></li></u>都交给了最外层的u)

2. 通过event.target得到发生事件的DOM元素对象
我们给每个事件绑定响应函数,实际上都会默认把DOM对象作为event参数带过去,我们就可以通过event.target来获取
在这里插入图片描述
React官网让我们尽量少使用ref那么我们input刚刚好可以省略
(因为我们点击事件和要使用的事件在一个DOM对象上)

在这里插入图片描述

二、受控组件和非受控组件

以表单为例:定义一个包含表单的组件,输入用户名密码后,点击登录提升输入信息

1.受控组件(现用现取)

页面中的所有数据,都是现用现取
代码如下(示例):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<div id="test"></div>
<!--引入依赖库-->
<script src="js/react.development.js"></script>
<script src="js/react-dom.development.js"></script>
<script src="js/babel.min.js"></script>
<script type="text/babel">
  //1、定义组件
    class Login extends React.Component{
        //表单提交
        //这里的event是表单 里面的target属性是:<form action="https://www.baidu.com">用户名:<input type="text" name="username">密码:<input type="password" name="password"><button>确定</button></form>
        //但是我们可以通过 event.preventDefault()类似ajax阻止表单同步提交
        handleSubmit=(event)=>
        {
            event.preventDefault();//可以阻止action调转和无action时候的刷新动作
            const {username,password}=this;
            alert(username.value);
        }
        render()
        {
            return (  
                <form  action="https://www.baidu.com" 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>
            )
        }
    }
    //2、渲染
    ReactDOM.render(<Login/>,document.getElementById("test"));
</script>
</body>
</html>

2.非受控组件

代码如下(示例):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<div id="test"></div>
<!--引入依赖库-->
<script src="js/react.development.js"></script>
<script src="js/react-dom.development.js"></script>
<script src="js/babel.min.js"></script>
<script type="text/babel">
    //1、定义组件
    class Login extends React.Component{
        //初始化转态
        state={
            username:"",
            password:""
        }

        //将用户名在组件中更改
        changeUsername=(event)=>
        {
            this.setState({username:event.target.value});
        }
        //将密码在组件中更改
        changePassword=(event)=>
        {
            this.setState({password:event.target.value});
        }

        render()
        {
            return (
                <form  action="https://www.baidu.com" onSubmit={this.handleSubmit}>
                    用户名:<input onChange={this.changeUsername} type="text" name="username"/>
                    密码:<input onChange={this.changePassword} type="password" name="password"/>
                    <button >确定</button>
                </form>
            )
        }

    }
    ReactDOM.render(<Login/>,document.getElementById("test"));
</script>
</body>
</html>

在这里插入图片描述

表单提交书写

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<div id="test"></div>
<!--引入依赖库-->
<script src="js/react.development.js"></script>
<script src="js/react-dom.development.js"></script>
<script src="js/babel.min.js"></script>
<script type="text/babel">
    //1、定义组件
    class Login extends React.Component{
        //初始化转态
        state={
            username:"",
            password:""
        }

        //将用户名在组件中更改
        changeUsername=(event)=>
        {
            this.setState({username:event.target.value});
        }
        //将密码在组件中更改
        changePassword=(event)=>
        {
            this.setState({password:event.target.value});
        }
        //表单提交
        handleSubmit=(event)=>
        {
            event.preventDefault();//可以阻止action调转和无action时候的刷新动作
            const {username,password}=this.state;
            alert(`用户名是${username},密码是${password}`);
        }
        render()
        {
            return (
                <form  action="https://www.baidu.com" onSubmit={this.handleSubmit}>
                    用户名:<input onChange={this.changeUsername} type="text" name="username"/>
                    密码:<input onChange={this.changePassword} type="password" name="password"/>
                    <button >确定</button>
                </form>
            )
        }

    }
    ReactDOM.render(<Login/>,document.getElementById("test"));
</script>
</body>
</html>

官网已经说了勿过度使用ref,所以我们使用受控方式书写多一点


总结

受控组件和非受控组件,下一篇我们接着学习。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值