React 扩展

文章目录

  • PureComponent
    • 1. 使用 React.Component,不会进行浅比较
    • 2. 使用 shouldComponentUpdate 生命周期钩子,手动比较
    • 3. 使用 React.PureComponent,自动进行浅比较
  • Render Props
    • 1. 使用 Children props(通过组件标签体传入结构)
    • 2. 使用 Render Props(通过组件标签属性传入结构)

PureComponent

PureComponent 在其内部实现了 shouldComponentUpdate() 方法的浅比较逻辑。当组件的 props 或 state 发生变化时,React 会通过这个方法检查前后的 props 和 state 是否相等。

如果 shouldComponentUpdate() 返回 false,则 React 不会触发组件的重新渲染过程,这可以避免不必要的渲染和可能带来的性能开销。

1. 使用 React.Component,不会进行浅比较

当执行this.setState({})时:

  • <Parent />组件 中 state 没有发生变化,也会重新执行render()
  • <Child />组件 没有接收任何props,也会重新执行render()
    .

不管父子组件的 props 或 state 有没有发生变化,都会重新执行各自的render(),重新渲染组件。这显然不符合逻辑,效率低下

import React, { Component } from 'react'export default class Parent extends Component {state = { name: '张三' }changeName = () => {this.setState({})}render () {console.log('Parent render');return (<div><button onClick={this.changeName}>点击</button><Child /></div>)}
}class Child extends Component {render () {console.log('Child render');return (<div>Child</div>)}
}

.

2. 使用 shouldComponentUpdate 生命周期钩子,手动比较

使用 shouldComponentUpdate 生命周期钩子,手动判断 props 或 state 的发生变化:

  • 如果父组件数据没有更新,则父组件和子组件都不需要重新render():父组件 => shouldComponentUpdate () { return false }
  • 如果父组件数据有更新,则父组件需要重新render():父组件 => shouldComponentUpdate () { return true }
  • 子组件则判断props数据有没有更新:子组件 => shouldComponentUpdate (nextProps, nextState) { return !this.props.name === nextProps.name }
import React, { Component, PureComponent } from 'react'export default class Parent extends Component {state = { name: '张三' }changeName = () => {this.setState({})}shouldComponentUpdate (nextProps, nextState) {// 当执行 this.setState({})时,state中数据没有变化时, return false 阻止更新.这样就不会重新渲染Parent组件,Child组件也不会更新// 当执行 this.setState({ name: '李四' })时,state中数据发生改变, return true 这会重新渲染Parent组件,这是Child组件的props会改变if (this.state.name === nextState.name) {return false} else {return true}}render () {console.log('Parent render');return (<div><button onClick={this.changeName}>点击</button><Child name={this.state.name} /></div>)}
}class Child extends Component {// 如果接收到的props中数据没有变化,则return false,阻止组件更新shouldComponentUpdate (nextProps, nextState) {if (this.props.name === nextProps.name) {return false} else {return true}}render () {console.log('Child render');return (<div>Child{this.props.name}</div>)}
}

3. 使用 React.PureComponent,自动进行浅比较

PureComponent 在其内部实现了 shouldComponentUpdate() 方法的浅比较逻辑。当组件的 props 或 state 发生变化时,React 会通过这个方法检查前后的 props 和 state 是否相等。

import React, { PureComponent } from 'react'export default class Parent extends PureComponent {state = { name: '张三' }changeName = () => {this.setState({})}// 相当于PureComponent中内置shouldComponentUpdate的判断逻辑// shouldComponentUpdate (nextProps, nextState) {//     return !this.state.name === nextState.name// }render () {console.log('Parent render');return (<div><button onClick={this.changeName}>点击</button><Child name={this.state.name} /></div>)}
}class Child extends PureComponent {// 相当于PureComponent中内置shouldComponentUpdate的判断逻辑// shouldComponentUpdate (nextProps, nextState) {//     return !this.props.name === nextProps.name// }render () {console.log('Child render');return (<div>Child{this.props.name}</div>)}
}


Render Props

在React中,并没有直接对应于 Vue.js 中的 “插槽”(slot)的概念。Vue.js的插槽允许你在子组件的模板中预留一些占位符,这些占位符可以由父组件来填充内容。

然而,React通过其组合和props传递的特性,提供了类似的功能,但实现方式略有不同。

1. 使用 Children props(通过组件标签体传入结构)

在子组件中可以通过 this.props.children 接收并渲染父组件传递的任何内容

import React, { Component } from 'react'export default class Parent extends Component {state = { name: '张三' }render () {return (<Child><p>这是一段文本。</p><button>这是一个按钮。</button></Child>)}
}class Child extends Component {render () {return (<div className='childNode'>{/* 获取到<Child>中的标签属性 */}{this.props.children} // 这里可以接收并渲染父组件传递的任何内容</div>)}
}

<Child> 内部的两个节点插入到 .childNode

在这里插入图片描述

多层嵌套

  • 通过 <Child> <Grand/> </Child> 的形式,形成父子组件

  • 通过{this.props.children}的形式,渲染内容

import React, { Component } from 'react'// 父组件  
export default class Parent extends Component {state = { name: '张三' }render () {return (<Child>{/* Grand是Child的子组件 */}<Grand name={this.state.name} /></Child>)}
}// 子组件  
class Child extends Component {state = { name: '李四' }render () {return (<div className='childNode'><p>Child组件</p>{this.props.children}</div>)}
}// 孙子组件  
class Grand extends Component {render () {return (<div className='grandNode'><p>Grand组件</p><p>{this.props.name}</p></div>)}
}

但这样 Child 组件里的数据(state = { name: '李四' })无法传递给 Grand 组件,因此需要使用 Render Props

.

2. 使用 Render Props(通过组件标签属性传入结构)

Render props是一种在React组件之间共享代码的模式。一个组件接收一个返回React元素的函数作为prop,并在其渲染方法中调用该函数。这使得父组件能够动态地决定子组件应该渲染什么内容。

  • 通过 <Child render={() => <Grand />} /> 的形式,形成父子组件:render prop 的模式来在 Child 组件中动态渲染 Grand 组件

  • 通过{this.props.render()}的形式,动态渲染内容

import React, { Component } from 'react'// 父组件  
export default class Parent extends Component {state = { name: '张三' }render () {return (// 通过 render prop 的模式来在 Child 组件中动态渲染 Grand 组件<Child render={(name) => <Grand name={name} />} />)}
}// 子组件  
class Child extends Component {state = { name: '李四' }render () {return (<div className='childNode'><p>Child组件</p>{/* <Grand>组件被放置在这里,并传入Child组件的数据(name: '李四') */}{/* 相当与vue中<slot>插槽,动态渲染的位置 */}{this.props.render(this.state.name)}  </div>)}
}// 孙子组件  
class Grand extends Component {render () {return (<div className='grandNode'><p>Grand组件</p><p>{this.props.name}</p></div>)}
}

这样 Child 组件里的数据(state = { name: '李四' })就可以传递给 Grand 组件
在这里插入图片描述

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

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

相关文章

解释JVM参数的作用及其对程序性能的影响。

JVM参数是Java虚拟机&#xff08;JVM&#xff09;在运行时配置的一种方式&#xff0c;用于影响Java应用程序的性能、内存使用、垃圾收集等。这些参数的选择对程序的性能有显著的影响。以下是几个常见的JVM参数及其作用及其对程序性能的影响&#xff1a; 1. **堆大小&#xff0…

十大排序算法之->基数排序

一、计数排序简介 基数排序&#xff08;Radix Sort&#xff09;是一种非比较型整数排序算法&#xff0c;其原理是将整数按位数切割成不同的数字&#xff0c;然后按每个位数分别比较。具体做法是用0-9之间的所有整数作为键值&#xff0c;对数据集中的每一个数&#xff0c;按照从…

Vue.js开发中基于localStorage与sessionStorage的本地存储利器:Vue-ls插件使用详解

文章目录 一、介绍二、安装三、使用1、在main.js中导入插件并配置2、在组件中使用3、全局使用3、上下文使用 四、API1、获取数据2、设置数据3、移除数据4、清空数据5、监听数据6、移除监听 五、使用示例1、单独的 js 文件2、使用方法 六、typescriptvue3使用vue-ls1、新建 stor…

【SDV让汽车架构“和而不同”】

昔日以“排气管数量”和“发动机动力”为骄傲的荣耀已然成为过往。在这个崭新的时代&#xff0c;特斯拉、理想、蔚来、小鹏、零跑等新兴的汽车制造商纷纷推出了搭载可交互大屏、实现万物互联、软件功能持续更新的新车型&#xff0c;它们被誉为“车轮上的智能手机”。同时&#…

【方案】基于5G智慧工业园区解决方案(PPT原件)

5G智慧工业园区整体解决方案旨在通过集成5G通信技术、物联网、大数据和云计算等先进技术&#xff0c;实现园区的智能化、高效化和绿色化。 该方案首先构建高速、稳定的5G网络&#xff0c;确保园区内设备、人员与物流的实时连接和高效沟通。其次&#xff0c;通过工业物联网技术&…

行业观察丨服装品牌着重点:电商的数据采集与数据分析

互联网爆发的各行业&#xff0c;关注在生产、销售、穿着以及后续的处理过程中存在的问题&#xff0c;希望能对会员企业乃至整个社会贡献出自己的一份力量。让我们共同思考&#xff0c;作为品牌企业或者个体&#xff0c;如何抓住新趋势。 做渠道价格的治理需要品牌对线上数据尽数…

代码随想录算法训练营day47

题目&#xff1a;188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费 参考链接&#xff1a;代码随想录 188.买卖股票的最佳时机IV 思路&#xff1a;本题和上题的最多两次买卖相比&#xff0c;改成了最多k次&#xff0c;使用类似思路&…

MATLAB复习

MATLAB常用的标点符号 空格 变量分隔符 矩阵一行中各元素间的分隔符 程序语句关键词分隔符 逗号&#xff0c;分隔显示计算结果的各语句 变量分隔符 矩阵中一行各元素的分隔符点号.数值中的小数点 结构数组的域访问符分号&#xff1b;分隔不想显示计算结果的各语句 矩阵行与行的…

2024上海CDIE 参展预告 | 一站式云原生数字化平台已成趋势

为什么企业需要进行数字化转型&#xff1f;大家都在讨论的数字化转型面临哪些困境&#xff1f;2024.6.25-26 CDIE数字化创新博览会现场&#xff0c;展位【A18】&#xff0c;期待与您相遇&#xff0c;共同探讨企业如何利用数字化技术驱动业务增长。 一、展会介绍——CDIE数字化…

web后端

Web后端开发是Web应用开发的重要组成部分&#xff0c;主要负责处理Web应用的后端逻辑和数据存储。后端开发人员需要根据需求和设计文档&#xff0c;设计和开发Web应用的后端逻辑&#xff0c;包括数据处理、业务逻辑和API接口等。他们还需要设计和管理Web应用的数据库&#xf…

PDF秒变翻页式电子画册

​在当今数字化时代&#xff0c;将PDF文档转换成翻页式电子画册是一种提升作品展示效果和传播效率的有效方式。以下是将PDF秒变翻页式电子画册的攻略&#xff0c;帮助您轻松掌握数字创作技巧。 首先&#xff0c;选择一个合适的制作工具是关键。目前市场上有多种在线平台和软件可…

图像识别技术在人脸识别领域的新突破

图像识别技术在人脸识别领域的新突破主要体现在多个方面&#xff0c;这些突破不仅提高了人脸识别的准确性和效率&#xff0c;还拓展了其应用领域。以下是对这些新突破的详细归纳&#xff1a; 深度学习技术的应用&#xff1a; 深度学习技术&#xff0c;特别是卷积神经网络&…

内网穿透是什么?为什么需要内网穿透?小白也能看懂!

内网穿透是什么&#xff1f;为什么需要内网穿透&#xff1f;小白也能看懂&#xff01; 通俗易懂的说法 内网穿透&#xff0c;就像是你家里的后院有一个宝藏&#xff0c;但是这个宝藏只有住在你家的人才能看得到。现在&#xff0c;你想让住在远处的朋友也能欣赏到这个宝藏&…

输入系统和应用编程

目录 一、输入设备和输入系统 1.什么是输入设备&#xff1f; 2.什么是输入系统&#xff1f; 二、输入系统框架及调试 1.框架概述 2.编写 APP 需要掌握的知识 &#xff08;1&#xff09;内核中怎么表示一个输入设备&#xff1f; &#xff08;2&#xff09;APP 可以得到什…

IK分词器热刷新词库实践分享

目录 前言 什么是分词器&#xff1f; ik分词器简介 ik分词器和默认分词器的对比 ik分词器介绍 ik分词器的分词问题 自定义词库 主配置解说 通过配置文件自定义词库 Step1: 新建自定义分词库 Step2: 将我们的自定义词添加到ik的配置文件中 Step3: 重启es&#xff0c;…

黑盒测试中的完整性测试:确保系统的功能完整性

在软件开发过程中&#xff0c;为了保证系统的质量和可靠性&#xff0c;测试是一个不可或缺的环节。而黑盒测试作为常用的测试方法之一&#xff0c;以用户的角度出发&#xff0c;测试系统在不知道内部工作原理的情况下&#xff0c;对输入数据的处理和输出结果的正确性进行验证。…

react+ts 使用webp格式的图片处理

需求&#xff1a; 公司官网大图内存较大加载很慢&#xff0c;于是用webp格式的图片来替换原来的图片&#xff0c;在React项目中&#xff0c;如果你使用的是Create React App&#xff08;CRA&#xff09;或Webpack进行项目构建&#xff0c;遇到的常见错误原因可能涉及以下几点&a…

Node.js车牌识别、文档识别、OCR API-自动化录入信息

为什么人工智能如此受关注&#xff1f;因为人工智能技术在图片处理以及在感知与认知等领域的不断突破&#xff0c;带来更高的效率。没错&#xff0c;智能机器人、人工智能技术衍生的产品已经开始替代人的工作。文字录入工作较为显著&#xff0c;OCR技术成为手动录入的杀手锏&am…

MySQL字典数据库设计与实现 ---项目实战

软件准备✍&#xff1a;Mysql与Navicat可视化命令大全 ----项目实战 文章前言部分 目录 一.摘要 二.设计内容 三.项目实现 一.摘要 本项目关注于字典数据库表结构的设计和数据管理。通过现有的sql文件&#xff0c;实现system_dict_type和system_dict_data两个数据表。随后…

去中心化衍生品协议内卷,ZKX 能否通过差异化道路突出重围?

去中心化衍生品赛道目前从协议类型来看&#xff0c;主要有两种解决方案&#xff1a; 以 GMX 为代表的 Vault 模式&#xff0c;LP 作为交易者的对手盘&#xff0c;由 Orcale 喂价决定交易价格。 以 dYdX 为代表的订单薄模式&#xff0c;链下撮合链上结算。 这两种解决方案虽然…