React+TS 从零开始教程(3):useState

news2024/11/13 8:47:21

源码链接:下载

在开始今天的内容之前呢,我们需要先看一个上一节遗留的问题,就是给属性设置默认值。

我们不难发现,这个defaultProps已经被废弃了,说明官方并不推荐这样做。其实,这个写法是之前类组件的时候常用的,但现在都是函数式组件了,就不推荐这样写了。

我们在编写参数的时候,完全可以直接设置默认值,即传参的时候就解构,并初始化。

const Hello : React.FC <IProps> = ({message = 'Hello world~'}) => {
    return <h2>{message}</h2>
}

当然了,如果你非要用defaultProps,也不是不可以。

好了,这一节我们来讲讲Hook。

首先呢,第一个问题,我们要弄清楚hook是什么?

hook是一个特殊的函数,React Hooks 是 React 16.8 版本中引入的一个新特性,它允许你在不编写 class 的情况下使用 state 以及其他的 React 特性。Hooks 的主要目的是在不增加组件复杂性的前提下,增强函数组件的功能。

如果你在编写这个函数组件的时候,想要设置一些组件的变量(状态),以前的做法,我们是必须把组件转化成一个class,然后用setState去做。

现在有了hook,就只需要引入一个useState即可。

小需求

来一个小需求,我要完成一个组件,用于提供一个开关变量,只有一个布尔类型的状态。

import React, { useState } from "react";

const Switch = () => {
  //每一个变量都要单独做一个State
  //useState解构出两个变量,一个是变量名,一个是赋值这个变量的函数
  const [on,setOn] = useState(false)
  return (
    <>
    <h2 onClick={ () => {setOn(!on)}}>
    {on?'关闭':'开启'}
    </h2>
    </>
  )
}

export default Switch;

效果就是点击一次就会自动切换:

State变量一定是写在函数内部的,接下来详细说明、

const [on,setOn] = useState(false)

1)useState(false): 设置第一个参数,也就是on的初始值为false

2)on: 解构出来的第一个参数,我们可以在render中直接使用

3)setOn: 解构出来的第二个参数,是一个函数,用来给on赋值

模态窗体

useState的应用很广泛,任何需要状态管理的组件,都会用到,下面我们再来一个模态窗体的例子。

import React, { useState } from 'react';  
  
const ModalExample = () => {  
  const [isOpen, setIsOpen] = useState(false);  
  
  const handleOpenModal = () => {  
    setIsOpen(true);  
  };  
  
  const handleCloseModal = () => {  
    setIsOpen(false);  
  };  
  
  return (  
    <>  
      <button onClick={handleOpenModal}>打开模态框</button>  
      {isOpen && (  
        <div className="modal">  
          <h2>模态框内容</h2>  
          <button onClick={handleCloseModal}>关闭模态框</button>  
        </div>  
      )}  
    </>  
  );  
}

export default ModalExample;

这个例子比较简单,大家看看就行。


筛选列表

import React, { useState } from 'react';  
import '../style/FilterableList.css'
  
const FilterableList = () => {  
  const [filterText, setFilterText] = useState('');  
  const [items, setItems] = useState(['华为mate60', '小米14 proMax', '荣耀Magic6']);  
  
  const filteredItems = items.filter(item =>  
    item.toLowerCase().includes(filterText.toLowerCase())  
  );  
  
  const handleFilterChange = (event:any) => {  
    setFilterText(event.target.value);  
  };  
  
  return (  
    <div className="filterable-list-container">  
      <div className="filter-input">  
        <input  
          type="text"  
          value={filterText}  
          onChange={handleFilterChange}  
          placeholder="过滤列表..."  
        />  
      </div>  
      <ul className="filtered-list">  
        {filteredItems.map(item => (  
          <li key={item} className="list-item">  
            {item}  
          </li>  
        ))}  
      </ul>  
    </div>  
  );  
}



export default FilterableList

css省略,详见源码。

页面效果:

在 React 中,useState Hook 使得函数组件具有状态管理能力。当状态(在这个例子中是 filterText)更新时,React 会重新渲染该组件及其子组件。在组件的渲染过程中,React 会 重新计算所有 依赖于该状态的表达式。

所以,当filterText发生改变,由于

  const filteredItems = items.filter(item =>  
    item.toLowerCase().includes(filterText.toLowerCase())  
  );  

filteredItems是依赖于filterText的,所以是这样的顺序。

1)filterText改变

2)开始触发DOM更新(还未更新)

3)重新计算所有依赖filterTextstate

4)DOM成功更新

这个小节,我们主要讲解了useState的用法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1858529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel 宏录制与VBA编程 —— 12、文本字符串类型相关(附示例)

字符串分割&#xff0c;文末示例&#xff08;文末代码3附有源码&#xff09; 代码1 - 基础字符串 代码2 - 字符串拆分 代码3 - 字符串分割 Option ExplicitSub WorkbooksClear()Dim DataRange As RangeSet DataRange Range("C2:E12")DataRange.Clear End SubSub Wo…

QGIS在VS2019开发

QGIS二次开发&#xff08;1&#xff09;—加载矢量、栅格图层&#xff08;QGIS 2.14.16 && Qt-4.8.6 && VS2010 &#xff09;_qgis开发教程-CSDN博客 VS2019QT5.15.2QGIS二次开发环境搭建&#xff08;非源码方式&#xff09;_qt qgis-CSDN博客 也许面向对象课…

MVVM——CommunityToolKit第三方详情

CommunityToolkit是微软推出的轻量级工具包&#xff0c;它集成了现代、快速和模块化的 MVVM 库。 安装 在NuGet 工具箱上搜索CommunityToolKit进行下载 观测对象 ObservableObject ObservableObject 是通过实现 INotifyPropertyChanged 和 INotifyPropertyChanging 接口可观…

单门户上集成多种数据库查询入口

&#xff08;作者&#xff1a;陈玓玏&#xff09; 开源项目&#xff0c;欢迎star哦&#xff0c;https://github.com/tencentmusic/cube-studio 在一家公司&#xff0c;我们通常会有多种数据库&#xff0c;每种数据库因为其特性承担不同的角色&#xff0c;比如mysql这种轻量…

红队内网攻防渗透:内网渗透之内网对抗:横向移动篇域控系统提权NetLogonADCSPACKDC永恒之蓝CVE漏洞

红队内网攻防渗透 1. 内网横向移动1.1 横向移动-域控提权-CVE-2020-1472 NetLogon1.2 横向移动-域控提权-CVE-2021-422871.3 横向移动-域控提权-CVE-2022-269231.4 横向移动-系统漏洞-CVE-2017-01461.5 横向移动-域控提权-CVE-2014-63241. 内网横向移动 1、横向移动-域控提权-…

LeetCode.32最长有效括号详解

问题描述 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 解题思路1 有效的括号字符串意味着每一个左括号 ( 都可以找到一个相匹配的右括号 )。栈可以帮助我们追踪尚未匹配的括号&#xff0c;并有效地处理…

缓存雪崩、穿透、击穿的概念和如何避免

雪崩 概念 高并发请求多个key&#xff0c;此时多个key同时失效、不在缓存中&#xff0c;请求全部打到数据库&#xff0c;使数据库无法处理这么多的连接&#xff0c;导致数据库死机 如何避免 防止多个key同时过期&#xff0c;设置随机的过期时间不设置过期时间&#xff0c;有…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 08:剩下的就是态度问题

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

chatglm系列知识

一、目录 chatglm 是什么语言模型与transformer decoder 的区别解释prefix LM与Cause LMchatglm&#xff08;prefix LM&#xff09;与decoder-only LM 核心区别glm 架构chatglm 预训练方式chatglm 微调chatglm与chatglm2、chatglm3的区别chatglm 激活函数采用gelu, 为什么chat…

融资融券账户与普通账户有何区别?一文读懂为什么要开通两融账户

01 融资融券账户与普通账户的区别 1、开通条件不同&#xff1a; ①普通账户&#xff1a;开户的门槛低&#xff0c;一般年满18岁以上就能开通。&#xff08;70岁以上需要临柜开户&#xff09;。 ②融资融券&#xff1a;融资融券的准入门槛相对较高&#xff0c;需要满足以下几…

SQLite3的使用

14_SQLite3 SQLite3是一个嵌入式数据库系统&#xff0c;它的数据库就是一个文件。SQLite3不需要一个单独的服务器进程或操作系统&#xff0c;不需要配置&#xff0c;这意味着不需要安装或管理&#xff0c;所有的维护都来自于SQLite3软件本身。 安装步骤 在Linux上安装SQLite…

python桌面应用

py文件 import osimport wx import wx.html2class MyFrame(wx.Frame):def __init__(self, parent):wx.Frame.__init__(self, parent, title"启动啦", size(1000, 700))# 创建一个Web视图组件self.browser wx.html2.WebView.New(self)# 加载本地HTML文件# self.brow…

WebFlux 和 Spring Security 会碰出哪些火花?

项目创建成功后&#xff0c;我们添加一个接口&#xff0c;用来获取登录用户信息&#xff0c;如下&#xff1a; RestController public class UserController { GetMapping(“/user”) public Mono getCurrentUser(Mono principal) { return principal; } } 注意我们的返…

【Leetcode每日一题】 01背包 - DP41 【模板】01背包(难度⭐⭐)(80)

1. 题目解析 题目链接&#xff1a;DP41 【模板】01背包 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 第一问&#xff1a;不超过总体积的背包问题 1. 状态表示 dp[i][j] 表示&#xff1a;从前 i 个物品中挑选&…

android adb常用命令集

1、系统调试 #adb shell&#xff1a;进入设备的 shell 命令行界面&#xff0c;可以在此执行各种 Linux 命令和特定的 Android 命令。 #adb shell dumpsys&#xff1a;提供关于系统服务和其状态的详细信息。 #adb logcat&#xff1a;实时查看设备的日志信息。可以使用过滤条件来…

Arduino称重传感器和 HX711 放大器(数字秤)

Arduino称重传感器和 HX711 放大器&#xff08;数字秤&#xff09; Arduino with Load Cell and HX711 Amplifier (Digital Scale) In this guide, you’ll learn how to create a digital scale with the Arduino using a load cell and the HX711 amplifier. First, you’l…

二叉树-左叶子之和(easy)

目录 一、问题描述 二、解题思路 三、代码实现 四、刷题链接 一、问题描述 二、解题思路 此题属于树遍历的简单题&#xff0c;用递归深度遍历的方式&#xff0c;当遇到左叶子结点(在递归函数中加上一个判断当前结点是左结点还是右结点的标记位)&#xff0c;此时加上当前结点…

ONLYOFFICE 桌面编辑器 8.1:全新升级,助您轻松高效处理办公文档

ONLYOFFICE 桌面编辑器 一、前言二、轻松编辑器 PDF 文件三、用幻灯片版式快速修改幻灯片四、无缝切换文档编辑、审阅和查看模式五、改进从右至左语言的支持 & 新的本地化选项六、版本 8.1&#xff1a;其他新功能七、ONLYOFFICE 官网&#xff1a;https://www.onlyoffice.co…

OnlyOffice8.1新功能测评

一、导语 时隔四个月&#xff0c;OnlyOffice推出了8.1版本。 四个月过去&#xff0c;笔者的项目也接近尾声&#xff0c;在项目过程中还把OnlyOffice插件推荐给了项目组&#xff0c;希望官方多出好用功能&#xff0c;造福我们广大项目O(∩_∩)O 回归正题&#xff0c;与前几个…