React原理 - React New Feature

目录

扩展学习资料

React Fragments/Portals/StrictMode【糖果】

Fragments【并列元素外包裹一个伪元素】

Portals【改变组件挂载节点】

Strict Mode【严格模式,老工程中使用,提示即将失效方法】

React Concurrent Mode【大招】

不可阻断渲染/可中断的渲染

Concurrent Mode API 【react v16.13.1】不稳定

练习


探寻React新版本带来的新技能

扩展学习资料

名称

链接

concurrent-mode 文档

Introducing Concurrent Mode (Experimental) – React

fragment 文档

Fragments – React

Portal 文档

Portals – React

React Fragments/Portals/StrictMode【糖果】

新版带来的新功能,可以提高我们的开发体验,解决一下曾经让我们困扰的一些问题,有利于开发。

Fragments【并列元素外包裹一个伪元素】


  • 通常在render方法中需要返回一堆元素。需要在并列元素外面包裹一个元素(div)。
  • 导致我们每新增一个组件就会多一层div,特别是这一层包裹毫无意义,除了满足语法要求。
  • 新版本React提供了Fragments组件,并不会生成多与元素。
  • render() { return [] }可以返回数组 // 在列表时候可以采用数组,比较符合语义化

 

import React, {Component, Fragment} from 'react'
class AppWithFragment extends Component {
    render() {
        return (
            <Fragment> // 简写<>
            	<div className="app-item">云</div>
             	<div className="app-item">云1</div>
             	<div className="app-item">云2</div>
            </Fragment> // 简写</>      
        )    
    }
}
class AppReturnArray extends Component {
    render() {
        return [
            	<div className="app-item">云</div>,
             	<div className="app-item">云1</div>,
             	<div className="app-item">云2</div>,
            ]   
        )    
    }
}
class AppWithoutFragment extends Component {
    render() {
        return (
            <div>
            	<div className="app-item">云</div>
             	<div className="app-item">云1</div>
             	<div className="app-item">云2</div>
            </div>        
        )    
    }
}

Portals【改变组件挂载节点】


React提供了一个能让改变挂载节点的API。通常的开发中,组件会挂载在其最近的父节点上。在某些特定的需求上,需要挂载在特定的节点上。

  1. 之前的做法是封装成方法,而不是在render中引入。
  2. 既想在render中引入,又能自定义挂载节点就需要PortalsAPI。
const mountDom = document.querySelector('#other-app');
class CustomComponent extends Component {
    componentDidMount() {
        // 伪代码    
    }
    render() {
        return createPortal(// 将<OtherComponent />挂载到节点MountDom上
            <OtherComponent />,
            mountDom,      
        )     
    }
}

 

import React, { Component } from 'react';
import { createPortal } from 'react-dom';
export default class PortalComponent extends Component {
  constructor(props) {
    super(props);
    const mount = document.createElement('div');
    mount.id = 'mount';
    this.mountNode = mount;
  }
  componentDidMount() {
    // const mount = document.querySelector('#mount');
    document.body.appendChild(this.mountNode);
  }
  render() {
    return createPortal(
      <div>
        Portal Child
      </div>,
      this.mountNode
    );
  }
};

Strict Mode【严格模式,老工程中使用,提示即将失效方法】


Strict Mode提供一个可以显示潜在问题的组件。

  1. 检测是否使用即将废弃的生命周期函数。
  2. 检测是否使用string ref 和 findDOMNode 以及 老版的context api。
  3. 检测是否多次调用不可预测的副作用。
  4. 会有两次render()
class AppWithStrictMode extends Component {
    constructor(props) {
        super(props);
        this.state = {
            list: [],        
        };    
    }
    render() {
        return (
            <StrictMode>
            // render() 执行2次
            	<div ref="btn">提交</div>
            </StrictMode>        
        );    
    }
}

React Concurrent Mode【大招】

  • 一个还在实验阶段的特性;
  • 目的:让React应用能够更好地响应交互并且还能根据用户设备的硬件性能和网络条件进行对应的调节。

如果说Fiber是让应用更好的更新,那Concurrent就是让应用在体验上再上一个台阶。

不可阻断渲染/可中断的渲染

Blocking Rendering


  • 当前React在更新时,包括创建一个新的DOM节点或者是现有DOM节点的移动,这些过程是不能被阻断的,一旦开始执行,就会执行到完成为止。

Interruptible Rendering


  • 在Cobcurrent模式下,渲染更新是可以被中断的。特别是当渲染的过程特别耗时的时候,中断渲染来响应用户的行为,会让整个应用的体验得到提升。

Concurrent Mode API 【react v16.13.1】不稳定

让用户得到更好的视觉、产品体验

  • 开启Concurrent模式
    • createRoot
    • createBlockingRoot
  • Suspense
    • Suspense 【loading展示】
<Suspense fallback={<h1>Loading...</h1>}>
    <div />
</Suspense>
  • SuspenseList【Suspense loading展示s】
<SuspenseList revealOrder="forwards">
    <Suspense fallback={<h1>Loading...</h1>}>
        <div id={1} />
    </Suspense>
    <Suspense fallback={<h1>Loading...</h1>}>
        <div id={2} />
    </Suspense>
    ...
</SuspenseList>
    • useTransition 【写在离开页面的位置,当用户离开/跳转页面,当前页面请求停止】
    • useDeferredValue【平常一些搜索,给定时间内,不检索搜索历史;字符串输入中,检索延迟】

React 16.6之后Suspense配合React.lazy使用已经可以做客户端懒加载。服务端的懒加载,暂时还不能实现

React目前是在用Legacy Mode

Blocking Mode【预计是在v17.x】版本是可以使用部分Concurrent Mode 的API 【包括服务端渲染,包括一些批量处理】

练习

【题目1】用 React Suspence API 与 React Lazy API 构建一个动态加载的单页面应用;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
React Router是React的一种路由管理工具,它允许我们在应用程序中建立路由,并通过不同的URL路径来加载不同的页面。 而react-router-config是React Router的一个附加库,它提供了一种以配置方式来定义应用程序路由的方法。 路由切入动画是指在切换页面时,为页面添加一些过渡效果和动画,以提升用户体验。 使用react-router-config实现路由切入动画的步骤如下: 1. 首先,在路由配置文件中定义各个页面的路由信息,并设置对应的组件。 2. 在路由配置文件中,为每个路由定义一个transition属性,用于标识该路由的过渡效果。 3. 在根组件中使用React Router提供的Switch组件来包裹所有路由,并使用TransitionGroup组件来包裹Switch组件。 4. 在根组件中使用自定义的AnimatedSwitch组件来替换React Router提供的Switch组件,并将路由配置文件传递给AnimatedSwitch组件。 5. 在AnimatedSwitch组件中根据当前路由的transition属性,为切换的页面添加不同的过渡效果和动画。 例如,可以定义一个FadeIn动画效果,在路由配置文件中为需要应用该动画效果的路由设置transition属性为'fade-in',然后在AnimatedSwitch组件中根据该属性为页面添加相应的CSS动画样式。 总而言之,使用react-router-config可以方便地配置应用程序的路由信息,并结合一些CSS动画库,可以实现各种炫酷的路由切入动画。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值