记录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 处理嵌套结构或复杂对象。
相关推荐
喵叔哟15 分钟前
重构代码之取消临时字段
java·前端·重构
还是大剑师兰特1 小时前
D3的竞品有哪些,D3的优势,D3和echarts的对比
前端·javascript·echarts
王解1 小时前
【深度解析】CSS工程化全攻略(1)
前端·css
一只小白菜~1 小时前
web浏览器环境下使用window.open()打开PDF文件不是预览,而是下载文件?
前端·javascript·pdf·windowopen预览pdf
方才coding1 小时前
1小时构建Vue3知识体系之vue的生命周期函数
前端·javascript·vue.js
man20171 小时前
【2024最新】基于springboot+vue的闲一品交易平台lw+ppt
vue.js·spring boot·后端
阿征学IT1 小时前
vue过滤器初步使用
前端·javascript·vue.js
王哲晓1 小时前
第四十五章 Vue之Vuex模块化创建(module)
前端·javascript·vue.js
丶21361 小时前
【WEB】深入理解 CORS(跨域资源共享):原理、配置与常见问题
前端·架构·web
发现你走远了1 小时前
『VUE』25. 组件事件与v-model(详细图文注释)
前端·javascript·vue.js