useState
使用方法
const [n,setN] =React.useState(0)const [user,setUser] = useState({name:'Frank', age: 18})
注意事项
- useState不会合并属性,不可局部更新。
function App() {
const [user,setUser] = useState({name:'Frank', age: 18})
const onClick = ()=>{
setUser({
...user,//不加这一句不会合并age
name: 'Jack'
})}
return (
<div className="App">
<h1>{user.name}</h1>
<h2>{user.age}</h2>
<button onClick={onClick}>Click</button>
</div>
)}
- setState(obj)如果obj地址不变,那么React就认为数据没有变化
setState接受函数
优先使用函数方法:
setN(i => i+1)
useReducer
用来践行Flux/Redux 的思想
- 创建初始值 initialState
- 创建所有操作的reducer(state,action)
- 传给useReducer,得到读和写的API
- 调用写({type:'操作类型'})
- 示例代码
- 一个用useReducer的表单例子
如何代替Redux
- 将数据集中在一个store对象
- 将所有操作集中在reducer
- 创建一个Context
- 创建对数据的读写API
- 将第四步的内容放到第三步的Context
- 用Context.Provider将Context提供给所有组件
- 各个组件用useContext 获取读写API
useReducer
- 全局变量是全局的上下文
- 上下文是局部的全局变量
- 使用方法:
- 使用C= createContext(initial)创建上下文
- 使用<C.Provider>圈定作用域
- 在作用域内使用useContext(C)来使用上下文
useMemo
特点
- 第一个参数是
()=>value - 第二个参数是依赖[m,n]
- 只有当依赖变化时,才会计算出新的value
- 如果依赖不变,那么就会重用之前的value
- 注意:如果你的value是个函数,那么你就要写成
useMemo(()=>(x) => console.log(x)),这时也可以用useCallback useCallback(x => console.log(x))等价于useMemo(()=>(x) => console.log(x))
useRef
- 如果你需要一个值,在组件不断render时保持不变
- 初始化:const count = useRef(0)
- 读取:count.current
- 可以引用DOM对象
- 也可以用来引用普通对象
forwardRef
由于props不包含ref,所以需要forwardRef,示例