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

React前端开发_Day11

参考课程:

黑马程序员 React18入门到实战】

[https://www.bilibili.com/video/BV1ZB4y1Z7o8]

@ZZHow(ZZHow1024)

React+TypeScript基础环境创建

  • Vite 官网

    Vite

  • 使用 Vite 创建项目:pnpm create vite react-ts-app --template react-ts

useState与TypeScript

  • 自动推导
    • 通常 React 会根据传入 useState 的默认值来自动推导类型,不需要显式标注类型

    • 案例:

      const [value, setValue] = useState(false)
      
      • value:类型为 boolean
      • setValue:参数类型为 boolean
    • 场景:明确的初始值

  • 传递泛型参数
    • useState 本身是一个泛型函数,可以传入具体的自定义类型

    • 案例:

      type User = {name: stringage: number
      }const [user, setUser] = useState<User>()
      
      • 限制 useState 函数参数的初始值必须满足类型为:User | () => User
      • 限制 setUser 函数的参数必须满足类型为:User | () => User | undefined
      • user 状态数据具备 User 类型相关的类型提示
  • 初始值为 null
    • 当我们不知道状态的初始值是什么,将 useState 的初始值为 null 是一个常见的做法,可以通过具体类型联合 null 来做显式注解

    • 案例:

      type User = {name: stringage: number
      }const [user, setUser] = useState<User | null>(null)
      
      • 限制 useState 函数参数的初始值可以是 User | null
      • 限制 setUser 函数的参数类型可以是 User | null
    • 为了类型安全可选链做类型守卫:只有 user 不为 null(不为空值)的时候才进行点运算

Props与TypeScript

  • 基础使用
    • 为组件 prop 添加类型,本质是给函数的参数做类型注解,可以使用 type 对象类型或者 interface 接口来做注解

    • 案例:

      // type 对象
      type Props = {className: string
      }/*
      interface 接口
      interface Props {className: string
      }
      */function Button(props: Props) {const {className} = propsreturn <button className={className}>Click me</button>
      }
      
      • Button 组件只能传入名称为 className 的 prop 参数,类型为 string,且为必填
  • 为 children 添加类型
    • children 是一个比较特殊的 prop,支持多种不同类型数据的传入,需要通过一个内置的 ReactNode 类型来做注解

    • 案例:

      type Props = {children: React.ReactNode
      }function Button(props: Props) {const {children} = propsreturn <button>{children}</button>
      }
      
    • 注解之后,children 可以是多种类型,包括:React.ReactElement、string、number、React.ReactFragment、React.ReactPortal、boolean、null、undefined

  • 为事件 prop 添加类型
    • 组件经常执行类型为函数的 prop 实现子传父,这类 prop 重点在于函数参数类型的注解

    • 案例:

      type Props = {onGetMsg?: (msg: string) => void
      }function Son(props: Props) {const {onGetMsg} = propsconst clickHandler = () => {onGetMsg?.('Son message')}return <button onClick={clickHandler}>Send message</button>
      }
      
      • 在组件内部调用时需要遵守类型的约束,参数传递需要满足要求
      • 绑定 prop 时如果绑定内联函数直接可以推断出参数类型,否则需要单独注解匹配的参数类型

useRef与TypeScript

  • 获取 DOM

    • 获取 DOM 的场景,可以直接把要获取的 DOM 元素的类型当成泛型参数传递给 useRef,可以推导出 .current 属性的类型

    • 案例:

      function App() {const domRef = useRef<HTMLInputElement>(null)useEffect(() => {domRef.current?.focus()}, [])return (<><input ref={domRef} /></>)
      }
      
  • 引用稳定的存储器

    • 把 useRef 当成引用稳定的存储器使用的场景可以通过泛型传入联合类型来做

    • 案例:

      function App() {const timerRef = useRef<number | undefined>(undefined)useEffect(() => {timerRef.current = setInterval(() => {console.log('定时器运行中')}, 1000)return () => clearInterval(timerRef.current)}, [])return <div>App</div>
      }
      
http://www.dtcms.com/a/359492.html

相关文章:

  • Pytest+Selenium4 Web自动化测试框架(三日速通)
  • 数据中心网络实现梳理
  • 变频器实习总结14 电子元件中的内部参考电压 Type-c口对于BMS开发的优点
  • Caffeine TimerWheel时间轮 深度解析:O(1)复杂度增删和触发时间事件
  • 2025.8.31基于UDP的网络聊天室项目
  • 数值分析——非线性方程与方程组的数值解法之迭代法
  • Nginx虚拟主机配置
  • 从RNN到BERT
  • 北斗导航 | GNSS定位模式技术总结:原理、分类与应用实践
  • OpenCV 图像轮廓检测
  • Python爬虫实战:研究Subplots,构建电商平台数据采集和分析系统
  • Spark内存管理
  • C++ 登录状态机项目知识笔记
  • GitHub Spark深度体验:是革命前夜,还是又一个“大厂玩具”?
  • LVGL移植(STM32)
  • 【开题答辩全过程】以 付费自习室系统小程序为例,包含答辩的问题和答案
  • 鸿蒙Next文本组件全解析:输入框、富文本与属性字符串开发指南
  • 智能合约安全全解析:常见漏洞、真实案例与防范实践
  • Sequelize ORM - 从入门到进阶
  • LabVIEW电力系统自动化仿真实验教学系统
  • 鸿蒙Next媒体展示组件实战:Video与动态布局全解析
  • Java全栈开发面试实录:从基础到微服务的实战解析
  • VideoPoet:Google发布的用于视频生成的大语言模型
  • Python 开发 Web 应用“最高效”的框架有哪些?
  • 赵玉平《向诸葛亮借智慧》读书笔记
  • LangChain实战(六):Document Transformers - 文本分割与处理
  • python调用豆包大模型给人脸生成卡通图像
  • 【Linux系统】线程互斥
  • 自动驾驶中的传感器技术37——Lidar(12)
  • 大话 IOT 技术(2) -- 配网篇