1) 组件
组件是一个UI片段,拥有独立的逻辑和显示
类型: Class组件, 函数组件
2) Hooks
1> useState
特点:
- 异步更新
- 可能会被合并
setCount(count + 1)
setCount(count + 1)
setCount(count + 1)
最后只会是初始值 + 1
但是
setCount(count => count + 1)
setCount(count => count + 1)
setCount(count => count + 1)
会是初始值 + 3
- 不可变数据
增删改
增: array.concat()
删: array.filter()
改: array.map()
状态提升: 子组件只执行父组件传过来的函数,数据显示。
immer:
install:
npm install immer --save
use:
import produce from 'immer'
1) setUserInfo(produce(draft => {
draft.age = xxx;
}))
2) setList(produce(draft => {
draft.push({xxx});
}))
immutable.js
2> useEffect
useEffect(() => {
xxx
}, [])
生命周期:创建,更新,销毁
销毁:
useEffect(() => {
xxx
return () => {
xxx // <= here execute when unmounted
}
}, [])
React 18开始, useEffect在开发环境下会执行两次
模拟组件 创建,销毁,再创建的完整流程,及早暴露bug
生产环境下执行一次
3> useRef
不用在JSX中显示,最好不用useState,用useRef比较好
1) 用于操作DOM
const inputRef = useRef<HTMLInputElement>(null);
function selectInput() {
const inputElem = inputRef.current;
if (inputElem) inputElem.select;
}
<input ref={inputRef} />
<button onClick={selectInput}></button>
2) 也可传入普通JS变量,但更新不会触发rerender
3) 要和Vue3 ref区分开
4> useMemo
缓存数据,React中常见的性能优化手段
const sum = useMemo(() => {
return num1 + num2;
}, [num1, num2]);
受控组件->变化会使variable也变化
<input onChange={e=>setText(e.target.value)} value={text}></input>
5> useCallback
缓存函数,根据依赖来决定是否重新改变
const fn = useCallback(() => {}, [text])
3) 自定义Hook
自定义hook,谁用了这个hook,useEffect就是在谁那里起作用
组件销毁时,一定要解绑DOM事件
e.g. get mouse coordinate
4) 第三方Hook
react-use 国外流行
ahooks 国内流行
Hooks使用规则
1) 必须用useXxx来命名
2) 只能在两个地方调用hook: 1) 组件内 2) 另外一个hook内
3) hook不能放在if, else, for里面。每次的执行顺序都必须一致
5) 闭包陷阱
异步函数获取state时,可能不是当前最新的state
可使用useRef来解决
e.g.,
点击alert按钮,然后快速点击 增加 按钮。此时alert展示出来的是最开始的值。
原因: 定时器,把最开始的值存起来了,3秒后才alert出来。
使用Ref:
解释闭包陷阱:
https://juejin.cn/post/6844904193044512782
6) 发布
commands to configure a static server:
npm run build
npm install -g serve
serve -s build
Comments
Post a Comment