记录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 处理嵌套结构或复杂对象。
相关推荐
Cshaosun2 分钟前
js版本之ES5特性简述【String、Function、JSON、其他】(二)
前端·javascript·es
__WanG6 分钟前
Flutter将应用打包发布到App Store
前端·flutter·ios
leluckys9 分钟前
flutter 专题十七 Flutter Flar动画实战
前端·flutter
豆包MarsCode24 分钟前
我用豆包MarsCode IDE 做了一个 CSS 权重小组件
开发语言·前端·javascript·css·ide·html
22x艾克斯34 分钟前
Web Notifications API-让网页也能像QQ一样实现消息通知
前端
X 西安36 分钟前
第十章JavaScript的应用
开发语言·javascript·ecmascript
想你的风吹到了瑞士42 分钟前
变量提升&函数提升
前端·javascript·vue.js
生椰拿铁You1 小时前
12 —— Webpack中向前端注入环境变量
前端
Huazzi.1 小时前
免费好用的静态网页托管平台全面对比介绍
前端·网络·github·web
吃土少女古拉拉1 小时前
前端和后端
前端·学习笔记