当前位置: 首页 > news >正文

React18学习笔记(六) React中的类组件,极简的状态管理工具zustand,React中的Typescript

文章目录

      • 一.React中的类组件
        • 1.什么是类组件?如何编写一个类组件
        • 2.类组件的生命周期函数
        • 3.类组件的组件通信
      • 二.zustand - 状态管理工具
        • 1.基础用法
        • 2.异步写法
        • 3.切片模式
      • 三.React中的Typescript

一.React中的类组件

写在前面:

React的早期版本都是使用Class组件来阻止代码的,因此类组件的学习仅限了解和为可能的兼容老项目的场景做知识储备

1.什么是类组件?如何编写一个类组件

定义:通过JS中的类来组织组件的代码
步骤:

  • 1.通过类属性state来定义状态数据
  • 2.通过setState方法来修改状态数据
  • 3.通过render来写UI模板(JSX语法)
    示例:
//App.js
import { Component } from 'react'
class Counter extends Component {//基类:Component//step1:定义状态变量state={count:0}//事件回调clickHandler=()=>{//step2:通过setState修改状态数据this.setState({count:this.state.count+1})}//3.UI模板(JSX)render(){return <button onClick={this.clickHandler} >{this.state.count}</button>}
}
*React18中可以把Counter作为子组件插入App中以显示效果
2.类组件的生命周期函数

定义:组件从创建到销毁的各个阶段自动执行的函数
常用且重要的2个生命周期函数:
      1).componentDidMount:组件挂载完毕时执行,使用场景:获取异步数据
      2).componentWillUnmount:组件卸载时自动执行,使用场景:清理副作用
示例:

//App.js
import { Component } from 'react'
class Counter extends Component {//基类:Component//step1:定义状态变量state={count:0}//事件回调clickHandler=()=>{//step2:通过setState修改状态数据this.setState({count:this.state.count+1})}/*生命周期*///组件渲染完毕时执行一次,发送网络请求componentDidMount(){console.log('组件渲染完毕了,发送网络请求...')this.timer=setInterval(()=>{console.log('定时器运行中...')},1000)}//组件卸载时执行,清理副作用,如清除定时器,清除事件绑定componentWillUnmount(){console.log('组件卸载了,清除副作用...')clearInterval(this.timer)}//3.UI模板(JSX)render(){return <button onClick={this.clickHandler} >{this.state.count}</button>}
}
3.类组件的组件通信

概念:类组件和Hooks编写的组件在组件通信的思想上完全一致

父传子:通过prop绑定数据
子传父:通过prop绑定父组件的函数,子组件调用
兄弟组件通信:状态提升

示例一:父传子:

//App.js
//父组件
class Parent extends Component{render() {return <Child msg="hello from Parent" />;}
}
//子组件
class Child extends Component{render() {return <div>子组件接收到的数据:{this.props.msg}</div>;}
}

示例二:子传父

//App.js
//父组件
class Parent extends Component{render() {const getSonMsg = (msg) => {console.log('父组件收到子组件的消息:', msg)}return <div><div>父组件</div><Child onGetSonMsg={getSonMsg} /></div>}
}
//子组件
class Child extends Component{render() {const sendMsg = () => {this.props.onGetSonMsg('hello from child')}return <div><div>子组件</div><button onClick={sendMsg}>点击子传父</button></div>}
}

二.zustand - 状态管理工具

官网:https://awesomedevin.github.io/zustand-vue/docs/introduce/start/zustand

1.基础用法

流程和redux一样:

  • 创建store(新增状态数据和操作方法)
  • 绑定到组件
  • 在组件中使用状态数据和方法

示例:

const useStore=create((set)=>{return{//状态管理count:1,//修改状态变量的方法inc:()=>{set((state)=>({count:state.count+1}))}}
})function App(){//2.绑定store到组件count {count,inc}=usStore()return (<button onClick={inc}>{count}</button>)
}export default App
2.异步写法

zustand对异步的支持不需要特殊的操作,
直接在函数中书写异步逻辑,最后只需在调用set方法,传入新状态即可

const useStore=create((set)=>{return{//状态管理count:1,channelList:[]//修改状态变量的方法inc:()=>{set((state)=>({count:state.count+1}))}//异步方法fetchChannelList:async ()=>{const res=await fetch(URL)const jsonData=await res.json()//调用set方法更新状态变量set({channelList:jsonData.data.channels})}}
})function App(){//2.绑定store到组件count {count,inc}=useStore()count {channelList,fetchChannelList}=useStore()return (<button onClick={inc}>{count}</button><ul>{channelList.map(item=><li key={item.id}>{item.name}</li>)}</ul>)
}
3.切片模式

当单个store比较大的时候,可以采用切片模式对模块进行拆分组合,类似于模块化
示例:把上例中的两个useStore拆分成子模块

//App.js
import {create} from 'zustand'
//1.创建counter相关的切片
const createCounterStore=(set)=>{return{//状态管理count:1,//修改状态变量的方法inc:()=>{set((state)=>({count:state.count+1}))}}
}const createChannelStore=(set)=>{return{//状态管理count:1,channelList:[]//修改状态变量的方法inc:()=>{set((state)=>({count:state.count+1}))}//异步方法fetchChannelList:async ()=>{const res=await fetch(URL)const jsonData=await res.json()//调用set方法更新状态变量set({channelList:jsonData.data.channels})}}
}//3.组合切片
const useStore=create((...a)=>({...createCounterStore,...createChannelStore
}))function App(){//2.绑定store到组件count {count,inc}=useStore()count {channelList,fetchChannelList}=useStore()return (<button onClick={inc}>{count}</button><ul>{channelList.map(item=><li key={item.id}>{item.name}</li>)}</ul>)
}export default App

三.React中的Typescript

http://www.dtcms.com/a/482348.html

相关文章:

  • Jenkins 实现 Vue 项目自动化构建与远程服务器部署
  • Jenkins集成Jmeter压测实战攻略
  • Kubernetes 集群调度与PV和PVC
  • 工具: 下载vscode .vsix扩展文件方法
  • FastbuildAI后端ConsoleModule模块注册分析
  • Ubuntu安装Hbase
  • 恶意进程排查
  • Docker Desktop在MAC上无法强制关闭的命令清理方式
  • Android音频学习(二十二)——音频接口
  • 河北网站备案流程抖音代运营交1600押金
  • 专做正品 网站网站关键词优化培训
  • 2025年--Lc184--62.不同路径(动态规划)--Java版
  • 区块链的理解
  • 【GUI自动化测试】YAML 配置文件应用:从语法解析到 Python 读写
  • 使用llamaindex实现RAG时 的常见使用框架或工具
  • YOLOv3:高效精准的实时目标检测算法
  • 怎么做坑人网站同城新闻app有哪些
  • 网站建设需求调研问卷韶关网站开发
  • 设计模式篇之 责任链模式 Chain of Responsibility
  • 阿里云-ECS实例信息统计并发送统计报告到企业微信
  • LeetCode 刷题【119. 杨辉三角 II、120. 三角形最小路径和】
  • Jmeter跨线程组获取参数
  • Tomcat核心组件全解析
  • 盈利型网站wordpress系列教程 pdf
  • 基于OpenCASCADE的分层点云到STL实体模型转换技术
  • Dubbo RPC 调用中用户上下文传递问题的解决
  • 推广网站设计推广方案用户体验设计软件
  • 权威的电商网站建设销售平台建设方案
  • 基于浏览器的DOCX文件编辑器:实现导入、编辑与导出功能
  • Android adb 基础使用指南