useState

const [state, setSate] = useState(initialState)

特征:

  • setState 标识稳定,组件重新渲染时不会变化,useState 返回的第一个值始终是最新的state

  • state 如果是对象,当只更新对象部分属性时,state更新不会合并对象

  • 如果 state 不发生变化,调用 setState 将跳过更新

建议:将同一时间段更新的 state, 组合初始化在一起

函数式初始化 state

const [state, setState] = useState(()=>{
const initialState = someExpensiveComputation(props)
return initialState
})

更新 state 对象

setState((preState)=>{
return {...prevState, ...updatedValues};
})

useEffect

useEffect 组件渲染之后异步执行回调,并在下次渲染前执行

useLayoutEffect 组件渲染之后同步执行回调

useEffect(callback)//组件每次渲染,都会重新生成 useEffect
useEffect(callback,[依赖参数])//组件每次渲染之后,根据依赖参数判断是否重新生成 useEffect
useEffect(callback,[]) // 只在组件挂载时运行一次

useEffect Hook 对应的生命周期:

  • componentDidMount

  • componentDidUpdate

  • componentWillUnmount

依赖项频繁变化措施(引用官方例子):

function Counter() {
const [count, setCount] = useState(0); useEffect(() => {
const id = setInterval(() => {
setCount(c => c + 1); // ✅ setCount 函数式变更,没有依赖项
}, 1000);
return () => clearInterval(id);
}, []); // ✅ return <h1>{count}</h1>;
}

useReducer

应用场景:

  • 管理内部 state

  • 结合 context,利用 dispatch 避免父组件向下传递回调

const TodosDispatch = React.createContext(null);
// 父组件
function TodosApp() {
// 提示:`dispatch` 不会在重新渲染之间变化
const [todos, dispatch] = useReducer(todosReducer);
return (
<TodosDispatch.Provider value={dispatch}>
<DeepTree/>
</TodosDispatch.Provider>
);
}
// 子组件
function DeepTree(props) {
// 获取 dispatch。
const dispatch = useContext(TodosDispatch); function handleClick() {
dispatch({ type: 'add', text: 'hello' });
} return (
<button onClick={handleClick}>Add todo</button>
);
}

函数式初始化(引用官方例子)

function init(initialCount) {
return {count: initialCount};
} function reducer(state, action) {
switch (action.type) {
case 'increment':
return {count: state.count + 1};
case 'decrement':
return {count: state.count - 1};
case 'reset':
return init(action.payload);// 重新初始化 state,没用用到上一个state
default:
throw new Error();
}
} function Counter({initialCount}) {
const [state, dispatch] = useReducer(reducer, initialCount, init);
return (
<>
Count: {state.count}
<button
onClick={() => dispatch({type: 'reset', payload: initialCount})}> // 传入参数 Reset
</button>
<button onClick={() => dispatch({type: 'decrement'})}>-</button>
<button onClick={() => dispatch({type: 'increment'})}>+</button>
</>
);
}

useCallback

用于性能优化

const memoizedCallback = useCallback(
() => {
doSomething(a, b);
},
[a, b],
);

useMemo

用于性能优化,传入的函数在组件渲染时执行

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

useRef

const refContainer = useRef(initialValue);
// refContainer 为 ref 对象
// refContainer.current 可以保存任何可变值

特征

  • useRef 每次渲染时返回同一个 ref 对象

  • 变更 .current 属性不会引发组件重新渲染

如何检测 DOM 元素的变化?(官方例子)

function MeasureExample() {
const [height, setHeight] = useState(0); const measuredRef = useCallback(node => {
if (node !== null) {
setHeight(node.getBoundingClientRect().height);
}
}, []);// 检测 ref 的回调函数 return (
<>
<h1 ref={measuredRef}>Hello, world</h1>
<h2>The above header is {Math.round(height)}px tall</h2>
</>
);
}

自定义Hook

规则:函数必须以“use.."开头定义,内部可以调用其他Hook

应用场景:用于抽离共享逻辑和封装复杂的Hook

特征:

  • 不同组件共用自定义Hook,不会共享state

  • 组件可以多次调用自定义Hook

  • Hook之间可以传递信息(组件内的state传入自定义Hook,自定义Hook会随state变化而更新)

React Hooks 笔记1的更多相关文章

  1. react hooks 笔记

    1. 建议安装以上版本: "dependencies": { "react": "^16.7.0-alpha.2", "react ...

  2. React使用笔记1-React的JSX和Style

    React使用笔记1-React的JSX和Style Date: 2015-11-27 20:56 Category: Web Tags: JavaScript Author: 刘理想 [toc] 1 ...

  3. react学习笔记1--基础知识

    什么是react A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES[React是一个用于构建用户界面的JavaScript库.] React之所以快, ...

  4. React学习笔记--程序调试

    React学习笔记 二 程序调试   前面我们搭建好了React的基本开发环境,可以编写基本的React js程序了.但完成的开发环境肯定包含调试器,怎么调试用React编写的JS程序呢?有浏览器,比 ...

  5. 通过 React Hooks 声明式地使用 setInterval

    本文由云+社区发表 作者:Dan Abramov 接触 React Hooks 一定时间的你,也许会碰到一个神奇的问题: setInterval 用起来没你想的简单. Ryan Florence 在他 ...

  6. React学习笔记(一)- 入门笔记

    React入门指南 作者:狐狸家的鱼 本文链接:React学习笔记 GitHub:sueRimn 1.组件内部状态state的修改 修改组件的每个状态,组件的render()方法都会再次运行.这样就可 ...

  7. 初探React Hooks & SSR改造

    Hooks React v16.8 发布了 Hooks,其主要是解决跨组件.组件复用的状态管理问题. 在 class 中组件的状态封装在对象中,然后通过单向数据流来组织组件间的状态交互.这种模式下,跨 ...

  8. React hooks实践

    前言 最近要对旧的项目进行重构,统一使用全新的react技术栈.同时,我们也决定尝试使用React hooks来进行开发,但是,由于React hooks崇尚的是使用(也只能使用)function c ...

  9. 理解 React Hooks

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由志航发表于云+社区专栏 TL;DR 一句话总结 React Hooks 就是在 react 函数组件中,也可以使用类组件(classe ...

随机推荐

  1. 【Debian】 Debian 安装源配置

    Debian 安装源配置 所有的Linux安装完后第一件事,就是要更新安装源 安装源是什么呢,安装源又称软件源,是指把软件的安装源地址放在一个pool里面,用一条命令(比如apt-get instal ...

  2. computed setter

      computed setter computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4 var vm = new Vue({ el: '#app' ...

  3. jquery带下拉列表的购物车组件封装

    按照国际惯例先放效果图 安静的时候它长这样 等待加载时它长这样(功能是设置的按需加载,网速慢或者加载数据大时会出现) 加载之后购物车没有商品时这样 有商品长这样 接下来放代码: cart.html & ...

  4. 【读书笔记】https://source.android.google.cn/devices/bootloader

    https://source.android.google.cn/devices/bootloader 本文主要记录aosp官网关于bootloader的相关资料 Bootloader A bootl ...

  5. 有哪些「看似复杂,实则简单」的 PS 技巧?

    Mac版ps2019哪里有?本次主要以组合键为主,PS中隐藏功能都是通过这些“组合技”启动的,据统计熟练地使用一系列组合技会让你的效率提升30%(纯属虚构).其中一些比较难理解的我都制作了GIF动态图 ...

  6. Django 表关系的创建

    Django 表关系的创建 我们知道,表关系分为一对多,多对多,一对一 我们以一个图书管理系统为背景,设计了下述四张表,让我们来找一找它们之间的关系 Book与Publish表 找关系:一对多 左表( ...

  7. #《H.264和MPEG-4视频压缩》# 一. 色彩空间

    多数的数字视频应用需要播放彩色的视频信号,所以需要捕获和重现颜色信息.一幅黑白图像的每一个采样点只需要一个像素表示明暗或亮度,而在彩色图像中至少需要3个像素来表示每个像素的色彩.表示亮度和色彩的不同方 ...

  8. 【python数据挖掘】使用词云分析来分析豆瓣影评数据

    概述: 制作词云的步骤: 1.从文件中读取数据 2.根据数据追加在一个字符串里面,然后用jieba分词器将评论分开 3.设置WordCloud词云参数 4.保存最后的结果 数据:使用爬取的豆瓣影评数据 ...

  9. Node中使用MongoDB

    简介 MongoDB 中文文档 MongoDB是一个介于关系数据库和非关系数据库(nosql)之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. Mongoose 在Node中可以使用 Mo ...

  10. 关于js获取元素在屏幕中的位置的方法

    针对我们获取元素在页面中的位置的问题,我们还是用老师一峰老师的方法来解决吧 下面上HTML代码 <div class="left_footer"> <p data ...