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. 从Golang中open的实现方式看Golang的语言设计

    Golang有很多优点: 开发高效:(C语言写一个hash查找很麻烦,但是go很简单) 运行高效:(Python的hash查找好写,但比Python高效很多) 很少的系统库依赖:(环境依赖少,一般不依 ...

  2. Python 高级网络操作 - Python Advanced Network Operations

    Python 高级网络操作 - Python Advanced Network Operations Half Open Socket, 一个单向的 socket 被称为 half open sock ...

  3. Python3(九) 闭包

    一. 一切皆对象 函数式编程并没有标准定义,如果代码非常繁琐则考虑使用. 学习闭包的概念,不是python独有的. 其他大多数语言中的函数只是一段可执行的代码,并不是对象. python中的函数是对象 ...

  4. c#音乐播放器

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. Django 系列

    Django基础 Django框架简介 Django 静态文件 Django request对象与ORM简介 Django路由系统 Django之视图层 Django之模板层 Django的setti ...

  6. float布局打破标准流,神助攻clear清浮动

    布局是什么?根据功能划分小块,再根据设计稿还原,书写静态页面,然后再在块里面填充内容,完善功能,js施加交互效果.div作为一个容器,独占一行,代码书写习惯从上至下属于标准流,而浮动float的css ...

  7. Mumbai:1 Vulnhub Walkthrough

    靶机地址: https://www.vulnhub.com/entry/mumbai-1,372/ 主机探测: 主机端口扫描: FTP 下载Note文件 TODO: Move these multip ...

  8. 微信小程序如何下载超过大小限制(10M)的视频?(苹果用户仔细看,安卓用户快速看)

    众所周知,微信小程序对下载的文件大小有限制,目前是最大支持10M.我们在用去水印小程序保存视频的时候,如果遇到长视频,视频大小可能就超过限制.遇到这种情况,我们如何才能把视频保存到手机相册呢? 首先, ...

  9. 寒假学习进度一(安卓配置环境的搭建和hello world)

    今天学习内容:观看了哔哩哔哩上的安卓教学视频,简单了解下了安卓的基本知识 具体内容: 一.配置安卓开发环境(安装Android studio,配置JDK) Android studio是个集成环境,不 ...

  10. MySQL真正的UTF-8字符集utf8mb4

    MySQL有个utf-8的坑 MySQL 的 utf8 实际上不是真正的 UTF-8.utf8 只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节. MySQL 一直没有修复这个 ...