props与TypeScript

2023-12-27 16:56:40

props与TypeScript基础使用

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

具体演示代码如下:

import { useState } from 'react';

// 方法一:
// type Props = {
//   className: string
// }

// 方法二:
interface Props {
  className: string,
  title?: string // 可选项
}

type User = {
  name: string,
  age: number
}

function Button(props: Props) {
  const { className } = props;

  return <button className={className}>按钮</button>
}

function App() {
  const [user, setUser] = useState<User | null>(null);

  return (
    <div>
      apo:
      {user?.age}
      {user?.name}

      <Button className="test" />
    </div>
  )
}

export default App;

props与TypeScript - 为children添加类型

children是一个比较特殊的prop,支持多种不同类型数据的传入,需要通过一个内置的ReactNode类型来做注解


具体演示代码如下:

type Props = {
  children?: React.ReactNode // ?:代表可选
}

function Button(props: Props) {
  const { children } = props;

  return (
    <button>{children}</button>
  )
}

function App() {
  return (
    <Button>
      <div style={{ color: 'red' }}>
        按钮
      </div>
    </Button>
  )
}

export default App;

props与TypeScript - 为事件prop添加类型

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

说明:
1. 在组件内部调用时需要遵守类型的约束,参数传递需要满足要求
2. 绑定prop时如果绑定内联函数直接可以推断出参数类型,否则需要单独注解匹配的参数类型

演示代码如下:


type Props = {
  onGetMsg?: (msg: string) => void
}

function Son(props: Props) {
  const { onGetMsg } = props;

  const clickHandler = () => {
    // Props内部强制要求传字符串因此需要添加
    onGetMsg?.("this is msg");
  }

  return (
    <button onClick={clickHandler}>sendMsg</button>
  )
}

function App() {
  const getMsgHandler = (msg: string) => {
    // 单独拎出来就必需注解
    console.log(msg)
  }

  return (
    <div>
      {/* 内联绑定可以直接推导出来是string类型,所以可以直接这么写 */}
      <Son onGetMsg={(msg) => console.log(msg)} />

      {/* 单独拎出来就必需注解 */}
      <Son onGetMsg={getMsgHandler} />
    </div>
  )
}

export default App;

props与TypeScript - 获取dom(useRef)

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


演示代码如下:

import { useEffect, useRef } from "react";

function App() {
  const inputRef = useRef<HTMLInputElement>(null)
  const spanRef = useRef<HTMLSpanElement>(null)

  useEffect(() => {
    console.log(inputRef, spanRef);
    inputRef.current?.focus();
  }, [])

  return (
    <div>
      <input ref={inputRef} />
      <span ref={spanRef}>111</span>
    </div>
  )
}

export default App;

props与TypeScript - 引用稳定的存储器(useRef)

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


演示代码如下:

import { useEffect, useRef } from "react";

function App() {
  const timerRef = useRef<number | undefined>(undefined)

  useEffect(() => {
    timerRef.current = setInterval(() => {
      console.log(1);
    }, 1000);

    return () => {
      clearInterval(timerRef.current)
    }
  }, [])

  return (
    <div>
      哈哈
    </div>
  )
}

export default App;

文章来源:https://blog.csdn.net/weixin_50236973/article/details/135241856
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。