React---扩展补充

news2025/6/7 4:17:03

一些额外的扩展

4.3 高阶组件

高阶组件是参数为组件,返回值为新组件的函数;

  • 高阶组件 本身不是一个组件,而是一个函数;
  • 其次,这个函数的参数是一个组件,返回值也是一个组件;
import React from "react";

function App() {
  // 高阶组件
  function higherOrderComponents(WrapperComponent) {
    class NewComponent extends React.Component {
      render() {
        return <WrapperComponent />;
      }
    }
        // 函数组件
    function NewComponent(props){
      return <WrapperComponent {...props}/>
    }
    NewComponent.displayName = "jyx";//重新命名组件名称,所有组件都有,没有什么意义
    return NewComponent;
  }

  class WrapperComponent extends React.Component {
    render() {
      return (
        <div>
          APP
        </div>
      );
    }
  }

  const Cpn = higherOrderComponents(WrapperComponent);
  return (
    <div className="App">
      <Cpn />
    </div>
  );
}

export default App;

4.4 高阶组件的应用

1、props增强

当我们有多个组件的时候,我们想要统一添加一个属性,一个个添加十分麻烦,我们就可以使用高阶组件的props增强

首先我们要创建一个高阶组件:传入的是组件和添加的属性

function enhanceProps(WrapperComponent , otherProps){
    return props => <WrapperComponent  {...props}  {...otherProps}/> 
}

然后我们可以写组件来共享高阶组件

const HomeProps = enhanceProps(Home , { region: "中国" })
const AboutProps = enhanceProps(About , { region: "重庆" })

最后使用就可以了

注意:果你想在组件中显示 region,需要在 Home 和 About 组件里加上:

render() {
    return (
      <div>
        <HomeProps nickname="jyx" level={90} ></HomeProps>
        <AboutProps nickname="hcy" level={80}></AboutProps>
        
      </div>
    )
  }
}
class Home extends PureComponent{
    render(){
        // 要使用region
            const {nickname , level , region} = this.props;
        return(
            <div>{`姓名:${nickname} , 级别:${level} , 地区:${region}`}</div>
        )
    }
    
}
class About extends PureComponent{
    render(){
            const {nickname , level , region} = this.props;
        return(
            <div>{`姓名:${nickname} , 级别:${level} , 地区:${region}`}</div>
        )
    }
    
}

props曾庆数据来自context

定义context:

import React, { createContext, PureComponent } from 'react'

export default class App extends PureComponent {
  render() {
    return (
      <div>
        {/* 4.使用组件,不必传入参数 */}
        <HomeProps ></HomeProps>
        <AboutProps ></AboutProps>
        
      </div>
    )
  }
}
class Home extends PureComponent{
    render(){
            const {nickname , level , region} = this.props;
        return(
            <div>{`姓名:${nickname} , 级别:${level} , 地区:${region}`}</div>
        )
    }
    
}
class About extends PureComponent{
    render(){
            const {nickname , level , region} = this.props;
        return(
            <div>{`姓名:${nickname} , 级别:${level} , 地区:${region}`}</div>
        )
    }
    
}
// 1.创建context对象
const UserContext = createContext({
    userbname:"jyx",
    level:90,
    region:"中国"
})
// 2.定义一个高阶组件
function withUser(WrapperComponent){
    return props => {
        return (
            <UserContext.Consumer>
               {
                // 在组件里面使用user
                user => <WrapperComponent  {...props} {...user}/>
               }
            </UserContext.Consumer>
        )
    }
    
}
// 3.定义组件
const HomeProps = withUser(Home)
const AboutProps = withUser(About)


2、渲染判断鉴权
  • 在开发中,我们可能遇到这样的场景:
    • 某些页面是必须用户登录成功才能进行进入;
    • 如果用户没有登录成功,那么直接跳转到登录页面;
  • 这个时候,我们就可以使用高阶组件来完成鉴权操作
import React, { PureComponent } from 'react'

export default class App extends PureComponent {
  render() {
    return (
      <div>
        <AuthPage isLogin={true}></AuthPage>
      </div>
    )
  }
}
// 1.定义一个高阶组件
function withLogin (WrappedComponent){
//    返回的是组件
return class extends PureComponent{
    render(){
         const {isLogin , props} = this.props;
    if(isLogin){
        // 如果成功登录
        return <WrappedComponent {...props} />
    }else {
        // 否则
        return <Login />
    }
    }
}
}
// 2.login
class Login extends PureComponent {
    render(){
        return (
            <div>
                请先登录
            </div>
        )
    }
  }
//   3.定义一个组件来使用高阶组件
class CartPage extends PureComponent{
    render(){
        return (
            <h2>我是购物车组件</h2>
        )
    }
}
const AuthPage = withLogin(CartPage);
3、劫持生命周期
import React, { PureComponent } from 'react'

export default class App extends PureComponent {
  render() {
    return (
      <div>
        <HomeAuto />
      </div>
    )
  }
}
// 1.定义高阶组件
function WithRenderTime(WrappedComponent){
    return class extends PureComponent {
        // 获取开始渲染的时间
        componentWillMount(){
            this.beginTime = Date.now();
        }
        // 获取渲染结束时间
        componentDidMount(){
            this.endTime = Date.now();
            // 获取时长
            const during = this.endTime = this.beginTime;
            console.log(`${WrappedComponent.name} 渲染时间为: ${during}}`)
        }
        // 渲染\
        render(){
            return <WrappedComponent {...this.props}/>
        }
    }
}
// 2.使用
class Home extends PureComponent{
    render(){
        return (
            <div>home</div>
        )
    }
}
const HomeAuto = WithRenderTime(Home);


10.5 转发ref

  • ref不能应用于函数式组件:因为函数式组件没有实例,所以不能获取到对应的组件对象
  • 在开发中我们可能想要获取函数式组件中某个元素的DOM,这个时候我们应该如何操作呢?通过forwardRef高阶函数;
import React, { createRef, forwardRef, PureComponent } from 'react'

export default class App extends PureComponent {
    constructor(){
        super();
        // 3.创建一个ref
        this.profieRef = createRef();
    }
    handelClick = () => {
        console.log(this.profieRef.current)
    }
  render() {
    return (
      <div>
        {/* ref的转发:
        在开发中我们可能想要获取函数式组件中某个元素的DOM,这个时候我们应该如何操作呢?
        通过forwardRef高阶函数; */}
        {/* 2.使用 */}
        <Profile ref={this.profieRef}></Profile>
        <button onClick={this.handelClick}>点击获取ref</button>

      </div>
    )
  }
}
// 1.创建一个forwardRef
const Profile =forwardRef(
     function (props , ref){

    return <p ref={ref}>Profile</p>

})

10.6 Portal

某些情况下,我们希望渲染的内容独立于父组件,甚至是独立于当前挂载到的DOM元素中(默认都是挂载到id为root的DOM元素上的)。
Portal 提供了一种将子节点渲染到存在于父组件以外的 DOM 节点的优秀的方案:

  • 第一个参数(child)是任何可渲染的 React 子元素,例如一个元素,字符串或 fragment;
  • 第二个参数(container)是一个 DOM 元素;

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

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

相关文章

MySQL的并发事务问题及事务隔离级别

一、并发事务问题 1). 赃读&#xff1a;一个事务读到另外一个事务还没有提交的数据。 比如 B 读取到了 A 未提交的数据。 2). 不可重复读&#xff1a;一个事务先后读取同一条记录&#xff0c;但两次读取的数据不同&#xff0c;称之为不可重复读。 事务 A 两次读取同一条记录&…

ProfiNet 分布式 IO 在某污水处理厂的应用

随着城市化进程的加速&#xff0c;污水处理厂的规模和复杂性不断增加&#xff0c;对自动化控制系统的要求也越来越高。PROfinet 分布式 IO 作为一种先进的工业通信技术&#xff0c;以其高速、可靠、灵活的特性&#xff0c;为污水处理厂的自动化升级提供了有力支持。本文将结合某…

vue2 , el-select 多选树结构,可重名

人家antd都支持&#xff0c;elementplus 也支持&#xff0c;vue2的没有&#xff0c;很烦。 网上其实可以搜到各种的&#xff0c;不过大部分不支持重名&#xff0c;在删除的时候可能会删错&#xff0c;比如树结构1F的1楼啊&#xff0c;2F的1楼啊这种同时勾选的情况。。 可以全…

Excel处理控件Aspose.Cells教程:使用 C# 从 Excel 进行邮件合并

邮件合并功能让您能够轻松批量创建个性化文档&#xff0c;例如信函、电子邮件、发票或证书。您可以从模板入手&#xff0c;并使用电子表格中的数据进行填充。Excel 文件中的每一行都会生成一个新文档&#xff0c;并在正确的位置包含正确的详细信息。这是一种自动化重复性任务&a…

EXCEL通过DAX Studio获取端口号连接PowerBI

EXCEL通过DAX Studio获取端口号连接PowerBI 昨天我分享了EXCEL链接模板是通过获取端口号和数据库来连接PowerBI模型的&#xff0c;链接&#xff1a;浅析EXCEL自动连接PowerBI的模板&#xff0c;而DAX Studio可以获取处于打开状态的PowerBI的端口号。 以一个案例分享如何EXCEL…

C# 委托UI控件更新例子,何时需要使用委托

1. 例子1 private void UdpRxCallBackFunc(UdpDataStruct info) {// 1. 前置检查防止无效调用if (textBoxOutput2.IsDisposed || !textBoxOutput2.IsHandleCreated)return;// 2. 使用正确的委托类型Invoke(new Action(() >{// 3. 双重检查确保安全if (textBoxOutput2.IsDis…

大模型数据流处理实战:Vue+NDJSON的Markdown安全渲染架构

在Vue中使用HTTP流接收大模型NDJSON数据并安全渲染 在构建现代Web应用时&#xff0c;处理大模型返回的流式数据并安全地渲染到页面是一个常见需求。本文将介绍如何在Vue应用中通过普通HTTP流接收NDJSON格式的大模型响应&#xff0c;使用marked、highlight.js和DOMPurify等库进…

python项目如何创建docker环境

这里写自定义目录标题 python项目创建docker环境docker配置国内镜像源构建一个Docker 镜像验证镜像合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPant…

PyTorch--池化层(4)

池化层&#xff08;Pooling Layer&#xff09; 用于降低特征图的空间维度&#xff0c;减少计算量和参数数量&#xff0c;同时保留最重要的特征信息。 池化作用&#xff1a;比如1080p视频——720p 池化层的步长默认是卷积核的大小 ceil 允许有出界部分&#xff1b;floor 不允许…

2025年大模型平台落地实践研究报告|附75页PDF文件下载

本报告旨在为各行业企业在建设落地大模型平台的过程中&#xff0c;提供有效的参考和指引&#xff0c;助力大模型更高效更有价值地规模化落地。本报告系统性梳理了大模型平台的发展背景、历程和现状&#xff0c;结合大模型平台的特点提出了具体的落地策略与路径&#xff0c;同时…

PPTAGENT:让PPT生成更智能

想要掌握如何将大模型的力量发挥到极致吗&#xff1f;叶梓老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具。 1小时实战课程&#xff0c;您将学习到如何轻松上手并有效利用 Llama Factory 来微调您的模型&#xff0c;以发挥其最大潜力。 CSDN教学平台录播地址…

《汇编语言》第13章 int指令

中断信息可以来自 CPU 的内部和外部&#xff0c;当 CPU 的内部有需要处理的事情发生的时候&#xff0c;将产生需要马上处理的中断信息&#xff0c;引发中断过程。在第12章中&#xff0c;我们讲解了中断过程和两种内中断的处理。 这一章中&#xff0c;我们讲解另一种重要的内中断…

Redis实战-基于redis和lua脚本实现分布式锁以及Redission源码解析【万字长文】

前言&#xff1a; 在上篇博客中&#xff0c;我们探讨了单机模式下如何通过悲观锁&#xff08;synchronized&#xff09;实现"一人一单"功能。然而&#xff0c;在分布式系统或集群环境下&#xff0c;单纯依赖JVM级别的锁机制会出现线程并发安全问题&#xff0c;因为这…

计算机网络 : 应用层自定义协议与序列化

计算机网络 &#xff1a; 应用层自定义协议与序列化 目录 计算机网络 &#xff1a; 应用层自定义协议与序列化引言1. 应用层协议1.1 再谈协议1.2 网络版计算器1.3 序列化与反序列化 2. 重新理解全双工3. socket和协议的封装4. 关于流失数据的处理5. Jsoncpp5.1 特性5.2 安装5.3…

Python Day42 学习(日志Day9复习)

补充&#xff1a;关于“箱线图”的阅读 以下图为例 浙大疏锦行 箱线图的基本组成 箱体&#xff08;Box&#xff09;&#xff1a;中间的矩形&#xff0c;表示数据的中间50%&#xff08;从下四分位数Q1到上四分位数Q3&#xff09;。中位线&#xff08;Median&#xff09;&#…

CMake在VS中使用远程调试

选中CMakeLists.txt, 右键-添加调试配置-选中"C\C远程windows调试" 之后将 aunch.vs.json文件改为如下所示: CMake在VS中使用远程调试时,Launch.vs.json中远程调试设置 ,远程电脑开启VS专用的RemoteDebugger {"version": "0.2.1","defaul…

《图解技术体系》How Redis Architecture Evolves?

Redis架构的演进经历了多个关键阶段&#xff0c;从最初的内存数据库发展为支持分布式、多模型和持久化的高性能系统。以下为具体演进路径&#xff1a; 单线程模型与基础数据结构 Redis最初采用单线程架构&#xff0c;利用高效的I/O多路复用&#xff08;如epoll&#xff09;处…

一文速通Python并行计算:12 Python多进程编程-进程池Pool

一文速通 Python 并行计算&#xff1a;12 Python 多进程编程-进程池 Pool 摘要&#xff1a; 在Python多进程编程中&#xff0c;Pool类用于创建进程池&#xff0c;可并行执行多个任务。通过map、apply等方法&#xff0c;将函数和参数分发到子进程&#xff0c;提高CPU利用率&…

Web前端之原生表格动态复杂合并行、Vue

MENU 效果公共数据纯原生StyleJavaScript vue原生table 效果 原生的JavaScript原生table null 公共数据 const list [{id: "a1",title: "第一列",list: [{id: "a11",parentId: "a1",title: "第二列",list: [{ id: "…

『uniapp』把接口的内容下载为txt本地保存 / 读取本地保存的txt文件内容(详细图文注释)

目录 预览效果思路分析downloadTxt 方法readTxt 方法 完整代码总结 欢迎关注 『uniapp』 专栏&#xff0c;持续更新中 欢迎关注 『uniapp』 专栏&#xff0c;持续更新中 预览效果 思路分析 downloadTxt 方法 该方法主要完成两个任务&#xff1a; 下载 txt 文件&#xff1a;通…