React入门学习笔记2

jsx语法规则

  1. 定义虚拟DOM时,不要写引号。
  2. 标签中混入JS表达式时要用{ }。
  3. 样式的类名指定不要用class,要用className。
  4. 内联样式,要用style={{key:value}}的形式去写。
  5. 只有一个根标签
  6. 标签必须闭合
  7. 标签首字母
    1. )若小写字母开头,则将该标签转为html中同名元素,若html中无该标签对应的同名元素,则报错
    2. )若大写字母开头,react就去渲染对应的组件,若组件没有定义,则报错。


js语句和js表达式

一定注意区分:【js语句(代码)】与【js表达式】

1.表达式:一个表达式会产生一个值,可以放在任何一个需要值的地方

下面这些都是表达式:

  • (1). a
  • (2). a+b
  • (3). demo(1)
  • (4). arr.map()
  • (5). function test () {}

2.语句(代码):

下面这些都是语句(代码):

  • (1).if(){}
  • (2).for(){}
  • (3).switch(){case:xxx}

{ }中是放JS表达式!


模块与组件、模块化与组件化的理解

模块(当应用的js都以模块来编写的,这个应用就是一个模块化的应用)

  1. 理解:向外提供特定功能的js程序,一般就是一个js文件e
  2. 为什么要拆成模块:随着业务逻辑增加,代码越来越多且复杂。
  3. 作用:复用 js,简化js 的编写,提高js运行效率

组件(当应用是以多组件的方式实现的,这个应用就是一个组件化的应用)

  1. 理解:用来实现局部功能效果的代码和资源的集合(html/css/js/image等等)
  2. 为什么:一个界面的功能更复杂
  3. 作用:复用编码,简化项目编码,提高运行效率

组件实践

  • 函数式组件(适用于简单组件的定义)
  • class式组件(适用于复杂组件的定义)

 记住前面说的,组件标签是大写开头哦

函数式组件

执行力ReactDOM.render(<MyComponent />,document.getElementById('test'))之后,发送了什么?

        1.React解析组件标签,找到了MyComponent组件

        2.发现组件是使用函数定义的,随后调用该函数,将返回的虚拟DOM转为真实DOM,随后出现在页面中。

函数式组件函数名就是组件名

同理,类式组件类名就是组件名

类式组件

执行了ReactDOM.render(<MyComponent />,document.getElementById('test'))之后,发送了什么?

        1.React解析组件标签,找到了MyComponent组件。
        2.发现组件是使用类定义的,随后new出来该类的实例,并通过该实例调用到原型上的render方法。

        3.将render返回的虚拟DOM转为真实DOM,随后呈现在页面中。


组件实例三大属性

1.state

实例讲解

构造函数中的this就是指向组件实例对象

只有通过组件实例调用的方法,方法中的this才不是undefined,而是指向实例对象。

如果渲染的时候在标签onClick属性中直接写this.方法,相当于直接把该方法拉出来赋给了onClick,当点击时是直接触发该方法本身而不是用组件实例去调用的。

类中的方法自动开启了局部的严格模式,所以类中方法的this为undefined。

但是呢,这个样子虽然可以唱成功让我们在方法中获取到组件实例对象

我们顺理成章就会想着用this.state.isHot=!this.state.isHot去修改isHot的值。

但打印出来发现值是改了可是react不认。

 

 状态(state)不可直接更改,我们需要借助一个内置的API更改——setState

 注意这里虽然是说是setState,但它进行的是一个更新操作而不是直接替换

所以我们可以使用setState灵活修改state中的部分值

在上面的程序中

构造器调用几次?

render调用几次?

方法changeWeather调用几次?

——我们可以在它们内部的第一行进行输出操作,然后我们就可以通过控制台查看输出情况获得答案

 所以

构造器调用几次?——1次

render调用几次?——1+n次

方法changeWeather调用几次?——点几次调几次

触发方法时,是先调用changeWeather,再进行渲染render


虽然上面那样子写很标准且没什么毛病,但是通过上面一系列我们发现实在是太麻烦了,如果我们有很多个类中方法,构造器中内容将会变得非常累赘

其实我们可以大大精简上面的代码,根本不需要用到构造器,在类中赋值语句相当于直接给类添加属性。

所以我们不需要在构造器中初始化state,我们可以把它提到外面来

而方法也不能简单地直接像上面那样写,应该使用赋值语句的形式+箭头函数。

箭头函数的特点是,在箭头函数内调用this,它会从箭头函数外面寻找this。

这样子一操作,代码就变成了这样子:

理解

(1)state是组件对象最重要的属性,值是对象(可以包含多个key-value 的组合)

(2)组件被称为"状态机",通过更新组件的state来更新对应的页面显示(重新渲染组件)

注意点

1)组件中 render 方法中的this为组件实例对象
2)组件自定义的方法中 this 为 undefined,如何解决?
        a.强制绑定this:通过函数对象的 bind()
        b.箭头函数
3)状态数据,不能直接修改或更新,要通过setState


2.props

实例讲解

回顾...展开运算符的用法

原生js中不能使用...展开运算符展开对象,但可以使用花括号加展开运算符进行深拷贝

直接用赋值语句的话相当于改变指向,不等于复制赋值。

在babel+react的作用下,可以使用后{...对象} 展开对象,但是仅仅适用于标签属性的传递。

如果要对prop传值进行类型限定和默认值设置

(记得导包)

 

应像下面这样子在类里面设置:

 函数式组件也可以使用props

 如果要对函数组件props进行限制

则放在函数外面,直接对函数组件实例添加限制

理解

(1)每个组件对象都会有props(properties的简写)属性

(2)组件标签的所有属性都保存在 props 中

作用

(1)通过标签属性从组件外向组件内传递变化的数据

(2)注意:组件内部不要修改 props 数据·(因为是只读的)

props总结

1)内部读取某个属性值

this.props.name

2)对props中的属性值进行类型限制和必要性限制

第一种方式(React v15.5开始已弃用)

 内置于React中,后进行改进,把prop-types库提取出来,减轻了React的重量

第二种方式(新):

使用prop-types库进行限制(需要引入prop-types库)

 

3)扩展属性:将对象的所有属性通过props传递

4)默认属性值

 

5)组件类的构造函数

3.refs与事件处理

理解

组件内的标签可以定义ref属性来标识自己

编码

有三种形式

(1)字符串形式的ref

注意这里是双引号 

注意,这种方法已经要被废弃了,官方不推荐使用

(2)回调形式的ref

 注意内联函数写法更新过程中会执行两次

 可以通过定义成class的绑定函数解决(类绑定)

 

(3)createRef创建ref容器

   

React.createRef调用后可以返回一个容器,该容器可以存储被ref所标识的节点

但!该容器是"专人专用"的!

但!这个方法是当前React最常用也是最推荐使用的。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023-08-05——JVM Method Area(方法区)

方法区 Method Area&#xff08;方法区&#xff09; 方法区是指被所有线程共享的&#xff0c;字段和方法字节码&#xff0c;以及一些特殊方法&#xff0c;如构造函数&#xff0c;接口代码在此定义&#xff0c;简单的说就是所有的定义方法信息都保存在此区域&#xff0c;此区域…

selenium 和 chromedriver 使用的一些总结

1 selenium 下载地址 selenium PyPIhttps://pypi.org/project/selenium/ 2 chromedriver 下载地址 &#xff0c;可以下载最新版的 chromedriver ChromeDriver - WebDriver for Chrome - Downloadshttps://chromedriver.chromium.org/downloadsChrome for Testing availabi…

【沁恒蓝牙mesh】CH58x flash分区与数据存储管理

本文主要介绍了 沁恒蓝牙芯片 CH58x 的flash 分区与数据存储管理 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xff1a;欢迎访问我的 Ethernet_Comm 博客主页&…

hcip的mgre和ospf实验

题目 拓扑图 一、配置环回和IP地址 R1 < Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]sysname r1 [r1]int g0/0/1 [r1-GigabitEthernet0/0/1]ip add 64.1.1.1 24 Aug 4 2023 18:56:07-08:00 r1 %%01IFNET/4/LINK_STATE(l)[0]:The line protocol…

LinkedList和ArrayList有什么区别?

ArrayList和LinkedList的大致区别&#xff1a; ArrayList是实现了基于动态数组的数据结构&#xff0c;LinkedList基于链表的数据结构。 对于随机访问get和set&#xff0c;ArrayList觉得优于LinkedList&#xff0c;因为LinkedList要移动指针。 对于新增和删除操作add和remov…

vue页面布局

布局 用element-plus自带的布局&#xff1b; 左边菜单 用他的Menu 菜单、自带收缩和展开&#xff1b;数据可以接口获取或者写死&#xff1b; 使用的如下操作、把主题和默认打开的index存到缓存中 头部&#xff1b; 简单的先分成左右&#xff1b;再简单的分成左右 1、左…

高通滤波器,低通滤波器

1.高通滤波器是根据像素与邻近像素的亮度差值来提升该像素的亮度。 import cv2 import numpy as np from scipy import ndimagekernel_3_3 np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]]) print(kernel_3_3) kernel_5_5 np.array([[-1,-1,-1,-1,-1],[-1,1,2,1,-1],[-1,2,4,2,-…

FDM3D打印系列——超可动可变形机体打印

大家好&#xff0c;我是阿赵。继续来分享一下3D打印的成果。   这次打印的对象不得了&#xff0c;是超时空要塞系列的可变形VF战机。打印完这个模型&#xff0c;绝对是学习到了很多的东西&#xff0c;下面给大家分享一下。 一、成果展示&#xff1a; 不要怀疑&#xff0c;不…

Elasticsearch 商业启示

上月的“红帽事件”&#xff0c;说明开源软件的“客服模式”行不通&#xff0c;那么&#xff0c;开源软件如何赚钱呢&#xff1f;既不能卖软件&#xff0c;又不能卖支持服务&#xff0c;该怎么办呢&#xff1f;我现在的看法是&#xff0c;只剩下一种模式是可行的&#xff0c;开…

Java 监听Mysql binlog

使用 mysql-binlog-connector-java 1. mysql-binlog-connector-java 官网 2. Java代码中&#xff0c;如何监控Mysql的binlog&#xff1f; 前置条件 1. mysql服务器表结构 CREATE TABLE student (id int NOT NULL AUTO_INCREMENT,name varchar(255) CHARACTER SET utf8mb4 C…

HCIA-datacom数通题库和录播视频资料

HCIA-Datacom&#xff0c;是华为数通认证的初级考试&#xff0c;培训与认证具备数通基础通用知识和技能水平的工程师&#xff0c;只是入门了解数通的一些基础通用知识&#xff0c;适用于小白了解和学习数通知识点起点。 个人建议还是有必要考的&#xff0c;如果在企业考试考试…

Java自定义校验注解实现List、set集合字段唯一性校验

文章目录 一&#xff1a; 使用场景二&#xff1a; 定义FieldUniqueValid注解2.1 FieldUniqueValid2.2 注解说明2.3 Constraint 注解介绍2.4 FieldUniqueValid注解使用 三&#xff1a;自定义FieldUniqueValidator校验类3.1 实现ConstraintValidator3.2 重写initialize方法3.3 重…

mfc140.dll缺失怎么修复?教你下载安装mfc140.dll文件

mfc140.dll缺失要解决其实还是挺简单的&#xff0c;而且有非常的多的方法&#xff0c;只要你了解这个文件&#xff0c;那么你就能快速的修复mfc140.dll文件&#xff0c;其实所谓的修复就是mfc140.dll文件的下载安装&#xff0c;好了&#xff0c;废话不多少&#xff0c;一起来看…

Selenium入门详细教程+实例演示

目录 1.Selenium概述 1.1什么是Selenium 1.2Selenium的优势 1.3Selenium WebDriver原理 2.Selenium环境搭建 3.Selenium 简单示例 4.八大元素定位 4.1定位方式 4.2定位方式的用法 5.Selenium API 5.1WebDriver 常用 API 5.2WebElement 常用 API 5.3代码示例 6.元素等待机…

linux-MySQL的数据目录

总结&#xff1a; window中的my.ini linux 中 /etc/my.cnfwindow中的D:\soft\mysql-5.7.35-winx64\data linux 中 /var/lib/mysql 1.查找与mysql有关的目录 find / -name mysql [rootVM-4-6-centos etc]# find / -name mysql /opt/mysql /etc/selinux/targeted/tmp/modul…

【MySQL】使用C/C++连接MySQL数据库

【MySQL】使用C/C连接MySQL数据库 验证使用select特殊点 本文目的&#xff1a;使用MySQL提供的CAPI完成对数据库的操作 验证 #include <iostream> #include <mysql/mysql.h>int main() {std::cout<<"mysql cilent version: "<<mysql_get_cl…

Java8 文件工具类 FileUtils(持续更新中)

1. Java8 文件处理 使用 Java8 的 java.nio.file 方法&#xff0c;来进行文件处理。 1.1. 读文件 所有内容一次读出来&#xff0c;结果为字符串。 1.1.1. 代码 /*** 读取文件** param path 文件路径* return 文件内容&#xff08;字符串&#xff09;*/public static String…

基础篇:多线程所需知识:RAII接口模式对生产者和消费者封装以及多batch实现

我们先来弄一个最基础的infer类&#xff1a; class Infer{ public: bool load_model(const string &file){context_ file;return true;} void forward(){if(context_.empty()){printf("加载模型异常\n");return;}printf("使用%s进行推理\n " , contex…

【LNMP】LNMP

LNMP&#xff1a;是目前成熟的企业网站的应用模式之一&#xff0c;指的是一套协同工作的系统和相关软件&#xff1b;能够提供静态页面服务&#xff0c;也可以提供动态web服务 L Linux系统&#xff0c;操作系统N Nginx网站服务&#xff0c;前端&#xff0c;提供前端的静态…

Redis入门

0目录 1.Redis入门 2.Redis定义&#xff1b;特点及数据类型 3.Value为List类型 4.Value值类型为Set 5.Value值类型为Hash 6.Value值类型为Zset 1.Redis入门 Redis入门 解压包&#xff0c;运行redis-server.exe 安装可视化软件测试链接 命名测试链接 点击确定 2.Redis…