这是我参与「第四届青训营 」笔记创作活动的的第6天
打包react项目
- 运行npm run build
"build": "react-scripts build" - 如果想查看效果
npm i serve -g
serve在build文件夹下输入此命令即可
setState
-
setState(stateChange, [callback])------对象式的setState
- stateChange为状态改变对象(该对象可以体现出状态的更改)
- callback是可选的回调函数, 它在状态更新完毕、界面也更新后(render调用后)才被调用
- stateChange为状态改变对象(该对象可以体现出状态的更改)
-
setState(updater, [callback])------函数式的setState
- updater为返回stateChange对象的函数。
- updater可以接收到state和props。
- updater返回新的state对象
- callback是可选的回调函数, 它在状态更新、界面也更新后(render调用后)才被调用。
-
总结:
- 对象式的setState是函数式的setState的简写方式(语法糖)
- 使用原则:
(1).如果新状态不依赖于原状态 ===> 使用对象方式
(2).如果新状态依赖于原状态 ===> 使用函数方式
(3).如果需要在setState()执行后获取最新的状态数据, 要在第二个callback函数中读取
lazyLoad
import {lazy,Suspense} from 'react'
-
通过React的lazy函数配合import()函数动态加载路由组件 ===> 路由组件代码会被分开打包 const Login = lazy(()=>import('@/pages/Login'))
-
通过指定在加载得到路由打包文件前显示一个自定义loading界面 <Suspense fallback={
loading.....
}> <Route path="/xxx" element={}/> <Route path="/" element={}>
Hooks
-
useState
- State Hook让函数组件也可以有state状态, 并进行状态数据的读写操作
- 语法: const [xxx, setXxx] = React.useState(initValue)
- useState()说明:
- 参数: 第一次初始化指定的值在内部作缓存
- 返回值: 包含2个元素的数组, 第1个为内部当前状态值, 第2个为更新状态值的函数
- setXxx()2种写法:
- setXxx(newValue): 参数为非函数值, 直接指定新的状态值, 内部用其覆盖原来的状态值
- setXxx(value => newValue): 参数为函数, 接收原本的状态值, 返回新的状态值, 内部用其覆盖原来的状态值
-
useEffect
- Effect Hook 可以让你在函数组件中执行副作用操作(用于模拟类组件中的生命周期钩子)
- React中的副作用操作: 发ajax请求数据获取 设置订阅 / 启动定时器 手动更改真实DOM
- 语法和说明:
useEffect(()=>{})相当于DidMount和DidUpdate useEffect(()=>{return()=>{}})返回的函数相当于WillUnmount useEffect(()=>{},[])返回的函数相当于DidMount useEffect(()=>{},[xx,xx])DidMount和只限定于xx状态改变的DidUpdate- 可以把 useEffect Hook 看做如下三个函数的组合
componentDidMount()
componentDidUpdate()
componentWillUnmount()< br>
-
useRef
- Ref Hook可以在函数组件中存储/查找组件内的标签或任意其它数据
- 语法: const refContainer = useRef()
- 作用:保存标签对象,功能与React.createRef()一样
const myRef=React.useRef() ... <input ref={myRef}/> ... myRef.current//即可拿到input标签对象 -
Fragment
import {Fragment} from 'react' <Fragment key={}> ...//用来符合jsx的语法规范只有一个根标签,页面渲染时自动去除 </Fragment> <> 也可以用空标签,但是要遍历的话必须写fragment,因为可以给key值 </> -
createContext
-
创建Context容器对象: const XxxContext = React.createContext()
-
渲染子组时,外面包裹xxxContext.Provider, 通过value属性给后代组件传递数据: <xxxContext.Provider value={数据}> 子组件 </xxxContext.Provider>
-
后代组件读取数据:
//第一种方式:仅适用于类组件 static contextType = xxxContext this.context //第二种方式: 函数组件与类组件都可以 <xxxContext.Consumer> { value => ( // value就是context中的value数据 ) } </xxxContext.Consumer>
-
-
PureComponent
子组件extends于PureCompoents,那么当父组件的render调用但不影响子组件时不会导致子组件的render调用,可以做优化 -
render属性
- 可以实现vue里面的插槽
<Perent render={(name)=><Child name={name}}/>祖组件中- this.props.render("lili")//Perent组件中
- 错误边界
// 生命周期函数,一旦后代组件的生命周期报错,就会触发,写在父组件中
static getDerivedStateFromError(error) {
// 在render之前触发
// 返回新的state
return {
hasError: true//知道后控制组件的显示
};
}
componentDidCatch(error, info) {
// 统计页面的错误。发送请求发送到后台去
console.log(error, info);
}