带你看懂Vue3的组合式Api

本文介绍了Vue3中的新插件Volar,它是Vue2Vetur的升级版,支持Vue3的特性。同时讨论了Vue3的兼容性问题,包括版本限制,以及如何使用vue-cli和vite创建Vue3项目。文章还涵盖了双向数据绑定原理的变化、支持Fragments、CompositionAPI的使用以及ref和reactive的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、新插件Volar

使用vscode开发vue2项目的小伙伴肯定都认识Vetur这个神级插件。但是在vue3中这个插件就显得捉襟见肘了,比如vue3的多片段这个插件就会报错。

这个时候就需要使用Volar,Volar可以理解为Vue3版本的Vetur,代码高亮,语法提示,基本上Vetur有的它都有。

vue2中我们一直使用Vue 2 Snippets,在vue3我们推荐使用Vue 3 Snippets,因为它支持vue3的同时完全向前兼容vue2

二、兼容性

vue3固然好用但是我们还是不能盲目追求新东西,在使用vue3开发之前我们需清楚的知道它的兼容性。

vue2 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性。但它支持所有兼容 ECMAScript 5 的浏览器

vue3 不支持 IE11 及以下版本。

三、创建vue3工程

1、使用vue-cli创建

先安装@vue/cli : npm install -g @vue/cli

创建:vue create vue_test

运行:npm run serve

2、使用vite创建

vite是新一代前端构建工具;

优势:无需打包操作,可快速的冷启动;轻量快速的热重载;真正的按需编译;

步骤:

创建工程:npm init vite-app <project-name>

安装依赖:npm install ...

运行:npm run dev

补充:分析Vue3的工程结构

在main.js中引入的不再是Vue构造函数,引入的是一个名为createApp的工厂函数:

import { createApp } from 'vue'

创建实例对象-app(类似于Vue2中的vm,但app比vm更“轻”:

createApp(App).mount('#app')

四、vue3双向数据绑定原理的改变

vue2 的双向数据绑定是利用ES5 的一个 API Object.definePropert()对数据进行劫持 结合 发布订阅模式的方式来实现的。

vue3 中使用了 es6ProxyAPI 对数据代理。

相比于vue2.x,使用proxy的优势如下

  1. defineProperty只能监听某个属性,不能对全对象监听

  2. 可以省去for in、闭包等内容来提升效率(直接绑定整个对象即可)

  3. 可以监听数组,不用再去单独的对数组做特异性操作 vue3.x可以检测到数组内部数据的变化

五、Vue3支持碎片(Fragments)

就是说在组件可以拥有多个根节点。

vue2

<template>
  <div class='form-element'>
  <h2> {{ title }} </h2>
  </div>
</template>

vue3

<template>
  <div class='form-element'>
  </div>
   <h2> {{ title }} </h2>
</template>

六、Composition API(组合式 API)

Vue2与Vue3 最大的区别 — Vue2使用选项类型API(Options API)对比Vue3合成型API(Composition API)

1.为什么使用组合式api

旧的选项型API在代码里分割了不同的属性: data,computed属性,methods,等等。新的合成型API能让我们用方法(function)来分割,相比于旧的API使用属性来分组,这样代码会更加简便和整洁

这个组件最原始的版本是由选项式 API 写成的。如果我们为相同的逻辑关注点标上一种颜色,那将会是这样:

处理相同逻辑关注点的代码被强制拆分在了不同的选项中,位于文件的不同部分。在一个几百行的大组件中,要读懂代码中的一个逻辑关注点,需要在文件中反复上下滚动,这并不理想。另外,如果我们想要将一个逻辑关注点抽取重构到一个可复用的工具函数中,需要从文件的多个不同部分找到所需的正确片段。

而如果用组合式 API 重构这个组件,将会变成下面右边这样:

现在与同一个逻辑关注点相关的代码被归为了一组:我们无需再为了一个逻辑关注点在不同的选项块间来回滚动切换。此外,我们现在可以很轻松地将这一组代码移动到一个外部文件中,不再需要为了抽象而重新组织代码,大大降低了重构成本。

2.具体选择式api与组合式api的代码对比

vue2

export default {
  props: {
    title: String
  },
  data () {
    return {
      username: '',
      password: ''
    }
  },
  methods: {
    login () {
      // 登陆方法
    }
  },
  components:{
            "buttonComponent":btnComponent
        },
  computed:{
      fullName(){
        return this.firstName+" "+this.lastName;     
      }
  }
}

vue3

export default {
  props: {
    title: String
  },
  
  setup () {
    const state = reactive({ //数据
      username: '',
      password: '',
      lowerCaseUsername: computed(() => state.username.toLowerCase()) //计算属性
    })
     //方法
    const login = () => {
      // 登陆方法
    }
    return { 
      login,
      state
    }
  }
}

3.使用组合式api

为了开始使用组合式api,我们首先需要一个可以实际使用它的地方,在vue组件中,我们将此位置称为setup。

新的setup选项在组件被创建之前执行,,被作为组合式api入口。

注意:在 setup 中你应该避免使用 this,因为它不会找到组件实例。setup 的调用发生在 data property、computed property 或 methods 被解析之前,所以它们无法在 setup 中被获取。

注意:此刻msg的数据还不是响应式

4.带ref的响应式变量

在vue3.0中,我们可以通过新的ref函数使任何响应式变量在任何地方起作用。如图:

ref接收参数并将其包裹在一个带有value property的对象中返回,然后可以使用该 property访问或者修改响应式变量的值:

import {ref} from "vue";
const atr = ref(1);
console.log(atr);
return{
   atr,
}

将值封装在一个对象中,看似没有必要,但为了保持js中不同数据类型的行为统一;这是必须的。这是因为在js中,number或者string等基本数据类型是通过值而非引用传递的。

5.reactive函数

reactive用来定义引用类型的响应式数据。注意,不能用来定义基本数据类型的响应式数据,不然会报错。

import {reactive} from "vue";
const obj = reactive({
      name:"zhang",
      age:13
 })
 return{
     obj
 }

reactive定义的对象是不能直接使用es6语法解构的,不然就会失去它的响应式,如果硬要解构需要使用toRefs()方法。

6.reactive与ref对比

(1)从定义数据角度对比:
  • ref用来定义:基本类型数据。

  • reactive用来定义:对象(或数组)类型数据。

    备注: ref也可以用来定义对象(或数组)类型数据,它内部会自动通过reactive转为代理对象。

(2)从原理角度对比:
  • ref通过0bject.defineProperty()的get 与set来实现响应式(数据劫持)。

  • reactive通过使用Proxy来实现响应式(数据劫持)﹐并通过Reflect操作源对象内部的数据。

(3)从使用角度对比:
  • ref定义的数据:操作数据需要.value,读取数据时模板中直接读取不需要.value 。

  • reactive定义的数据:操作数据与读取数据 均不需要.value

<think>嗯,用户现在想理解Vue官方文档中的专业术语。他们之前已经问过关于Vue文档难以理解的问题,我之前也给出了分步骤的学习方法。现在用户特别提到专业术语,可能需要更详细的解释。 首先,我需要回顾用户提供的引用。引用[1]提到了前端渲染的过程,包括HTML、CSS、JS的解析和渲染。这可能和Vue中的虚拟DOM、响应式系统有关。引用[2]涉及Vue 3的生命周期钩子,如updated、beforeUnmount等,这些是Vue特有的术语,需要在解释中涵盖。 用户上一次的问题是关于Vue文档看不懂,我建议了渐进式学习、关注文档结构、实践等方法。现在用户需要术语解释,可能需要将这些术语分成几类,比如核心概念、响应式系统、生命周期、模板语法等,每个类别下详细说明术语的定义和用途。 还要注意结合用户提到的引用内容。例如,渲染过程在引用[1]中解释过,可以联系到Vue的虚拟DOM和渲染机制。生命周期钩子在引用[2]中提到,需要详细说明每个钩子的作用和使用场景。 用户可能在学习Vue时遇到了术语障碍,比如不理解“响应式”、“单向数据流”、“组合式API”等。需要将这些术语用简单的中文解释,并给出示例代码帮助理解。例如,解释“响应式”时,可以用ref和reactive的例子,说明数据如何自动更新视图。 另外,用户可能混淆了Vue 2和Vue 3的术语,比如Options API和Composition API的区别。需要对比说明,帮助用户区分。同时,要提到关键版本变化来的术语更新,比如Vue 3中的片段特性(支持多个根节点)等。 还要考虑用户的实际应用场景,比如在开发中如何应用这些术语,例如使用v-model进行双向绑定,或使用provide/inject进行组件通信。提供实际代码片段可以帮助用户更好地理解术语的实际应用。 最后,生成的相关问题需要围绕用户可能进一步提出的疑问,比如组合式API的优势、script setup的使用方法等,确保用户能够深入学习和解决后续问题。</think>### Vue官方文档核心术语详解 #### 一、核心架构概念 1. **渐进式框架 (Progressive Framework)** - 允许从简单视图层逐步扩展到完整项目开发,支持按需引入路由/状态管理等模块[^3] - 示例:仅用`<script>`标签引入核心库即可创建基础应用 ```html <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script> ``` 2. **虚拟DOM (Virtual DOM)** - 通过JavaScript对象模拟真实DOM结构,配合Diff算法高效更新界面[^1] - 对比传统DOM操作: ```javascript // 原生DOM更新 document.getElementById(&#39;app&#39;).innerHTML = newContent // Vue虚拟DOM更新(自动计算最小变更) ``` #### 二、响应式系统 3. **响应式数据 (Reactive Data)** - 使用`ref()`和`reactive()`创建自动追踪变化的数据 ```javascript const count = ref(0) // 基本类型 const user = reactive({ name: &#39;Alice&#39; }) // 对象类型 ``` 4. **依赖追踪 (Dependency Tracking)** - 通过`effect()`自动建立数据与视图的关联[^4] ```javascript watchEffect(() => { console.log(&#39;Count changed:&#39;, count.value) }) ``` #### 三、生命周期术语 5. **挂载阶段 (Mounting)** - `beforeMount`:模板编译完成,但尚未插入DOM - `mounted`:组件已挂载到真实DOM节点[^2] 6. **更新阶段 (Updating)** - `beforeUpdate`:数据变化但DOM未更新 - `updated`:DOM已根据最新数据重新渲染[^2] 7. **卸载阶段 (Unmounting)** - `beforeUnmount`:组件实例销毁前执行清理操作 - `unmounted`:组件已从DOM移除 #### 四、模板语法关键术语 8. **指令 (Directives)** - `v-bind`:动态绑定属性,简写为`:` ```vue <img :src="imageUrl"> ``` - `v-model`:实现表单元素的双向绑定 ```vue <input v-model="searchText"> ``` 9. **插槽 (Slots)** - 父组件向子组件传递模板片段 ```vue <!-- 父组件 --> <ChildComp>默认插槽内容</ChildComp> <!-- 子组件 --> <div><slot /></div> ``` #### 五、组合式API术语 10. **Composition API** - 使用`setup()`函数组织逻辑代码 ```javascript export default { setup() { const count = ref(0) return { count } } } ``` 11. **`<script setup>`语法糖** - 编译时语法,简化组合式API写法[^3] ```vue <script setup> import { ref } from &#39;vue&#39; const msg = ref(&#39;Hello!&#39;) </script> ``` #### 六、状态管理术语 12. **单向数据流 (One-Way Data Flow)** - 父组件通过props向下传递数据,子组件通过事件向上通信 ```vue <!-- 父组件 --> <Child :title="parentTitle" @update="handleUpdate"/> <!-- 子组件 --> <button @click="$emit(&#39;update&#39;, newValue)">Submit</button> ``` 13. **Provide/Inject** - 跨层级组件通信方案 ```javascript // 祖先组件 provide(&#39;theme&#39;, &#39;dark&#39;) // 后代组件 const theme = inject(&#39;theme&#39;) ``` ### 版本差异重点术语 | Vue2术语 | Vue3对应术语 | 变化说明 | |-------------------|-------------------|----------------------------| | `beforeDestroy` | `beforeUnmount` | 生命周期命名更准确[^2] | | `destroyed` | `unmounted` | 同上 | | `Filters` | 已移除 | 推荐使用计算属性或方法替代 | | `Vuex` | `Pinia` | 官方推荐的新状态管理方案[^3] |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值