【React Hooks 系列】useState

简介: 前端西瓜哥

大家好,我是前端西瓜哥。

React 在 16.8 引入了 Hooks 概念,赋予了函数组件以 “魔法”,也能像类组件一样使用内部状态、上下文等特性。下面我们看看其中 useState 的使用方式。

useState

const [count, setCount] = useState(0);

useState 用于声明函数组件需要用的状态变量,对应类组件的内部状态对象 this. state 的单个属性。

useState 方法会返回:

  1. 状态值 state;
  2. 可以修改该状态的方法 setState。

useState() 方法的第一个参数如果不是函数,会被直接作为 state 的初始值。

但如果这个参数是函数,会有点不一样。useState 会执行这个函数,取它的返回值作为初始值。

不过如果你就是想用一个函数作为初始值,还是要通过让函数返回函数的方式来拿到它:

const fn = () => { /* 内容 */ };
const [handler, setHandler] = useState(() => fn);

函数可以用来做懒加载。也适合于需要用到复杂计算的情况,传入的函数只会在第一次渲染时才执行,之后的渲染都不会执行

如果你把计算放到外面,每次渲染其实都是在做无用功,因为最后的计算结果并不会被使用。

setState

我们通过 setState 给 state 更新新值,常用方式是直接传一个值。

或者传入一个函数,它能够拿到上一个状态的 state,然后基于它实现逻辑,函数的返回值就会作为 state 的新状态。

函数写法在一段逻辑中需要多次累加计数器的场景下,还是相当有用的。

setCount(newCount);
setCount(preCount => preCount + 1);

和前面设置 state 初始值一样,你如果要给 state 赋予一个新函数,你也需要通过让函数返回函数的方式实现。

如果新值和原来的值相同,将不会触发重新渲染。

这里的对比使用的是 Object.is() 方法。

这里有一个初学者容易踩的坑:如果你修改原对象的属性,然后将原对象直接传给 setState 执行,其实并不会触发组件的重新渲染,因为新旧引用其实都指向相同的对象。

所以对于引用类型,比如对象、数组、Map、Set 等,你都要浅拷贝后再给 setState 执行,这样才能保证组件能被重新渲染。

const [info, setInfo] = useState({ name: 'fe_watermelon', age: 99 });
info.age = 199;
setInfo(info); // 不会触发重新渲染,还是原来的对象
setInfo({...info}); // 这样才会重新渲染,因为是拷贝出来的新对象

结尾

总结一下,useState 会返回一个状态 state 和一个更新状态的函数 setState。

useState 的初始化只会执行一次,以后再调用函数组件时,会用 state 最后被设置的状态。

通过 setState 更新状态时,要注意新旧值不能相等,否则组件不会重新渲染,所以你要特别注意对象、数组这些引用类型,需要将其拷贝为新对象才能触发更新。

我是前端西瓜哥,一个在努力学习 React 的 React 新人。

相关文章
|
6天前
|
前端开发 JavaScript
深入理解并实践React Hooks —— useEffect与useState
深入理解并实践React Hooks —— useEffect与useState
27 1
|
2天前
|
前端开发 JavaScript 开发者
深入探索React Hooks的魔力
深入探索React Hooks的魔力
21 10
|
22天前
|
JavaScript 前端开发 安全
[译] 使用 TypeScript 开发 React Hooks
[译] 使用 TypeScript 开发 React Hooks
|
23天前
|
前端开发 JavaScript API
React Hooks 的使用场景有哪些?
【8月更文挑战第25天】
38 2
|
6天前
|
前端开发 JavaScript
react hooks深拷贝后无法保留视图状态
react hooks深拷贝后无法保留视图状态
12 0
|
20天前
|
前端开发 开发者 UED
数据校验的艺术:揭秘JSF如何将前端与后端验证合二为一,打造无缝用户体验
【8月更文挑战第31天】JavaServer Faces(JSF)是构建企业级Web应用的Java规范,提供了丰富的组件和API,便于快速搭建用户界面。JSF验证框架基于JavaBean验证API(JSR 303/JSR 380),利用注解如`@NotNull`、`@Size`等在模型类上定义验证规则,结合前端的`<h:inputText>`和`<h:message>`标签展示错误信息。
23 0
|
20天前
|
容器 Kubernetes Docker
云原生JSF:在Kubernetes的星辰大海中,让JSF应用乘风破浪!
【8月更文挑战第31天】在本指南中,您将学会如何在Kubernetes上部署JavaServer Faces (JSF)应用,享受容器化带来的灵活性与可扩展性。文章详细介绍了从构建Docker镜像到配置Kubernetes部署全流程,涵盖Dockerfile编写、Kubernetes资源配置及应用验证。通过这些步骤,您的JSF应用将充分利用Kubernetes的优势,实现自动化管理和高效运行,开启Java Web开发的新篇章。
35 0
|
20天前
|
前端开发 JavaScript API
掌握React表单管理的高级技巧:探索Hooks和Context API如何协同工作以简化状态管理与组件通信
【8月更文挑战第31天】在React中管理复杂的表单状态曾是一大挑战,传统上我们可能会依赖如Redux等状态管理库。然而,React Hooks和Context API的引入提供了一种更简洁高效的解决方案。本文将详细介绍如何利用Hooks和Context API来优化React应用中的表单状态管理,通过自定义Hook `useForm` 和 `FormContext` 实现状态的轻松共享与更新,使代码更清晰且易于维护,为开发者带来更高效的开发体验。
25 0
|
20天前
|
前端开发
【实战指南】React Hooks 详解超厉害!六个步骤带你提升 React 应用状态管理,快来探索!
【8月更文挑战第31天】React Hooks 是 React 16.8 推出的新特性,允许在函数组件中使用状态及其它功能而无需转换为类组件。通过以下六个步骤可有效提升 React 应用的状态管理:1)使用 `useState` Hook 添加状态;2)利用 `useEffect` Hook 执行副作用操作;3)在一个组件中结合多个 `useState` 管理不同状态;4)创建自定义 Hook 封装可重用逻辑;5)借助 `useContext` 访问上下文以简化数据传递;6)合理运用依赖项数组优化性能。React Hooks 为函数组件带来了更简洁的状态管理和副作用处理方式。
27 0
|
20天前
|
前端开发 JavaScript 测试技术
React Hooks vs. Class Components的奥秘:如何用新时代开发模式让你的项目一鸣惊人?
【8月更文挑战第31天】在现代Web开发中,React提供了两种主要的组件实现方式:Hooks和Class Components。React Hooks自16.8版本推出,允许开发者在不使用类的情况下访问状态和生命周期方法,提高了函数组件的功能性和开发效率。Class Components则基于JavaScript类,提供了丰富的生命周期方法,便于精细控制组件行为。尽管两者在代码组织、性能及开发效率上各有千秋,但随着Hooks的普及,前端开发模式正逐渐转变,Hooks因其实现简便性成为越来越多开发者的选择,而在需要细致管理生命周期的场景下,Class Components仍具优势。
21 0