首页 > 其他分享 >React(千锋)

React(千锋)

时间:2024-01-18 23:01:12浏览次数:32  
标签:千锋 const 18 更新 React useState return

目录

React18 新增特性

​ 作者:kerwin

​ 版本:QF1.0

​ 版权:千锋HTML5大前端教研院

​ 公众号: 大前端私房菜

一. React18介绍

image-20221012095805643
1. 新的项目创建
npx create-react-app my-app
cd my-app
npm start
2. 老的项目升级
//先把依赖中的版本号改成最新,然后删掉 node_modules 文件夹,
//"react": "^18.2.0",
//"react-dom": "^18.2.0"

npm i 

如果您在使用 Node.js 17 的应用程序中遇到ERR_OSSL_EVP_UNSUPPORTED错误,很可能是您的应用程序或您正在使用的模块尝试使用 OpenSSL 3.0 默认不再允许的算法或密钥大小。

$env:NODE_OPTIONS="--openssl-legacy-provider"

二. Render API

React 18 引入了一个新的 root API,支持 new concurrent renderer(并发模式的渲染)

老的写法

import ReactDOM from 'react-dom';
ReactDOM.render(<App/>,document.getElementById("root"))

新的写法

import ReactDOM from 'react-dom/client';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

image-20221012111108121

三.自动批量更新State

React 18 默认开启批处理来实现性能提升。

支持批处理:

  • React 事件处理函数
  • promise
  • setTimeout
  • 原生事件处理

不要开启严格模式测试

1. setTimeout
/*
 * @作者: kerwin
 */
import React, { useState } from 'react'

export default function App() {

    console.log("render")
    const [name,setName] = useState("kerwin")
    const [age,setAge] = useState(100)
    return (
        <div>
            {name}-{age}
            <button onClick={() => {
                setTimeout(() => {
                    setName("xiaoming")
                    setAge(18)
                },0)
            }}>click</button>
        </div>
    )
}

2. promise
/*
 * @作者: kerwin
 */
import React, { useState } from 'react'

const ajax = ()=>{
    return new Promise((resolve)=>{
        resolve()
    })
}
export default function App() {

    console.log("render")
    const [name,setName] = useState("kerwin")
    const [age,setAge] = useState(100)
    return (
        <div>
            {name}-{age}
            <button onClick={() => {
                ajax().then(res=>{
                    setName("xiaoming")
                    setAge(18)
                })
            }}>click</button>
        </div>
    )
}

3.原生事件
/*
 * @作者: kerwin
 */
import React, { useState,useEffect } from 'react'

export default function App() {

    console.log("render")
    const [name,setName] = useState("kerwin")
    const [age,setAge] = useState(100)

    useEffect(() => {
        document.body.addEventListener("click",()=>{
            console.log("click")
            setName("xiaoming")
            setAge(18)
        },false)
    }, [])
    return (
        <div>
            {name}-{age}
        </div>
    )
}

4. flushSync
flushSync(()=>{
    setName("xiaoming")
})
flushSync(()=>{
    setAge(18)
})

四. Concurrent Mode(并发模式)

CM 本身并不是一个功能,而是一个底层设计,它使 React 能够同时准备多个版本的 UI。

  • 在之前的React 状态变更后,会开始准备虚拟 DOM,然后渲染真实 DOM,整个流程是串联的。一旦开始触发更新,只能等流程结束,期间是无法被中断的。

  • 在 并发模式下,React 在执行过程中,每执行一个 Fiber,都会检查有没有更高优先级的更新,如果有,则的暂停当前低优先级,待高优先级任务执行完之后,再继续执行或重新执行

image-20221013103206972 image-20221013095624110
1. useTransition

React 的状态更新可以分为两类:

  • 紧急更新(Urgent updates):比如打字、点击、拖动等,需要立即响应的行为,如果不立即响应会给人很卡的感觉。
  • 过渡更新(Transition updates):将 UI 从一个视图过渡到另一个视图。有些延迟,不立即相应是可以接受的。

并发模式只是提供了可中断的能力,默认情况下,所有的更新都是紧急更新。

所以它提供了 startTransition让我们手动指定哪些更新是紧急的,哪些是非紧急的。

/*
 * @作者: kerwin
 */
import React, { useState, useEffect, useTransition } from 'react';

function List(props) {
    const [list, setList] = useState([]);
    useEffect(() => {
        setTimeout(()=>{
            setList(new Array(5000).fill(""));
        },100)
    }, [props.search]);
    return (
        <ul>
            {list.map((item, index) => (
                <Item key={index} value={index+"_"+props.search}></Item>
            ))}
        </ul>
    );

}

function Item(props) {
    return <li>
        {props.value}
    </li>
}

export default function App() {
    const [search, setSearch] = useState("")
    const [text, setText] = useState("")
    const [isPending, startTransition] = useTransition();

    return (
        <div>
            <input value={text} onChange={(evt) => {
                setText(evt.target.value)
                startTransition(()=>{
                    setSearch(evt.target.value)
                })
            }} /> {isPending && "等待..."}

            <List search={search} />
        </div>
    )
}


2. useDeferredValue

这个方法返回一个延迟响应的值,可以让一个state 延迟生效,只有当前没有紧急更新时,该值才会变为最新值。useDeferredValuestartTransition 一样,都是标记了一次非紧急任务更新。

  • 相同:useDeferredValue 本质上和与 useTransition 内部实现一样,都是标记成了延迟更新任务。
  • 不同:useTransition 是把更新任务变成了延迟更新任务,而 useDeferredValue 把一个状态变成延迟的状态。
export default function App() {
    const [search, setSearch] = useState("")
    const [text, setText] = useState("")
    const [isPending, startTransition] = useTransition();

    return (
        <div>
            <input value={text} onChange={(evt) => {
                setText(evt.target.value)
                setSearch(evt.target.value)
            }} /> {isPending && "等待..."}

            <List search={useDeferredValue(search)} />
        </div>
    )
}

五. 严格模式(muted colors)

image-20221013181042367

六. Suspense组件的变化

React 18 的 Suspense 组件中,官方对 空的fallback 属性的处理方式做改变:不再跳过 缺失值 或 值为null 的 fallback 的 Suspense 边界。即使不写fallback, 也不会报错。

1. 版本17
<Suspense fallback={<Loading />}>   // <--- this boundary is used
  <Suspense>                        // <--- this boundary is skipped, no fallback
    <Page />
  </Suspense>
</Suspense>
2. 版本18
<Suspense fallback={<Loading />}>   // <--- not used
  <Suspense>                        // <--- this boundary is used, rendering null for the fallback
    <Page />
  </Suspense>
</Suspense>

Suspense源码

class Suspense extends React.Component { 
    state = { promise: null } 
    componentDidCatch(e) { 
        if (e instanceof Promise) { 
            this.setState(
            { promise: e }, () => { 
                e.then(() => { 
                    this.setState({ promise: null }) 
                }) 
            }) 
        } 
    } 
    render() { 
        const { fallback, children } = this.props 
        const { promise } = this.state 
        return <> 
            { promise ? fallback : children } 
        </> 
    } 
}

七. React 空组件的返回值

如果React返回一个空组件,React17只允许返回null 。React18 也允许返回undefined.

function Animal({type}) {
  if (type === 'cat') {
    // Will error, missing return statement.
    // This is always a mistake.
    <Cat />;
  }

  // Will error, returns undefined.
  // Did you mean to return nothing,
  // or did you forget to return a default?
  return;
}

八.组件卸载更新状态的警告删除

组件已经卸载,此时并没有内存泄漏,因为已经被垃圾回收机制回收了,此时,警告具有误导性,所以删除了。

image-20221014101056972

标签:千锋,const,18,更新,React,useState,return
From: https://www.cnblogs.com/SanshQ/p/17973633

相关文章

  • Git(千锋)
    目录Git一.走入Git1.Git介绍2.Git对比SVN3.Git安装二.Git常用命令1.设置用户签名2.初始化本地库3.Git工作区、暂存区和版本库4.gitadd5.gitcommit6.gitrevert与gitreset三.Git分支1.初识分支2.创建分支3.切换分支4.合并分支5.删除分支四.远程仓库1.创建一个远程仓库2.添......
  • Node.js(千锋)
    目录Node.js(最全)基础+全栈项目一、Node.js基础1.认识Node.js01nodejs的特性02使用Node.js需要了解多少JavaScript03浏览器环境vsnode环境2.开发环境搭建3.模块、包、commonJS02CommonJS规范03modules模块化规范写法4.Npm&Yarn01npm的使用02全局安装nrm03yar......
  • 探索Web开发的未来——使用KendoReact服务器组件
    KendoUI是带有jQuery、Angular、React和Vue库的JavaScriptUI组件的最终集合,无论选择哪种JavaScript框架,都可以快速构建高性能响应式Web应用程序。通过可自定义的UI组件,KendoUI可以创建数据丰富的桌面、平板和移动Web应用程序。通过响应式的布局、强大的数据绑定、跨浏览器兼容......
  • loading改用react hooks
    //子组件importReact,{useState,useEffect}from'react';import{Modal}from'antd';constChildComponent=({onCancel})=>{const[loading,setLoading]=useState(true);//useEffect监听父组件取消事件useEffect(()=>{......
  • react-query-builder查询构建器中文文档
    官方包https://www.npmjs.com/package/react-querybuilder官方演示https://react-querybuilder.js.org/demo/antd网友经验https://www.cnblogs.com/niyan/p/17414642.htmlimportReactfrom'react';importQueryBuilderfrom'react-query-builder';const......
  • 2. Vue3源码解析之 reactive
    前言我们知道Vue3中声明响应式是通过reactive和ref这两个函数,下面我们通过案例先来看下reactive是如何实现的。案例首先引入reactive和effect两个函数,之后声明obj响应式对象,接着又执行effect函数,该函数传入了一个匿名函数,最后两秒后又修改obj.name值。<!DOC......
  • vite构建的react+ts项目中使用arcodesign组件的问题
    今天在react项目中使用arcodesign组件库,引入的图标巨大无比,调样式也不起作用,如下图。网上找了也没看到类似的问题,去官网文档里看,发现是没有引入组件的样式。在我这个vite构建的react+ts项目中找到两个解决办法:第一个是直接引入全部样式import"@arco-design/web-react/dist/cs......
  • react native 使用 FlatList 实现单选列表组件
    1.最终效果:2.实现代码:importReact,{useState}from'react';import{FlatList,SafeAreaView,StatusBar,StyleSheet,Text,TouchableOpacity,}from'react-native';constDATA=[{id:'zh_CN',title:&#......
  • 想给组件加上进入离开动画?试试 react-transition-group
    列表是很常见的场景:如果我们想给它加上进入离开的动画效果:怎么做呢?一般我们会用react-transition-group来做。在npm官网可以看到,这个包每周有750w下载量,还是非常流行的:那这个包怎么用呢?我们写下代码试一下:npxcreate-react-apptransition-group-test用create-react-app创......
  • React 系列 useImperativeHandle
    ReactHooks为我们提供了一种全新的方式来处理组件的状态和生命周期。其中,useImperativeHandle 是一个相对较少被提及的Hook,但在某些场景下,它是非常有用的。本文将深入探讨 useImperativeHandle 的用法,并通过实例来加深理解。什么是 useImperativeHandle?useImperativeHandle......