【ReactJs 中使用 TSX】基本、组件、方法、实现类的类型标注

ReactJs 中使用 TSX

组件事件

Click实现

Button 组件

js 复制代码
import React from 'react';

type ButtonClickHandler = (event: React.MouseEvent<HTMLButtonElement>) => void;

interface ButtonProps {
  onClick: ButtonClickHandler;
}

const Button: React.FC<ButtonProps> = ({ onClick, children }) => {
  return <button onClick={onClick}>{children}</button>;
};

export default Button;

用到 Button 组件的父组件

js 复制代码
import React from 'react';
import Button from './Button'

interface MyComponentProps {
  // ...
}

const MyComponent: React.FC<MyComponentProps> = () => {
  const handleButtonClick: ButtonClickHandler = (event) => {
    // 处理按钮点击事件...
  };

  return (
    <div>
      <h1>My Component</h1>
      <Button onClick={handleButtonClick}>Click me</Button>
    </div>
  );
};

ButtonClickHandler 是类型的名称,而 (event: React.MouseEvent<HTMLButtonElement>) => void 描述了这个类型的结构
具体来说,(event: React.MouseEvent<HTMLButtonElement>) 定义了事件处理程序的参数类型,表示它接受一个 React 提供的 MouseEvent 事件对象,并且这个事件是由 HTMLButtonElement 元素触发的。而 => void 表示事件处理程序不会返回任何值

Change实现

Input 组件

js 复制代码
import React from 'react';

type InputChangeHandler = (event: React.ChangeEvent<HTMLInputElement>) => void;

interface InputProps {
  onChange: InputChangeHandler;
}

const Input: React.FC<InputProps> = ({ onChange, value }) => {
  return <input type="text" onChange={onChange} value={value} />;
};

export default Input;

用到 Input 组件的父组件

js 复制代码
import React from 'react';

interface MyComponentProps {
  // ...
}

const MyComponent: React.FC<MyComponentProps> = () => {
  const handleInputChange: InputChangeHandler = (event) => {
    // 处理输入框变化事件...
  };

  return (
    <div>
      <h1>My Component</h1>
      <Input onChange={handleInputChange} />
    </div>
  );
};

InputChangeHandler 是一个类型别名,用于定义一个函数类型,该函数接受一个 React.ChangeEvent<HTMLInputElement> 参数,并且没有返回值 (void)
具体来说,React.ChangeEvent<HTMLInputElement> 是一个特定的类型,它表示一个事件对象,该事件对象是由 React 库定义的,并且专门用于表示输入元素的变化事件(比如 input、textarea 等), 其中的 <HTMLInputElement> 表示这个事件对象是针对 HTML 中的 input 元素的变化

另外事件

除了以上两个 React 的事件,还有

  • React.KeyboardEvent<HTMLInputElement>:处理 <input> 元素的键盘事件.
  • React.FormEvent<HTMLFormElement>:处理 <form> 元素的表单提交事件.
  • React.FocusEvent<HTMLInputElement>:处理 <input> 元素的获取焦点和失去焦点事件.
  • React.ChangeEvent<HTMLSelectElement>:处理 <select> 元素的改变事件.
  • React.MouseEvent<HTMLAnchorElement>:处理 <a> 元素的鼠标事件.
  • React.ClipboardEvent<HTMLInputElement>:处理 <input> 元素的剪贴板事件.
  • React.WheelEvent<HTMLDivElement>:处理 <div> 元素的滚动鼠标滚轮事件.
  • React.TouchEvent<HTMLDivElement>:处理触摸事件,适用于任何 HTML 元素.
  • React.DragEvent<HTMLElement>:处理拖拽事件,适用于任何 HTML 元素.

基本类型标注

可以使用 TypeScript 中的基本类型,比如 string、number、boolean 等来标注 JSX 元素或组件的属性

js 复制代码
interface Props {
  name: string;
  age: number;
  isStudent: boolean;
}

自定义类型标注

可以使用自定义的接口或类型来标注 JSX 元素或组件的属性

js 复制代码
interface User {
  name: string;
  age: number;
}

interface Props {
  user: User;
}

类型断言

可以使用类型断言来告诉 TypeScript 某个表达式的类型,这在处理特定类型的 JSX 元素时非常有用

js 复制代码
const element = <input value="hello" /> as HTMLInputElement;

泛型标注

可以使用泛型来标注组件的属性,以适应不同类型的数据
<T> 是一个泛型参数的占位符,可以用于表示任意类型

js 复制代码
interface Props<T> {
  data: T;
}

// 另一种函数写法
//function MyComponent<T>(props: Props<T>) {

//}

const MyComponent = <T extends {}>(props: Props<T>) => {

}

实现 interface

方法形参实现

js 复制代码
interface Person {
  name: string;
  age: number;
  sayHello: () => void;
}

function Greeting(props: Person) {
  return (
    <div>
      <h1>Hello, {props.name}!</h1>
      <p>You are {props.age} years old.</p>
    </div>
  );
}

传递属性给组件

js 复制代码
const person: Person = {
  name: "Alice",
  age: 26,
  sayHello: () => {
    console.log("Hello!");
  }
};

Greeting(person);

interface也可以用作泛型标注

js 复制代码
interface Container<T> {
  value: T;
}
// 组件
function MyComponent<T>(props: Container<T>) {
  return <div>{props.value}</div>;
}
// 将接口中的 T 转换为 string 类型
const container: Container<string> = {
  value: "Hello, World!"
};
// 使用组件
<MyComponent value={container.value} />;

定义CSS对象

js 复制代码
const Container: React.CSSProperties = {
  color: 'red',
  fontSize: '16px',
  fontWeight: 'bold'
};

<document className={Container}>11111111</document>
相关推荐
有味道的男人8 分钟前
搜好货平台关键词商品搜索接口:分页容错与商品数据轻量化提取方案
服务器·前端·javascript
lovingsoft1 小时前
Chrome Lighthouse 详解
前端·chrome
Qlly1 小时前
全栈工程师怎么接需求?从一句「加个功能」聊到能开发、能验收
前端·后端
马可家的菠萝1 小时前
你的微信“文件传输助手”,是不是已经成了第二个网盘?
前端·后端·架构
略略略啦1 小时前
Vibe Coding 基于Spec DD和TDD的实践指南
前端
shmily麻瓜小菜鸡1 小时前
前端实现图片与PDF文字识别敏感信息打码方案
前端·pdf·状态模式
打工仔折腾 AI1 小时前
LangChain 工具调用实战:从 Tool 定义到 Agent 执行链路拆解
java·前端·人工智能·后端·python·langchain·ai agent 实战
汉堡大王95272 小时前
单次输出拉到100万Token:拆完 Gemini 4 Argon 的续写协议,才看懂谷歌这7个月在憋什么
前端·人工智能·后端
看浪的路人2 小时前
第9讲:大模型应用监控与可观测性——OpenTelemetry + Prometheus + Grafana 全链路追踪
java·前端·spring
内存过载2 小时前
用表格模拟甘特图:项目排期的土办法
前端·低代码