react-类组件1

类组件:

import { Component } from "react";class App extends Component {constructor() {super();this.state = {message: "xxxxx",};}render() {return (<div><div>{this.state.message}</div></div>);}
}export default App;
import React from "react";
import ReactDOM from "react-dom/client";import App from "./App";
//react18
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<React.StrictMode><App /></React.StrictMode>
);

this指向问题

cli(){ console.log(this)}默认情况下this是undefined。
在正常的dom操作中监听点击事件,监听的函数的this是节点对象。
而react并不是直接渲染成真实dom,它本质上是一个React的Element对象。在监听的时候,函数并没有绑定this,所以默认情况想就是一个undefined。

直接调用相当于默认调用
在这里插入图片描述
可以通过bind给它绑定this,render里面有this,指向组件实例。

add(){console.log(this)
}
render(){console.log(this)return (<div><button onClick={this.add.bind(this)}>+</button></div>)
}

直接在html中绑定不太方便,可以在constructor中提前绑定

 constructor(){this.add = this.add.bind(this)}add(){console.log(this)}render(){return (<div><button onClick={this.add}>+</button></div>)}

还有更简单的方法使用箭头函数

//setState简短说明
//setState继承自Component,
//调用setState后,会将state中的xxx的值修改掉,然后自动重新执行render函数add(){console.log(this)this.setState({})}render(){return (<div><button onClick={()=>this.add()}>+</button></div>)}

jsx

jsx是js的拓展语法,也在许多地方成为JavaScript XML。
jsx顶层只能有一个根元素,jsx中的标签可以是单标签,也可以是双标签。

jsx嵌套变量作为子元素

当变量为Number,String,Array时,可以直接显示。
当变量为null,undefined,boolean时,内容为空,如果需要显示的话可以将它们转换为字符创,例如使用toString
当变量为Object时,不能作为子元素

class App extends Component {constructor() {super();this.state = {message: "xxxxx",age: 18,address: ["!1", "222"],isSelected: true,test: " ",//  test: null,   test:undefined};}render() {const { message, age, address, isSelected, test } = this.state;return (<div><div>{message}</div><div>{age}</div><div>{address[0]}</div><div>{isSelected.toString()}</div><div>{test}</div></div>);}
}

在这里插入图片描述

当变量为Object时
在这里插入图片描述

使用表达式

class App extends Component {constructor() {super();this.state = {message: "xxxxx",age: 18,address: ["!1", "222"],isSelected: true,test: null,obj: {name: "111",age: 19,},};}address() {return <span>test</span>;}render() {const { message, age, address, isSelected, test, obj } = this.state;if (isSelected) {this.setState({obj: {age: 100,},});}return (<div><div>{message}</div><div>{age}</div><div>{address[0]}</div><div>{isSelected.toString()}</div><div>{test}</div><div>{Object.keys(obj)[0]}</div>{/* 使用表达式*/}<div>{19 - 1}</div><div>{isSelected ? "true" : "false"}</div><div>{[1, 2, 3].map((item) => {return <li>{item}</li>;})}</div><div>{obj.age}</div><>{this.address()}</></div>);}
}

在这里插入图片描述

绑定 title,src,href,class,style

 this.state = {title: "xxx",href: "https://developer.mozilla.org/zh-CN/docs/Web/CSS/background-image",url: "https://img-blog.csdnimg.cn/direct/38f2d0b33be2462796e2a123165e3fd8.png",};render() {const { title, href, url } = this.state;return (<div><h1 title={title}>111</h1><a href={href}>a</a><img src={url} /></div>);}

绑定className,style

 render() {const className = `aaa  ${isSelected ? "active" : ""}`;const classList = ["aa", "bb"];classList.push("vvv");return (<div><div className={className}>11</div><div style={{ fontSize: "20px", color: "red" }}>www</div><div className={classList.join(" ")}></div></div>);}

事件的绑定

事件名使用小驼峰命名,通过{}传入一个事件处理函数,这个函数会在事件发生时被执行

<button onClick={this.add.bind(this)}>+</button>

传递event和其他参数

class App extends Component {constructor() {super();this.state = {};}add(event, age, num) {console.log(event);console.log(age, num);}render() {return (<div><button onClick={this.add.bind(this, "xx", 19)}>1</button><button onClick={(event) => this.add(event, "zzz", 11)}>2</button></div>);}
}

使用bind绑定的 event是最后一个
在这里插入图片描述

条件渲染

条件渲染的方式:

  1. 条件判断
  2. 三元运算符
  3. 与运算符&&

使用if条件判断

 render() {let ele;const { isShow } = this.state;if (isShow) {ele = <h1>show</h1>;} else {ele = <h1>hidden</h1>;}return (<div><span>{ele}</span><button onClick={(event) => this.add(event, "zzz", 11)}>2</button></div>);}

在这里插入图片描述
三元运算符和与运算符

     <div><span>{isShow ? ele : "test"}</span><span>{isHidden + "" && "---11"}</span></div>
/*  在 JavaScript 中,对 undefined 变量使用 && 运算符可能会导致将整个表达式的结果视为假值。这是因为在逻辑运算中,&& 运算符是一个短路逻辑运算符,如果左侧表达式的值为一个假值(例如 false、null、undefined、0、空字符串等),
那么整个表达式会立即返回左侧表达式的值,而不再计算右侧表达式。如果想要确保对 undefined 变量进行逻辑运算时的预期行为,可以先将变量转换为字符串或者使用其他方法来处理。
*/
//模拟v-show
<div style={{display: isShow ? "block" : "hidden"}}> </div>

在这里插入图片描述

列表展示

使用map渲染列表

class App extends Component {constructor() {super();this.state = {list: [{id: 1,name: "111",},{id: 2,name: "222",},{id: 3,name: "333",},{id: 4,name: "444",},],};}render() {const { list } = this.state;return (<div>{list.map((item) => {return <div key={item.id}>{item.name}</div>;})}</div>);}
}export default App;
// jsx--ReactElement-真实dom

在这里插入图片描述

类组件

类组件的名称以大写字符开头,继承自React.Component,必须实现render函数。constructor是可选的。

import { Component } from "react";class App extends Component {constructor() {super();this.state = {};}render() {return (<div></div>);}
}export default App;

render函数的返回值

当render被调用时,它会检查this.props和this.state的变化并返回以下类型之一:
1.React元素,通过jsx创建的
2. 数组或fragments
3. Portals,将子节点渲染到不同的dom中
4. 字符串或数值类型,它们在dom中会被渲染成文本节点
5. 布尔类型或null 什么都不渲染

函数组件的返回值类型也跟类组件的一样

生命周期

在这里插入图片描述

class App extends Component {constructor() {super();this.state = {};//初始化state}componentDidMount() {//组件已经渲染到dom中}componentDidUpdate(proProps,preState,snapshot) {//dom发生更新  ,snapshot getSnapshotBeforeUpdate传递的值}componentDidMount() {// 组件卸载,}shouldComponentUpdate(){return true  //是否更新,返回false就不会更新}getSnapshotBeforeUpdate(){//在更新前进行一些操作,返回的数据可以在 componentDidUpdate中获取return {name:"aaa"}}change(){this.setState({})  //调用setState后会触发render,然后重新渲染,在执行componentDidUpdate}render() {return <div>222</div>;}
}

组件间的通信

父组件向子组件传参

// 父组件<div><Son name={"sssxasa"} age={18}></Son></div>
------------------------
//子组件
class Son extends Component {constructor(props) {  // constructor 这一步可以省略super(props);}render() {const { name, age } = this.props;return (<div><div>{name}:{age}</div></div>);}
}
propTypes 参数类型
import { Component } from "react";
import PropTypes from "prop-types";
class Son extends Component {render() {const { name, age } = this.props;return (<div><div>{name}:{age}</div></div>);}
}Son.propTypes = {name: PropTypes.string,age: PropTypes.number,
};
//设置默认值
Son.defaultProps = {name: "default",age: 18,
};

子组件向父组件传值

父组件向子组件传递一个方法,这个方法接受参数,子组件使用时把参数传递过来。

父组件

  getSon(val) {console.log(val)}render() {return (<div><Son getSon={(val) => this.getSon(val)}></Son></div>);}

子组件

class Son extends Component {render() {const { name, age, getSon } = this.props;return (<div><div>{name}:{age}</div><button onClick={() => getSon("传递的值")}>传递值</button></div>);}
}

react中的插槽

react中有两种方式实现插槽:
组件的children 和props传递react元素

组件的children

这些元素会放到组件实例上,有多个元素时children是一个数组,
在这里插入图片描述
只有一个元素时,children就是对应的元素

       const { children } = this.props;<div><div>{children}</div></div>//通过设置chilidren可以限制传入单个元素或多个元素Son.propTypes={children:PropTypes.array //:PropTypes.element}
props传递react元素

在这里插入图片描述

可以通过传递一个函数,由子组件决定渲染的内容
在这里插入图片描述

context

React.createContext 创建 需要共享的Context对象

import React from "react";const myContext = React.createContext();export default myContext;

Context.Provider,每个context对象都会返回一个Provider React组件,它允许组件订阅context的变化。
Provider可以接受一个value,传递给组件

 render() {return (<div><myContext.Provider value={{ color: "red", name: "sss" }}><Son></Son></myContext.Provider></div>);}

Class.context.Type 挂载在class的contextType 属性会被重新赋值为由React.createContext()创建的Context对象,通过this.context可以使用Context上的值。

import { Component } from "react";import myContext from "./context";
class Son extends Component {render() {const { name } = this.context;return <div>{name}</div>;}
}
Son.contextType = myContext;
export default Son;
函数式组件使用context需要使用context.Consumer
  return (<div><myContext.Provider value={{ color: "red", name: "sss" }}><Son></Son><Test></Test></myContext.Provider></div>);
----------------------------------------
import myContext from "./context";
export function Test() {return (<div><myContext.Consumer>{(value) => {return <h1>{value.name}</h1>;}}</myContext.Consumer></div>);
}
使用多个provider

createContext可以设置默认值

import React from "react";const myContext = React.createContext();export default myContext;
export const testContext = React.createContext({age: 18,address: "asdasf",
});
  return (<div><testContext.Provider value={{ age: 18, address: "fwefes" }}><myContext.Provider value={{ color: "red", name: "sss" }}><Son></Son><Test></Test></myContext.Provider></testContext.Provider></div>);

有多个context时,可以使用Consumer使用对应的context

import { Component } from "react";
import myContext, { testContext } from "./context";class Son extends Component {render() {const { name } = this.context;return (<div>{name}<testContext.Consumer>{(value) => {return <h1>{value.address}</h1>;}}</testContext.Consumer></div>);}
}
Son.contextType = myContext;
export default Son;

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

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

相关文章

算法的空间复杂度(C语言)

1.空间复杂度的定义 算法在临时占用储存空间大小的量度&#xff08;就是完成这个算法所额外开辟的空间&#xff09;&#xff0c;空间复杂度也使用大O渐进表示法来表示 注&#xff1a; 函数在运行时所需要的栈空间(储存参数&#xff0c;局部变量&#xff0c;一些寄存器信息等)…

Python | Leetcode Python题解之第217题存在重复元素

题目&#xff1a; 题解&#xff1a; class Solution(object):def containsDuplicate(self, nums):if len(set(nums)) ! len(nums):return Trueelse:return False

一种一维时间序列信号变化/事件/异常检测方法(MATLAB)

随着工业物联网、大数据和人工智能的发展&#xff0c;传统工业正在向数字化和智能化升级&#xff0c;从而创造了大量的时间序列数据。通过分析这些数据&#xff0c;可以提供准确可靠的信息服务和决策依据&#xff0c;促进制造业的转型升级。工业物联网在传统工业向“工业 4.0”…

PostgreSQL 如何优化存储过程的执行效率?

文章目录 一、查询优化1. 正确使用索引2. 避免不必要的全表扫描3. 使用合适的连接方式4. 优化子查询 二、参数传递1. 避免传递大对象2. 参数类型匹配 三、减少数据量处理1. 限制返回结果集2. 提前筛选数据 四、优化逻辑结构1. 分解复杂的存储过程2. 避免过度使用游标 五、事务处…

合并pdf的方法,如何合并pdf文件到一个pdf,简单方法

在现代办公和学习中&#xff0c;pdf格式的文件因其跨平台兼容性和安全性得到了广泛应用。然而&#xff0c;有时我们需要将多个pdf文件合并成一个&#xff0c;以便于管理和分享。本文将详细介绍几种合并pdf的方法&#xff0c;帮助读者轻松完成pdf文件的合并工作。 方法一、使用p…

Camera Raw:编辑 - 校准

Camera Raw “编辑”模块中的校准 Calibration面板设计初衷是校准相机所采集的 R、G、B 色彩信息&#xff0c;使相机的 RGB 色域范围尽可能与标准 RGB 色域范围重合。不过&#xff0c;现在多用于创意调色。通过调整红、绿、蓝三个原色的色相和饱和度&#xff0c;以及阴影的色调…

cs231n 作业3

使用普通RNN进行图像标注 单个RNN神经元行为 前向传播&#xff1a; 反向传播&#xff1a; def rnn_step_backward(dnext_h, cache):dx, dprev_h, dWx, dWh, db None, None, None, None, Nonex, Wx, Wh, prev_h, next_h cachedtanh 1 - next_h**2dx (dnext_h*dtanh).dot(…

《华为战略管理法:DSTE实战体系》累计印量已达4万册(截至2024年7月)

近日&#xff0c;从中国人民大学出版社丁一老师处获悉&#xff0c;截至2024年07月&#xff0c;谢宁老师专著《华为战略管理法:DSTE实战体系》已经完成第10次印刷&#xff0c;累计4万册。&#xff08;该书于2022年06月份出版&#xff09;。 《华为战略管理法:DSTE实战体系》作为…

Linux——进程间通信一(共享内存、管道、systrem V)

一、进程间通信介绍 1.1、进程间通信的概念和意义 进程间通信(IPC interprocess communication)是一组编程接口&#xff0c;让不同进程之间相互传递、交换信息(让不同的进程看到同一份资源) 数据传输:一个进程需要将它的数据发送给另外一个进程 资源共享:多个进程之间共享同样…

fork创建子进程详解

一.前言 在上一篇文章-进程的概念&#xff0c;最后我们提到了创建进程的方式有两种方式&#xff0c;一种是手动的创建出进程&#xff0c;还有一种就是我们今天要学习的使用代码的方式创建出子进程-fork。 而学习fork创建出进程的过程中&#xff0c;我们会遇到以下问题&#x…

ECharts在最新版本中使用getInstanceByDom报错处理

引用问题导致报错 如果按如下引用的话&#xff0c;会报错 import echarts from “echarts/lib/echarts”; 原因 在 ECharts 的之前版本中&#xff0c;默认导出了一个名为 echarts 的对象&#xff0c;所以使用 import echarts from “echarts” 是没有问题的。但是在 ECharts …

【Spring Boot】关系映射开发(二):一对多映射

关系映射开发&#xff08;二&#xff09;&#xff1a;一对多映射 1.编写实体1.1 新建 School 实体1.2 新建 Teacher 实体 2.测试映射关系 单向关系的一对多注解 oneToMany&#xff0c;只用于关系的发出端&#xff08;一 的一方&#xff09;。另外&#xff0c;需要关系的发出端定…

android之蓝牙遥控器新增键值

文章目录 简述连接蓝牙代码流程总结简述 使用android 10平台来适配蓝牙遥控器新增的键值 连接蓝牙 当使用遥控器与蓝牙进行配对成功后,就可以通过getevent获取蓝牙打印的信息,如下所示 其中000700a0是发送过来的协议(0007)和码值(00a0)的组合。0xfa是驱动定义好的值,如果…

【LabVIEW学习篇 - 4】:程序结构——条件结构、事件结构、禁用结构

文章目录 条件结构案例一&#xff08;布尔输入&#xff09;案例二&#xff08;整数输入&#xff09;案例三&#xff08;字符串输入&#xff09; 事件结构案例一案例二 禁用结构 条件结构 条件结构的组成部分&#xff1a; 选择器标签&#xff08;带方框的“?”&#xff09;&…

机械硬盘坏了怎么导出数据?5中高效恢复数据的方法

面对机械硬盘损坏的紧急情况&#xff0c;如何有效地导出数据成为了许多用户关注的焦点。以下是对上述方法的深入分析与润色&#xff0c;旨在为用户提供更加全面、清晰的指导。 机械硬盘损坏后的数据导出策略 1. 利用数据恢复软件&#xff1a; 当机械硬盘出现逻辑故障或轻微物…

中标麒麟 RAC 19c 部署(Openssh免密BUG解决方案)

部署环境&#xff1a; 主机一主机二host ip192.168.80.46192.168.80.47vip 192.168.80.48192.168.80.49private ip192.168.10.10192.168.10.11storage ip192.168.20.33192.168.20.34主机名rac19c1rac19c2 需要上传的软件包&#xff1a; 一.虚拟机配置 选择中标麒麟IOS文件&am…

如何在忘记密码的情况下解锁Android手机?

您的 Android 设备密码有助于保护您的数据并防止您的个人信息被滥用。但是&#xff0c;如果您被锁定在Android设备之外怎么办&#xff1f;我们知道忘记您的 Android 手机密码是多么令人沮丧&#xff0c;因为它会导致您的设备和数据无法访问。在本技术指南中&#xff0c;我们将向…

java 闭锁(CountDownLatch)

闭锁&#xff08;CountDownLatch&#xff09;是Java中的一个同步辅助类&#xff0c;用于协调多个线程之间的协作。它允许一个或多个线程等待&#xff0c;直到在其他线程中执行的一组操作完成。闭锁非常适用于需要等待一组事件发生之后再执行某些操作的场景。 import java.uti…

JVM相关知识点汇总

JDK,JRE以及JVM的关系 我们的编译器到底干了什么事? 仅仅是将我们的 .java 文件转换成了 .class 文件,实际上就是文件格式的转换,对等信息转换。 类加载机制是什么? > **所谓类加载机制就是** > ``` > 虚拟机把Class文件加载到内存 > 并对数据进行校验,转换…

LeetCode 744, 49, 207

目录 744. 寻找比目标字母大的最小字母题目链接标签思路代码 49. 字母异位词分组题目链接标签思路代码 207. 课程表题目链接标签思路代码 744. 寻找比目标字母大的最小字母 题目链接 744. 寻找比目标字母大的最小字母 标签 数组 二分查找 思路 本题比 基础二分查找 难的一…