IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 受控组件和非受控组件 -> 正文阅读

[JavaScript知识库]受控组件和非受控组件

受控组件和非受控组件


一、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,所以我们使用受控方式书写多一点


总结

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

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-09 11:33:50  更:2021-12-09 11:35:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:50:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码