📢 大家好,我是小丞同学,一名大二的前端爱好者
📢 这篇文章是学习 React-Redux 数据共享 的学习笔记
📢 非常感谢你的阅读,不对的地方欢迎指正 🙏
📢 愿你忠于自己,热爱生活
hooks 之间的状态是独立的,有自己独立的上下文,不会出现混淆状态的情况
1.
让函数有了状态管理
1.
解决了 组件树不直观、类组件难维护、逻辑不易复用的问题
1.
避免函数重复执行的副作用
从 react
中引入
给函数组件添加状态
const [count, setCount] = React.useState(0)
接收一个参数作为初始值,返回一个数组:第一个是状态变量,第二个是修改变量的函数
副作用 hooks
注意:
第一个参数接收一个函数,在组件更新的时候执行
第二个参数接收一个数组,用来表示需要追踪的变量,依赖列表,只有依赖更新的时候才会更新内容
第一个参数的返回值,返回一个函数,在 useEffect
执行之前,都会先执行里面返回的函数
一般用于添加销毁事件,这样就能保证只添加一个
React.useEffect(() => {
console.log('被调用了');
return () => {
console.log('我要被卸载了');
}
}, [count])
打印
和 useEffect
很类似
它的作用是:在 DOM 更新完成之后执行某个操作
注意:
useEffect
之前,其他都和 useEffect
都相同useEffect
执行时机在 render 之后
useLayoutEffect
执行时机在 DOM 更新之后
作用:让组件中的函数跟随状态更新
注意:优化函数组件中的功能函数
为了避免由于其他状态更新导致的当前函数的被迫执行
第一个参数接收一个函数,第二个参数为数组的依赖列表,返回一个值
const getDoubleNum = useMemo(() => {
console.log('ddd')
return 2 * num
}, [num])
作用:跟随状态更新执行
注意:
useMemo( () => fn, deps)
相当于 useCallback(fn, deps)
不同点:
useCallback
返回的是一个函数,不再是值useCallback
缓存的是一个函数,useMemo
缓存的是一个值,如果依赖不更新,返回的永远是缓存的那个函数props
的时候,如果当前组件不更新,不会触发子组件的重新渲染作用:长久保存数据
注意事项:
ref.current
不会触发重新渲染当我们通过正常的方式去获取计时器的 id
是无法获取的,需要通过 ref
useEffect(() => {
ref.current = setInterval(() => {
setNum(num => num + 1)
}, 400)
}, [])
useEffect(() => {
if (num > 10) {
console.log('到十了');
clearInterval(ref.current)
}
}, [num])
作用:带着子组件渲染
注意:
useContext
和 createContext
两个内容createContext
创建一个 Context
句柄Provider
确定数据共享范围value
来分发数据useContext
来获取数据import React, { useContext, createContext } from 'react'
const Context = createContext(null)
export default function Hook() {
const [num, setNum] = React.useState(1)
return (
<h1>
这是一个函数组件 - {num}
// 确定范围
<Context.Provider value={num}>
<Item1 num={num} />
<Item2 num={num} />
</Context.Provider>
</h1>
)
}
function Item1() {
const num = useContext(Context)
return <div>子组件1 {num}</div>
}
function Item2() {
const num = useContext(Context)
return <div>子组件2 {num}</div>
}
作用:去其他地方借资源
注意:函数组件的 Redux 的操作
store
和管理者 reducer
useReducer(store,dispatch)
来获取 state
和 dispatch
const store = {
num: 10
}
const reducer = (state, action) => {
switch (action.type) {
case "":
return
default:
return
}
}
const [state, dispatch] = useReducer(reducer, store)
通过 dispatch
去派发 action
放在 utils
文件夹中,以 use
开头命名
例如:模拟数据请求的 Hooks
import React, { useState, useEffect } from "react";
function useLoadData() {
const [num, setNum] = useState(1);
useEffect(() => {
setTimeout(() => {
setNum(2);
}, 1000);
}, []);
return [num, setNum];
}
export default useLoadData;
减少代码耦合
我们希望 reducer 能让每个组件来使用,我们自己写一个 hooks
自定义一个自己的 LocalReducer
import React, { useReducer } from "react";
const store = { num: 1210 };
const reducer = (state, action) => {
switch (action.type) {
case "num":
return { ...state, num: action.num };
default:
return { ...state };
}
};
function useLocalReducer() {
const [state, dispatch] = useReducer(reducer, store);
return [state, dispatch];
}
export default useLocalReducer;
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/m0_50855872/article/details/120679909
内容来源于网络,如有侵权,请联系作者删除!