【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>
相关推荐
天天进步20155 分钟前
Vue项目重构实践:如何构建可维护的企业级应用
前端·vue.js·重构
小华同学ai8 分钟前
vue-office:Star 4.2k,款支持多种Office文件预览的Vue组件库,一站式Office文件预览方案,真心不错
前端·javascript·vue.js·开源·github·office
APP 肖提莫9 分钟前
MyBatis-Plus分页拦截器,源码的重构(重构total总数的计算逻辑)
java·前端·算法
问道飞鱼20 分钟前
【前端知识】强大的js动画组件anime.js
开发语言·前端·javascript·anime.js
k093322 分钟前
vue中proxy代理配置(测试一)
前端·javascript·vue.js
傻小胖23 分钟前
React 脚手架使用指南
前端·react.js·前端框架
程序员海军36 分钟前
2024 Nuxt3 年度生态总结
前端·nuxt.js
m0_748256781 小时前
SpringBoot 依赖之Spring Web
前端·spring boot·spring
web135085886351 小时前
前端node.js
前端·node.js·vim
m0_512744641 小时前
极客大挑战2024-web-wp(详细)
android·前端