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. linux命令之---ping

    1)命令简介 ping命令用来测试主机之间网络的连通性.执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常. 2)命令参数 ...

  2. qt creator源码全方面分析(2-10)

    目录 Creating Plugins Creating Plugins Qt Creator的核心是一个插件加载程序,加载并运行一组插件,实际上是这些插件提供了您从Qt Creator IDE中了解 ...

  3. Spring boot内置Tomcat的临时目录被删除导致文件上传不了-问题解析

    目录 1.问题 2.1. 为什么需要使用这个/tmp/tomcat*? 2.2.那个 /tmp/tomcat* 目录为什么不存在? 三.解决办法 修改 springboot 配置,不要在/tmp 下创 ...

  4. JavaScript——基础知识,开始我们的js编程之旅吧!

    JavaScript基础第01天 1. 编程语言 编程语言: 可以通过类似于人类语言的"语言"来控制计算机,让计算机为我们做事情,这样的语言就叫做编程语言(Programming ...

  5. 初识matlab

    1 matlab概貌 MATLAB是MATrix LABoratory(矩阵实验室)的缩写,是一款由美国The MathWorks公司出品的商业数学软件.matlab是一种用于算法开发.数据可视化.数 ...

  6. Android中实现一个简单的逐帧动画(附代码下载)

    场景 Android中的逐帧动画,就是由连续的一张张照片组成的动画. 效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 ...

  7. Spring Boot从入门到精通(一)搭建第一个Spring Boot程序

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过 ...

  8. SDRAM的引脚封装标准

    SDRAM从发展到现在已经经历了五代,分别是:第一代SDR SDRAM,第二代DDR SDRAM,第三代DDR2 SDRAM,第四代DDR3 SDRAM,第五代DDR4 SDRAM.第一代SDRAM采 ...

  9. python爬虫步骤 (新手备学 )爬虫编程。

    Python爬虫是用Python编程语言实现的网络爬虫,主要用于网络数据的抓取和处理,相比于其他语言,Python是一门非常适合开发网络爬虫的编程语言,大量内置包,可以C Python爬虫可以做的事情 ...

  10. 浅析设计模式之mvc、mvp、mvvm

    mvc.mvvm.mvp是常见的设计模式,也是常见的设计思想,现对它们进行简要的归纳总结 三种模式的介绍 1.MVC:经典设计模式 View 传送指令到 Controller(控制器) Control ...