React高级特性解析

简介: React高级特性解析

react conText

使用APIReact.createContext  返回的是组件对象 可以利用结构的方式

  • 第一种方式

使用Provider包裹的组件都可以获取提供者的value

  • Context.Consumer

组件里面使用函数 函数返回一个组件 函数的参数为Context初始化的参数

  • 第二种方式
  1. 使用Context.Provider包裹所有的组件
  2. 在子组件里面使用static contextType = 创建的Context 则会自动向上查找 然后在组件内部可以通过this.context获取值

Portals插槽

  1. 可以将一个dom插入到其他dom下面ReactDOM.createPortal(需要插入的节点, 需要挂载的节点)

React.createPortal(Component, nodeElement)

HOC

  • 主要存在作用 抽离state 复用逻辑 操作方式可以直接使用ES7装饰器
  • 对一个函数传入一个组件  返回一个组件 函数里面将公共的逻辑抽离出来
  • 例如:每个页面都需要加载数据 渲染页面 那么就可以将公共的获取数据接口抽离出来 对指定组件进行渲染
  • hoc生命周期  组件的didMount -> hocDidMount -> hocwillMount -> hocwillUnMount -> unMount

HOC都有一个通病就是props可能重复

例如:

  1. 每个组件都有共同的操作  比方说:A组件需要修改名字  B组件也需要修改名字  就可以将状态提升 利用HOC 传入修改事件以及传入的值
  2. Loading操作 每个组件都有一个loading状态 利用hoc接收一个loading是否显示的状态  然后用这个loading状态控制显示loading组件还是业务组件
  3. 数据请求 两组同样的数据请求  放在不同的展示组件里面渲染 可以将获取数据的操作抽离出来

鼠标移动例子 所有的组件都需要获取在某个组件内的鼠标移动x y

const withMouse = Component => {
return class extends React.Component {
    state = {
        x: 0,
        y: 0
    };
    handleMouseMove = event => {
        this.setState({
            x: event.clientX,
            y: event.clientY
        });
    };
    render() {
        return (
            <div onMouseMove={this.handleMouseMove}>
                <Component {...this.props}  mouse={this.state}/>
            </div>
        );
    }
}
}

RenderProps

HOC惊人的相似。当是不会再出现props重复的问题。实际上就是一个回调函数 作用都是获取外部数据

// 例如
将重复的操作放在 组件内部
组件内部通过调用外部的render方法 实现将外部组件可以获取组件内部的state 从而不影响props的传递
class Mouse extends React.Component {
    static propTypes = {
        // render: required
    };
    state = {
        x:0,
        y:0
    };
    handleMouseMove = (event) => {
        this.setState({
            x: event.clientX,
            y: event.clientY
        })
    };
    render() {
        return (
            <div onMouseMove={this.handleMouseMove}>
                {this.props.render(this.state)}
            </div>
        );
    }
}

Refs 转发

  • 主要是不方便获取叶子组件的ref 利用ref转发可以准确的获取的叶子组件的ref
const ref = React.createRef()
    React.forwardRef((props, ref) => {
        <Component ref={ref}>
    })

ref则会成为叶子组件的ref

Fragments

  • 主要是在代码逻辑中对这些组件进行 不会产生任何的额外节点
<>
  <div>hello</div>
</>

React.lazy  React.suspense 懒加载

React.lazy(() => import('./Component'));

  1. 以前是webpack将所有打包成为一个文件 导致文件特别大 不利于代码拆分 这个时候需要代码拆分
  2. const OtherComponent = React.lazy(() => import('./OtherComponent'));   这样导入的组件 如果有多个懒加载组件 那么展示会以加载时间最长的组件显示
  3. React.suspense 参数 fallback 懒加载过程中需要展示的内容
  • 原理分析
  • 当父组件渲染到子组件的时候发现异步请求 直接抛出错误 捕获的结果是个promise
  • ComponentDidCatch捕获到这个promise的异常 pending状态下渲染fallback
  • resolve时重新render 遇到下一个异步请求重复上面操作
  • 直到整个父组件抛出的promise对象都将resolveloading换成真正的组件

HOOK 钩子

HOOK提供了一系列函数式组件的钩子

const [value, setValue] = useState();

value则是state状态  setValue 则是个函数 需要设置值直接调用setValue 传入需要设置的值即可

  1. useEffect     传入一个匿名函数   该匿名函数的作用相当于DidMountDidUpdate  可以在匿名函数里面返回一个函数

Component 和 PurComponent 的区别

区别点: 前者自带通过propsstate的浅对比来实现shouldComponentUpdate 而后者没有 只要props变化就会重新render

  • PurComponent缺点
    可能因为深层数据不一致而产生错误的否定判断 从而界面得不到更新
    为什么会产生:新的对象简单的引用了原始对象 改变了新的对象将影响到原始对象 如foo = {a: 1}  bar = foo  bar.a = 2这个时候区对比foobar是一样的 一般解决是使用深拷贝 则可以  引用immutable 也可以优化

截流和防抖

  1. 截流  控制指定时间触发一次 在指定时间内调用不能超过一次
  2. 防抖  防抖确保函数不会在上一次调用后一定量的时间被执行
  3. requestAnimationFrame 节流  浏览器会确保每一秒是60帧 可以防止每秒超过60帧的操作 自己限流

setState

异步处理  多次增加数据会导致数据返回不到预期 可以使用函数形式处理

为什么使用异步处理?

  • setState不会立马改变React组件和state的值
  • setState通过触发一次组件的更新来引发重绘
  • 多次setState函数调用产生的效果会合并

本文为作者原创,手码不易,允许转载,转载后请以链接形式说明文章出处。

目录
相关文章
|
3月前
|
缓存 前端开发 JavaScript
React Hooks深度解析与最佳实践:提升函数组件能力的终极指南
🌟蒋星熠Jaxonic,前端探索者。专注React Hooks深度实践,从原理到实战,分享状态管理、性能优化与自定义Hook精髓。助力开发者掌握函数组件的无限可能,共赴技术星辰大海!
React Hooks深度解析与最佳实践:提升函数组件能力的终极指南
|
前端开发 JavaScript
React 步骤条组件 Stepper 深入解析与常见问题
步骤条组件是构建多步骤表单或流程时的有力工具,帮助用户了解进度并导航。本文介绍了在React中实现简单步骤条的方法,包括基本结构、状态管理、样式处理及常见问题解决策略,如状态管理库的使用、自定义Hook的提取和CSS Modules的应用,以确保组件的健壮性和可维护性。
297 17
|
10月前
|
Web App开发 移动开发 前端开发
React音频播放器样式自定义全解析:从入门到避坑指南
在React中使用HTML5原生&lt;audio&gt;标签时,开发者常面临视觉一致性缺失、样式定制局限和交互体验割裂等问题。通过隐藏原生控件并构建自定义UI层,可以实现完全可控的播放器视觉风格,避免状态不同步等典型问题。结合事件监听、进度条拖拽、浏览器兼容性处理及性能优化技巧,可构建高性能、可维护的音频组件,满足跨平台需求。建议优先使用成熟音频库(如react-player),仅在深度定制需求时采用原生方案。
432 12
|
11月前
|
Web App开发 监控 前端开发
React音频播放控制组件开发深度解析
本文介绍了构建React音频控制组件时遇到的关键问题及优化方案。主要包括: 1. **状态同步难题**:解决播放按钮与音频状态不同步的问题,通过双向绑定机制确保一致。 2. **跨浏览器兼容性**:处理Safari和Chrome预加载策略差异,确保`duration`属性正确获取。 3. **进度控制优化**:避免使用`setInterval`,采用`requestAnimationFrame`提升性能;优化拖拽交互,防止音频卡顿。 4. **音量控制进阶**:实现渐变音量调节和静音状态同步。
470 15
|
前端开发 UED
React 文本区域组件 Textarea:深入解析与优化
本文介绍了 React 中 Textarea 组件的基础用法、常见问题及优化方法,包括状态绑定、初始值设置、样式自定义、性能优化和跨浏览器兼容性处理,并提供了代码案例。
410 9
|
编译器 PHP 开发者
PHP 8新特性解析与实战应用####
随着PHP 8的发布,这一经典编程语言迎来了诸多令人瞩目的新特性和性能优化。本文将深入探讨PHP 8中的几个关键新功能,包括命名参数、JIT编译器、新的字符串处理函数以及错误处理改进等。通过实际代码示例,展示如何在现有项目中有效利用这些新特性来提升代码的可读性、维护性和执行效率。无论你是PHP新手还是经验丰富的开发者,本文都将为你提供实用的技术洞察和最佳实践指导。 ####
238 1
|
数据安全/隐私保护 iOS开发 开发者
iOS 14隐私保护新特性深度解析####
随着数字时代的到来,隐私保护已成为全球用户最为关注的问题之一。苹果在最新的iOS 14系统中引入了一系列创新功能,旨在增强用户的隐私和数据安全。本文将深入探讨iOS 14中的几大隐私保护新特性,包括App跟踪透明度、剪贴板访问通知和智能防追踪功能,分析这些功能如何提升用户隐私保护,并评估它们对开发者和用户体验的影响。 ####
|
前端开发 JavaScript
React Hooks 深入解析
React Hooks 深入解析
185 0
|
10月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
980 29
|
10月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
429 4

推荐镜像

更多
  • DNS