记录Vue3+TS 定义接口interface、ref、reactive的使用场景以及使用泛型的原因

在Vue 3和TypeScript中,使用接口、ref 和 reactive 的情况可以根据你的需求和数据的复杂性来决定。这里是一个通俗易懂的解释:

1. 什么时候需要定义接口?

定义接口的情况:

  • 结构复杂:当你需要定义的数据结构较为复杂,有多个属性,并且这些属性有具体的类型时,使用接口可以帮助你更清晰地描述数据的形状,提供更好的类型检查。
  • 团队协作:在团队协作中,接口可以帮助团队成员更清楚地了解数据结构。
  • 代码可维护性:定义接口有助于代码的可维护性和可读性,特别是当你需要对数据结构进行修改时,可以更方便地管理。

不需要定义接口的情况:

  • 简单数据:如果你的数据结构非常简单,比如只有一个或两个属性,且类型明确,可能不需要定义接口。
  • 快速原型:在快速原型开发中,你可以暂时不定义接口,以便更快速地进行开发。

**

什么时候使用 ref?

**

使用 ref 的情况:

  • 基本类型:当你处理的是简单的基本数据类型(如字符串、数字、布尔值等),或者一个需要在模板中引用的单一对象或数组时,使用 ref是合适的。ref 会返回一个包含 value 属性的对象,你可以通过 value 属性来访问和修改数据。(使用这个变量的时候需要.value)
  • 单值引用:如果你只需要引用单个值或对象,并且不需要对其进行深层次的反应式处理,使用 ref 是较为简便的选择。
javascript 复制代码
const count = ref(0); // 简单的数字
const message = ref('Hello, world!'); // 简单的字符串
const items = ref<string[]>(['item1', 'item2', 'item3']); // 简单的数组

**

3. 什么时候使用 reactive?

**

使用 reactive 的情况:

  • 复杂对象:当你处理的是一个复杂的对象,包含多个属性和嵌套结构时,使用 reactive 是更好的选择。reactive会对整个对象进行深层次的反应式处理。
  • 多属性状态:如果你的状态包含多个属性,使用 reactive 可以使代码更加简洁和易读,因为你可以直接操作对象的属性,而不需要通过value。
javascript 复制代码
const state = reactive({
  count: 0,
  message: 'Hello, world!',
  items: ['item1', 'item2', 'item3']
});

**

总结

**

  • 定义接口:当数据结构复杂,或在团队协作和需要高可维护性时使用。
  • 使用 ref:处理简单类型或单一对象/数组时使用。
  • 使用 reactive:处理复杂对象或多属性状态时使用。

-----------------------------------------我是一条分割线-----------------------------------------

*为啥使用泛型?

使用泛型的好处是让TypeScript知道这个 ref 应该保存什么类型的数据,从而提供更好的类型检查和代码提示。如果我们不使用泛型,TypeScript可能会无法准确推断 ref的类型,导致类型检查不够严格。
在Vue 3中,除了字符串数组(string[]),你还可以使用其他类型和数据结构。以下是一些常用写法:

1. 基本类型

javascript 复制代码
const count = ref<number>(0); // 数字类型
const message = ref<string>('Hello, world!'); // 字符串类型
const isVisible = ref<boolean>(true); // 布尔类型

2. 对象类型

如果你想保存一个对象,可以使用接口或者直接定义对象类型:

javascript 复制代码
interface User {
  id: number;
  name: string;
}

const user = ref<User>({ id: 1, name: 'Alice' });

或者这么写:

javascript 复制代码
const user = ref<{ id: number; name: string }>({ id: 1, name: 'Alice' });

3. 数组类型

除了字符串数组,你还可以有其他类型的数组:

javascript 复制代码
const numbers = ref<number[]>([1, 2, 3]);
const users = ref<User[]>([{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]);

4. 联合类型

如果一个变量可能是多种类型中的一种,可以使用联合类型:

javascript 复制代码
const value = ref<string | number>('initial'); // 既可以是字符串,也可以是数字

5. 复杂对象或嵌套结构

对于更复杂的对象结构,使用 reactive 可能更合适:

javascript 复制代码
const state = reactive({
  count: 0,
  message: 'Hello, world!',
  items: ['item1', 'item2', 'item3']
});

6. Any类型

在某些情况下,你可能不确定具体类型,可以使用 any:

javascript 复制代码
const dynamicValue = ref<any>(null);

有这样一种场景:我定义了一个数据类型接口,是这个结构:

javascript 复制代码
interface NavigationMenu {
  text: string;
  to: string;
}

然后我想在这个类型接口内添加一个children属性,它的是一个数组,数组内是JSON对象,其内容与NavigationMenu的内容一样。

这种情况不需要再创建一个新的数据接口,children 属性可以直接使用接口 NavigationMenu 来声明类型,这样可以保持类型定义的一致性和简洁性。如下:

javascript 复制代码
interface NavigationMenu {
  text: string;
  to: string;
  children?: NavigationMenu[]; // children 属性的类型为 NavigationMenu 数组
}

总结

  • 泛型 :用于指定 ref 或 reactive 的类型,帮助TypeScript进行类型推断和检查。
  • 基本类型:ref, ref, ref 等。
  • 对象类型:ref 或 ref<{ id: number; name: string }>。
  • 数组类型:ref<string[]>, ref<number[]>, ref<User[]>。
  • 联合类型:ref<string | number>。
  • 复杂对象:使用 reactive 处理嵌套结构或复杂对象。
相关推荐
萌萌哒草头将军11 分钟前
🚀🚀🚀Prisma ORM 6.10.0 重大更新,VSCode 集成,远程 MCP ,更加智能了!
javascript·vue.js·react.js
遗憾随她而去.11 分钟前
Node.js 在前端开发中的作用与 npm 的核心理解
前端·npm·node.js
Hello.Reader3 小时前
RediSearch 查询语法速览
前端·算法
小阳拱白菜3 小时前
Vue学习笔记
vue.js·笔记·学习
睡觉z7 小时前
Haproxy搭建web群集
前端
codingandsleeping8 小时前
重读《你不知道的JavaScript》(上)- this
前端·javascript
孩子 你要相信光9 小时前
前端如何通过 Blob 下载 Excel 文件
前端·javascript
IT猫咪酱9 小时前
【前端】yarn install error
前端
喜欢打篮球的普通人9 小时前
Flang:LLVM Fortran 前端简介
前端
喵喵侠w9 小时前
腾讯地图Web版解决热力图被轮廓覆盖的问题
前端·javascript