React学习总结

一、React是什么

React是用于构建用户界面的JS库,是一个将数据渲染为HTML视图的开源JS库

为什么学?

(1)原生JS操作DOM繁琐,效率低

(2)使用JS直接操作DOM,浏览器会进行大量的重绘重排

(3)原生JS没有组件化编码方案,代码复用低

八、高阶函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id = "div">

    </div>

</body>
<!-- 引入依赖 ,引入的时候,必须就按照这个步骤-->
<script src="../React-js/react.development.js" type="text/javascript"></script>
<script src="../React-js/react-dom.development.js" type="text/javascript"></script>

<script src="../React-js/babel.min.js"></script>

<!--引入对于组件标签的限制-->
<script src="../React-js/prop-types.js"></script>

<script type="text/babel">

/*
    高级函数:
    1.如果函数的参数是函数
    2.如果函数返回一个函数
    函数的珂里化:
    通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式
*/

    class Login extends React.Component{

        login = (event) =>{
            event.preventDefault(); //阻止表单提交
            console.log(this.name.value);
            console.log(this.pwd.value);
        }
 
        state = {name:"",pwd:""};

        saveType = (type) =>{
            return (event) => {
                this.setState({[type]:event.target.value});
            }
        }

        
        //因为事件中必须是一个函数,所以返回的也是一个函数,这样就符合规范了
        render() {
            return (
                <form action="http://www.baidu.com" >
                    用户名:<input onChange = {this.saveType('username')} type = "text" name ="username"/>
                    {/*直接调用回调函数也是可以的:将数据传递过去就可以*/}
                    用户名:<input onChange = {(event)=>{this.saveType('name',event)}} type = "text" name ="username"/>
                    密码<input onChange = {this.saveType('password')} type = "password" name ="password"/>
                    <button>登录</button>
                </form>
            )
        }
    }

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

注意:

1、<input onChange = {this.saveType('name')} type = "text" name ="username"/>在React中如果调用函数比如代码中this.saveType不加括号,会将该函数返回,下次发生onChange就会调用该函数;如果是this.saveType()加了括号,那么该函数在渲染时就会执行一次,而且返回的是该函数的返回值,所以上述代码中saveType函数中返回了一个回调函数来实现返回函数的效果

2、无论是在箭头函数还是普通函数中,如果我们不传入任何参数时,函数都会默认追加一个event参数

3、saveType = (type) =>{
            return (event) => {
                this.setState({[type]:event.target.value});
            }
        }

在JavaScript中,使用方括号 [] 来表示变量名通常是为了实现动态属性名。

在该函数中如果type没加方括号,会被认作字符串(允许字符串不加引号)

4、event参数是当React调用函数时传入的参数,而saveType不是由React调用的,所以不能接收到event参数,故需要使用高阶函数

saveType 函数是由开发者在组件类中调用的,用于生成具体的事件处理函数

在React中,事件处理函数的调用是由React框架在事件发生时自动进行的,并且会向事件处理函数传递一个事件对象作为参数。这个事件对象包含了事件相关的信息,比如事件类型、目标元素、触发事件的元素等。

这里是为什么 event 必须在返回的回调函数中接收的原因:

(1)事件驱动:在JavaScript中,事件处理是基于事件驱动的模型。当用户与页面交互时(如点击按钮、输入文本等),事件系统会创建一个事件对象并将其传递给注册的事件处理函数。

(2)函数调用上下文saveType 函数在定义时不知道何时会被调用,也不知道将与哪个具体事件相关联。因此,它不能接收 event 参数,因为它需要在具体的事件处理上下文中被调用。

(3)高阶函数saveType 作为一个高阶函数,其目的是创建并返回一个新的函数,这个新函数将在具体的事件处理上下文中被调用,并且接收 event 对象作为参数。

(4)闭包:返回的函数会捕获 saveType 调用时的上下文,包括 this 的值和任何在 saveType 被调用时已经定义的变量。这样,即使在不同的事件处理中使用返回的函数,它也能保持对 thistype 的正确引用。

(5)灵活性和复用性:通过将 event 作为返回函数的参数,saveType 函数可以被复用于不同的事件和不同的属性,只需在创建时指定不同的 type

5、<input onChange = {(event)=>{this.saveType('name',event)}} type = "text" name ="username"/>改写法也可将event,以及name参数共同传入saveType

6、this.saveType('password')不是传入了一个字符串参数吗
这里确实是传入了一个字符串,然后调用一个高阶函数saveType,返回实际处理事件的回调函数,而在 setState 调用中,使用方括号 [type] 是一种动态属性名的语法,它允许你使用变量 type 作为属性名

7、jsx语法问题:为什么回调函数要写箭头函数,而不是直接写函数

因为回调函数this会丢失,this 并不会指向 MyComponent 的实例,而是指向了全局对象(在非严格模式下)或者 undefined(在严格模式下)。这是因为在 JavaScript 中,普通函数的 this 是在调用时绑定的,而不是在定义时,handleClick 事件处理器在回调时 this 指向的是触发事件的 DOM 元素,而不是组件实例。而使用箭头函数可以避免这个问题,因为箭头函数没有自己的 this 上下文,它们会捕获定义时所在上下文的 this

所以箭头函数的函数体内的this对象,就是定义时所在的实例对象,而不是使用时所在的对象

//存在this指向问题
class MyComponent extends React.Component {
  handleClick() {
    console.log(this);
  }

  render() {
    return <button onClick={this.handleClick}>Click me</button>;
  }
}
方法一:使用.bind显示绑定
class MyComponent extends React.Component {
  handleClick() {
    console.log(this); // 这里 this 会指向 MyComponent 的实例
  }

  render() {
    return <button onClick={this.handleClick.bind(this)}>Click me</button>;
  }
}
方法二:使用箭头函数
class MyComponent extends React.Component {
  handleClick = () => {
    console.log(this);
  }

  render() {
    return <button onClick={() => this.handleClick()}>Click me</button>;
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/768215.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于iview.viewUI实现行合并(无限制/有限制合并)【已验证可正常运行】

1.基于iview.viewUI实现行合并&#xff08;列之间没有所属对应关系&#xff0c;正常合并&#xff09; 注&#xff1a;以下代码来自于GPT4o&#xff1a;国内直连GPT4o 只需要修改以下要合并的列字段&#xff0c;就可以方便使用啦 mergeFields: [majorNo, devNam, overhaulAdvic…

查找python包的安装路径

前提&#xff1a;自己已经安装过的包 1、打开任一python解析器&#xff0c;如VSCode 2、 以matplotlib为例&#xff0c;敲下面命令 import matplotlibprint(matplotlib.path) 3、运行代码就可以了 需要注意&#xff1a; 部分包没有path&#xff08;比如time&#xff09;&am…

使用 Java Swing 和 XChart 创建多种图表

在现代应用程序开发中&#xff0c;数据可视化是一个关键部分。本文将介绍如何使用 Java Swing 和 XChart 库创建各种类型的图表。XChart 是一个轻量级的图表库&#xff0c;支持多种类型的图表&#xff0c;非常适合在 Java 应用中进行快速的图表绘制。 1、环境配置 在开始之前&…

ElementUI中的el-table解决宽度问题 - 根据内容自动撑开

在使用element-ui中&#xff0c;会发现表格组件el-table在未指定宽度情况下&#xff0c;会自动计算并给表格宽度赋值。但实际开发中&#xff0c;有时需要根据内容实际长度自动撑开显示&#xff0c;由内容的多少而决定表格的宽度&#xff0c;而不是默认宽度为100%。在默认情况下…

韩语日常口语留学韩语旅游韩语口语柯桥语言培训

韩语每日一词打卡&#xff1a;행정적[행정적]【名词】行政 原文:나라는 항상 행정적 명령을 통해 경제운행을 조절합니다. 意思&#xff1a;国家经常通过行政命令去调节经济的运行。 【原文分解】 1、항상[항상]总是 &#xff0c;经常 2、나라[나라]国家 3、명령[명:녕]命令 …

计算机网络——数据链路层(点对点协议PPP)

点对点协议PPP的概述 对于点对点的链路&#xff0c;目前使用得最广泛的数据链路层协议是点对点协议 PPP (Point-to-Point Protocol)。 它主要应用于两个场景&#xff1a; 用户计算机与ISP之间的链路层协议就是点对点协议 PPP&#xff0c;1999年公布了回以在以太网上运行的PPP协…

JAVA每日作业day7.1-7.3小总结

ok了家人们前几天学了一些知识&#xff0c;接下来一起看看吧 一.API Java 的 API &#xff08; API: Application( 应用 ) Programming( 程序 ) Interface(接口 ) &#xff09; Java API 就是 JDK 中提供给我们使用的类&#xff0c;这些类将底层 的代码实现封装了起来&#x…

10 docker 安装 mysql详解

目录 一、安装mysql 1. 镜像获取 2. 简单版 2.1. 使用mysql镜像 2.2. 建库建表插入数据 2.3. 外部win 连接并插入中文数据测试 2.4. 简单版本问题 3. 创建容器-实战版 3.1. 新建容器实列并挂载卷 3.2. 新建my.cnf , 解决中文乱码 3.3. 重启容器验证 3.4. 总结 一、…

2024年精选推荐的16个向量数据库:提升你的AI应用性能

在人工智能时代&#xff0c;向量数据库已成为数据管理和AI模型不可或缺的一部分。向量数据库是一种专门设计用来存储和查询向量嵌入数据的数据库。这些向量嵌入是AI模型用于识别模式、关联和潜在结构的关键数据表示。随着AI和机器学习应用的普及&#xff0c;这些模型生成的嵌入…

聊一聊领域驱动和贫血

写在前面 前段时间跟领导讨论技术债概念时不可避免地提到了代码的质量&#xff0c;而影响代码质量的因素向来都不是单一的&#xff0c;诸如项目因素、管理因素、技术选型、人员素质等等&#xff0c;因为是技术债务&#xff0c;自然就从技术角度来分析&#xff0c;单纯从技术角…

UOS系统中JavaFx笔锋功能

关于笔锋功能&#xff0c;网上找了很久&#xff0c;包括Java平台客户端&#xff0c;Android端&#xff0c;相关代码资料比较少&#xff0c;找了很多经过测试效果都差强人意&#xff0c;自己也搓不出来&#xff0c;在UOS平台上JavaFX也获取不到压力值&#xff0c;只能用速度的变…

c++习题07-求小数的某一位

目录 一&#xff0c;问题 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;问题 二&#xff0c;思路 被除数a的类型设置为long long类型&#xff0c;a变量需要变大&#xff0c;需要更大的数据类型来存储除数b和指定的小数位置n为int类型&#xff0c;这两个变量的的…

计算机图形学入门23:蒙特卡洛路径追踪

1.前言 前面几篇文章介绍了Whitted-style光线追踪&#xff0c;还介绍了基于物理渲染的基础知识&#xff0c;包括辐射度量学、BRDF以及渲染方程&#xff0c;但并没有给出解渲染方程的方法&#xff0c;或者说如何通过该渲染方程计算出屏幕上每一个坐标的像素值。 Whitted-style光…

未来的钥匙在于过去:学历史的真正意义,震惊!历史竟然是偶然的?从历史中寻找未来的方向!

我们自幼接受的教育是&#xff0c;学历史是为了相信历史是必然的。中国人民必然战胜日寇的侵略&#xff0c;解放思想和改革开放必定会发生&#xff0c;和平和发展必定是世界的主题&#xff0c;中国经济必定是高速增长…… 然而&#xff0c;在真正的历史学家眼中&#xff0c;历史…

1分钟了解,预写日志WAL的核心思路...

上一篇《刷盘&#xff0c;还是不刷盘&#xff0c;是一个问题》中我们遇到了哪些问题&#xff1f; 1. 已提交事务未提交事务的ACID特性怎么保证&#xff1f; 画外音&#xff1a;上一篇中遇到的问题&#xff0c;主要是原子性与持久性。 2. 数据库崩溃&#xff0c;怎么实施故障恢复…

新声创新20年:无线技术给助听器插上“娱乐”的翅膀

听力损失并非现代人的专利&#xff0c;古代人也会有听力损失。助听器距今发展已经有二百多年了&#xff0c;从当初单纯的声音放大器到如今的全数字时代助听器&#xff0c;助听器发生了翻天覆地的变化&#xff0c;现代助听器除了助听功能&#xff0c;还具有看电视&#xff0c;听…

AD导入.step 3D封装

在网站查找想要的3D封装 https://www.3dcontentcentral.cn/ 下载 AD导入 在封装库下导入

融云上线 HarmonyOS NEXT 版 SDK,全面适配「纯血鸿蒙」生态

6 月 21 日&#xff0c;“2024 华为开发者大会”正式发布使用自研内核的原生鸿蒙系统 HarmonyOS NEXT&#xff0c;即 “纯血鸿蒙”。 同时&#xff0c;华为宣布开放“鸿蒙生态伙伴 SDK 市场”&#xff0c;甄选各类优质、安全的 SDK 加入聚合平台&#xff0c;助力各行业开发者轻…

数据结构初阶 堆的问题详解(三)

题目一 4.一棵完全二叉树的节点数位为531个&#xff0c;那么这棵树的高度为&#xff08; &#xff09; A 11 B 10 C 8 D 12 我们有最大的节点如下 假设最大高度为10 那么它的最多节点应该是有1023 假设最大高度为9 那么它的最多节点应该是 511 所以说这一题选B 题目二 …

08 docker Registry搭建docker私仓

目录 本地镜像发布流程 1. docker pull registry 下载镜像 2. docker run 运行私有库registry 3. docker commit 构建镜像 4. docker tag 修改新镜像&#xff0c;使之符合私服规范tag 5. 修改配置文件使之支持http 6. curl验证私服库上有什么镜像 7. push推送 pull拉取 …