扩展react|青训营笔记

43 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第6天

打包react项目

  1. 运行npm run build
    "build": "react-scripts build"
  2. 如果想查看效果
    npm i serve -g
    serve在build文件夹下输入此命令即可

setState

  1. setState(stateChange, [callback])------对象式的setState

    1. stateChange为状态改变对象(该对象可以体现出状态的更改)
    2. callback是可选的回调函数, 它在状态更新完毕、界面也更新后(render调用后)才被调用
  2. setState(updater, [callback])------函数式的setState

    1. updater为返回stateChange对象的函数。
    2. updater可以接收到state和props。
    3. updater返回新的state对象
    4. callback是可选的回调函数, 它在状态更新、界面也更新后(render调用后)才被调用。
  3. 总结:

    1. 对象式的setState是函数式的setState的简写方式(语法糖)
    2. 使用原则:
      (1).如果新状态不依赖于原状态 ===> 使用对象方式
      (2).如果新状态依赖于原状态 ===> 使用函数方式
      (3).如果需要在setState()执行后获取最新的状态数据, 要在第二个callback函数中读取

lazyLoad

import {lazy,Suspense} from 'react'

  1. 通过React的lazy函数配合import()函数动态加载路由组件 ===> 路由组件代码会被分开打包 const Login = lazy(()=>import('@/pages/Login'))

  2. 通过指定在加载得到路由打包文件前显示一个自定义loading界面 <Suspense fallback={

    loading.....

    }> <Route path="/xxx" element={}/> <Route path="/" element={}>

Hooks

  1. useState

    1. State Hook让函数组件也可以有state状态, 并进行状态数据的读写操作
    2. 语法: const [xxx, setXxx] = React.useState(initValue)
    3. useState()说明:
      • 参数: 第一次初始化指定的值在内部作缓存
      • 返回值: 包含2个元素的数组, 第1个为内部当前状态值, 第2个为更新状态值的函数
    4. setXxx()2种写法:
      • setXxx(newValue): 参数为非函数值, 直接指定新的状态值, 内部用其覆盖原来的状态值
      • setXxx(value => newValue): 参数为函数, 接收原本的状态值, 返回新的状态值, 内部用其覆盖原来的状态值
  2. useEffect

    1. Effect Hook 可以让你在函数组件中执行副作用操作(用于模拟类组件中的生命周期钩子)
    2. React中的副作用操作: 发ajax请求数据获取 设置订阅 / 启动定时器 手动更改真实DOM
    3. 语法和说明:
    useEffect(()=>{})相当于DidMount和DidUpdate
    useEffect(()=>{return()=>{}})返回的函数相当于WillUnmount
    useEffect(()=>{},[])返回的函数相当于DidMount
    useEffect(()=>{},[xx,xx])DidMount和只限定于xx状态改变的DidUpdate
    
    
    1. 可以把 useEffect Hook 看做如下三个函数的组合 componentDidMount()
      componentDidUpdate()
      componentWillUnmount()< br>
  3. useRef

    1. Ref Hook可以在函数组件中存储/查找组件内的标签或任意其它数据
    2. 语法: const refContainer = useRef()
    3. 作用:保存标签对象,功能与React.createRef()一样
    const myRef=React.useRef()
    ...
    <input ref={myRef}/>
    ...
    myRef.current//即可拿到input标签对象
    
  4. Fragment

    import {Fragment} from 'react'
    <Fragment key={}>
      ...//用来符合jsx的语法规范只有一个根标签,页面渲染时自动去除
    </Fragment>
    <>
    也可以用空标签,但是要遍历的话必须写fragment,因为可以给key值
    </>
    
  5. createContext

    1. 创建Context容器对象: const XxxContext = React.createContext()

    2. 渲染子组时,外面包裹xxxContext.Provider, 通过value属性给后代组件传递数据: <xxxContext.Provider value={数据}> 子组件 </xxxContext.Provider>

    3. 后代组件读取数据:

      //第一种方式:仅适用于类组件 
         static contextType = xxxContext
         this.context 
      
       //第二种方式: 函数组件与类组件都可以
         <xxxContext.Consumer>
           {
             value => ( // value就是context中的value数据
             )
           }
         </xxxContext.Consumer>
      
  6. PureComponent
    子组件extends于PureCompoents,那么当父组件的render调用但不影响子组件时不会导致子组件的render调用,可以做优化

  7. render属性

  • 可以实现vue里面的插槽
  • <Perent render={(name)=><Child name={name}}/>祖组件中
  • this.props.render("lili")//Perent组件中
  1. 错误边界
// 生命周期函数,一旦后代组件的生命周期报错,就会触发,写在父组件中
static getDerivedStateFromError(error) {
    // 在render之前触发
    // 返回新的state
    return {
        hasError: true//知道后控制组件的显示
    };
}

componentDidCatch(error, info) {
    // 统计页面的错误。发送请求发送到后台去
    console.log(error, info);
}

image.png