【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 库定义的,并且专门用于表示输入元素的变化事件(比如 inputtextarea 等), 其中的 <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>
相关推荐
LYFlied6 分钟前
【算法解题模板】-【回溯】----“试错式”问题解决利器
前端·数据结构·算法·leetcode·面试·职场和发展
composurext7 分钟前
录音切片上传
前端·javascript·css
程序员小寒7 分钟前
前端高频面试题:深拷贝和浅拷贝的区别?
前端·javascript·面试
狮子座的男孩12 分钟前
html+css基础:07、css2的复合选择器_伪类选择器(概念、动态伪类、结构伪类(核心)、否定伪类、UI伪类、目标伪类、语言伪类)及伪元素选择器
前端·css·经验分享·html·伪类选择器·伪元素选择器·结构伪类
zhougl99613 分钟前
Vue 中的 `render` 函数
前端·javascript·vue.js
听风吟丶14 分钟前
Spring Boot 自动配置深度解析:原理、实战与源码追踪
前端·bootstrap·html
跟着珅聪学java15 分钟前
HTML中设置<select>下拉框默认值的详细教程
开发语言·前端·javascript
IT_陈寒15 分钟前
JavaScript 性能优化:5个被低估的V8引擎技巧让你的代码提速50%
前端·人工智能·后端
想睡好22 分钟前
setup
前端·javascript·html
桜吹雪28 分钟前
DeepSeekV3.2模型内置Agent体验
javascript·人工智能