1 Vue3 组合式 API 的基本原理和理念

1.1 Vue3 中的 Composition API

Vue3 中的 Composition API 是一种新的编写组件逻辑的方式,它提供了更好的代码组织、类型推导、测试支持和复用性。相比于 Vue2 的 Options API,Composition API 更加灵活和可扩展。

在 Composition API 中,我们使用 setup 函数来定义组件的逻辑部分。setup 函数是一个特殊的函数,在创建组件实例之前被调用,并且接收两个参数:props 和 context。props 是传入组件的属性集合,而 context 包含了一些与组件关联的方法和数据。

1.2 与 Vue2 Options API 的对比

与 Vue2 的 Options API 相比,Composition API 具有以下优势:

  • 更好的代码组织:通过将相关逻辑放在同一个函数内部,可以更清晰地组织代码。
  • 类型推导:由于 setup 函数是一个普通的 JavaScript 函数,因此可以更容易地获得类型推导的支持。
  • 测试支持:由于逻辑被封装在独立的函数中,可以更方便地进行单元测试。
  • 复用性:可以将逻辑抽象为自定义 Hook,并在多个组件中重用。

1.3 为什么选择使用组合式 API

使用组合式 API 可以带来以下好处:

  • 更好的代码组织:将相关逻辑放在同一个函数内部,使代码更易于理解和维护。
  • 更好的类型推导:由于 setup 函数是一个普通的 JavaScript 函数,可以获得更好的类型推导支持,减少错误。
  • 更好的测试支持:逻辑被封装在独立的函数中,可以更方便地进行单元测试。
  • 更高的复用性:可以将逻辑抽象为自定义 Hook,并在多个组件中重用。

使用组合式 API 可以提供更好的开发体验和代码质量,使得 Vue3 的开发更加灵活和可扩展。

2 安装和配置 Vue3

为了安装和配置 Vue3,您需要按照以下步骤进行操作:

2.1 引入 Vue3 的最新版本

首先,您需要在项目中引入 Vue3 的最新版本。可以通过使用 npm 或 yarn 来安装 Vue3。

如果使用 npm,请运行以下命令:

npm install vue@next

如果使用 yarn,请运行以下命令:

yarn add vue@next

这将会安装 Vue3 及其相关依赖项。

2.2 创建 Vue 应用程序的基本配置

一旦您安装了 Vue3,您可以开始创建 Vue 应用程序的基本配置。

在你的项目中创建一个新文件,例如main.js,并添加以下代码:

import { createApp } from 'vue';
import App from './App.vue'; createApp(App).mount('#app');

上述代码导入了createApp函数和根组件App,然后调用createApp函数创建一个 Vue 应用程序实例,并将根组件传递给它。最后,使用mount方法将 Vue 应用程序挂载到 HTML 页面上的元素上(此处假设有一个 id 为app的元素)。

接下来,在您的项目中创建一个名为App.vue的文件,并添加以下代码作为根组件的模板:

<template>
<div id="app">
<!-- Your application content here -->
</div>
</template> <script>
export default {
// Your component options here
}
</script> <style>
/* Your component styles here */
</style>

在上述代码中,您可以将应用程序的内容放置在<div id="app">元素内部。

3 创建一个简单的单文件组件

3.1 创建一个.vue 文件

首先,在您的项目中创建一个新的.vue文件,例如MyComponent.vue。

3.2 编写组件模板

在MyComponent.vue文件中,编写组件的模板。模板部分定义了组件的结构和布局。以下是一个示例:

<template>
<div>
<h1>{{ message }}</h1>
<button @click="increment">Increment</button>
</div>
</template>

上述代码展示了一个包含标题和按钮的简单组件。标题使用双花括号插值绑定到message变量,按钮使用@click指令绑定到increment方法。

3.3 实现组件的组合式 API 逻辑

3.3.1 重构原有代码

接下来,您需要将原有的逻辑重构为组合式 API 形式。在MyComponent.vue文件中,添加如下代码:

<script>
import { ref } from 'vue'; export default {
setup() {
const message = ref('Hello, Vue!'); function increment() {
message.value += '!';
} return {
message,
increment
};
}
}
</script>

上述代码使用setup函数来实现组合式 API 的逻辑。在setup函数内部,我们使用ref函数创建了一个响应式数据message,并定义了一个名为increment的方法。

最后,通过return语句将需要在模板中使用的数据和方法导出。

3.3.2 创建和导出可复用的逻辑函数

如果您希望将某些逻辑代码抽离成可复用的函数,可以创建并导出它们。例如,在同一个文件中添加以下代码:

<script>
import { ref } from 'vue'; function useCounter() {
const count = ref(0); function increment() {
count.value++;
} return {
count,
increment
};
} export default {
setup() {
const { count, increment } = useCounter(); return {
count,
increment
};
}
}
</script>

上述代码创建了一个名为useCounter的可复用逻辑函数,该函数返回一个包含计数器值和增加计数器的方法的对象。

然后,在setup函数内部,我们调用useCounter函数,并将其返回值解构为count和increment变量。

最后,通过return语句将这些变量导出供模板使用。

3.4 在应用程序中使用组件

要在 Vue3 应用程序中使用组件,您需要按照以下步骤进行操作:

  1. 创建一个组件:首先,创建一个.vue 文件来定义您的组件。该文件包含模板、样式和逻辑代码。例如,创建一个名为"HelloWorld.vue"的文件。
<template>
<div>
<h1>{{ greeting }}</h1>
</div>
</template> <script>
export default {
data() {
return {
greeting: 'Hello, World!'
}
}
}
</script> <style scoped>
h1 {
color: blue;
}
</style>
  1. 导入并注册组件:在您的主应用程序文件(通常是 main.js)中,导入并全局注册您的组件。
import { createApp } from 'vue'
import HelloWorld from './components/HelloWorld.vue' const app = createApp()
app.component('hello-world', HelloWorld)
app.mount('#app')
  1. 在应用程序中使用组件:现在,您可以在应用程序的模板中使用您的组件了。只需将组件名称作为自定义元素添加到模板中即可。
<div id="app">
<hello-world></hello-world>
</div>

这样,您的组件就会在应用程序中显示出来,并且它的数据和逻辑也会生效。

请注意,在上述示例中,我们使用了单文件组件的形式编写组件。这是 Vue 推荐的方式,它将组件的模板、样式和逻辑封装在一个文件中,使代码更加模块化和可维护。

4 使用 Vue3 组合式 API 的常见模式和技巧

当使用 Vue3 的组合式 API 时,有一些常见的模式和技巧可以帮助您更好地组织和管理代码。

4.1 响应式状态管理

在 Vue3 中,可以使用ref和reactive函数来创建响应式状态。ref用于创建单个值的响应式引用,而reactive用于创建包含多个属性的响应式对象。

import { ref, reactive } from 'vue'

// 创建一个响应式引用
const count = ref(0) // 创建一个响应式对象
const state = reactive({
message: 'Hello',
name: 'World'
})

然后,你可以在组件中使用这些响应式状态:

export default {
setup() {
// 使用响应式引用
const counter = ref(0) // 使用响应式对象
const data = reactive({
message: 'Hello',
name: 'World'
}) return {
counter,
data
}
}
}

注意,在使用响应式状态时,需要使用.value来访问ref类型的数据:

<template>
<div>
<p>Counter: {{ counter }}</p>
<p>Message: {{ data.message }}</p>
<p>Name: {{ data.name }}</p>
</div>
</template> <script>
export default {
setup() {
const counter = ref(0)
const data = reactive({
message: 'Hello',
name: 'World'
}) return {
counter,
data
}
}
}
</script>

4.2 生命周期钩子函数的替代方法

在 Vue3 中,生命周期钩子函数被替换为了setup函数。你可以在setup函数中执行组件初始化的逻辑,并返回要暴露给模板的数据和方法。

export default {
setup() {
// 组件初始化逻辑 return {
// 要暴露给模板的数据和方法
}
}
}

如果需要在组件挂载后或卸载前执行一些操作,可以使用onMounted和onUnmounted钩子函数:

import { onMounted, onUnmounted } from 'vue'

export default {
setup() {
onMounted(() => {
// 组件挂载后执行的操作
}) onUnmounted(() => {
// 组件卸载前执行的操作
}) return {}
}
}

4.3 针对特定功能的自定义组合式 API

除了使用 Vue 提供的内置组合式 API 之外,你还可以创建自己的自定义组合式 API 来封装特定功能的逻辑。

例如,假设你想要创建一个可复用的计时器逻辑,你可以编写一个名为"useTimer"的自定义组合式 API:

import { ref, watch, onUnmounted } from 'vue'

export function useTimer(initialValue = 0) {
const timer = ref(initialValue) const startTimer = () => {
timer.value = 0
const interval = setInterval(() => {
timer.value++
}, 1000)
onUnmounted(() => {
clearInterval(interval)
})
} watch(timer, (newValue) => {
console.log('Timer:', newValue)
}) return {
timer,
startTimer
}
}

然后,在你的组件中使用自定义组合式 API:

import { useTimer } from './useTimer'

export default {
setup() {
const { timer, startTimer } = useTimer() return {
timer,
startTimer
}
}
}

这样,你就可以在多个组件中重复使用计时器逻辑。

4.4 使用 ref 和 reactive 进行数据响应式处理

在 Vue3 中,我们可以使用ref和reactive函数来创建响应式的引用和对象。

  • 使用ref函数创建响应式引用:
import { ref } from 'vue'

const count = ref(0)
console.log(count.value) // 输出:0 count.value++ // 修改值
console.log(count.value) // 输出:1
  • 使用reactive函数创建响应式对象:
import { reactive } from 'vue'

const state = reactive({
count: 0,
name: 'John'
}) console.log(state.count) // 输出:0
console.log(state.name) // 输出:'John' state.count++ // 修改值
console.log(state.count) // 输出:1

4.5 使用 watchEffect 和 watch 进行数据侦听

Vue3 提供了watchEffect和watch函数来进行数据侦听。

  • 使用watchEffect监听响应式状态的变化,并执行回调函数:
import { watchEffect, reactive } from 'vue'

const state = reactive({
count: 0
}) watchEffect(() => {
console.log('Count changed:', state.count)
})
  • 使用watch函数监听特定的响应式状态,并执行回调函数:
import { watch, reactive } from 'vue'

const state = reactive({
count: 0
}) watch(
() => state.count,
(newVal, oldVal) => {
console.log('Count changed:', newVal, oldVal)
}
)

4.6 使用 offer 和 inject 实现组件之间的通信

Vue3 中,我们可以使用provide和inject来实现组件之间的通信。

  • 在父组件中使用provide提供数据:
import { provide, reactive } from 'vue'

const state = reactive({
count: 0
}) provide('state', state)
  • 在子组件中使用inject获取提供的数据:
import { inject } from 'vue'

export default {
setup() {
const state = inject('state')
console.log(state.count) // 输出:0 return {}
}
}

通过这些技巧,你可以更好地利用 Vue3 的组合式 API 来处理数据响应性、数据侦听以及组件之间的通信。

5 总结

Vue3 的组合式 API 和单文件组件为我们带来了更加灵活、可维护的开发方式。通过组合式 API,我们能够更好地组织组件的逻辑,并且可以轻松地复用和共享代码逻辑。而单文件组件则将模板、样式和逻辑集成在一个文件中,简化了开发流程,提高了代码的可读性和可维护性。

在本文中,我们从头到尾介绍了如何使用 Vue3 的组合式 API 和单文件组件来构建应用程序。我们学习了如何安装和配置 Vue3,并且详细讲解了创建单文件组件的步骤。此外,我们还探讨了一些常见的组合式 API 模式和技巧,如响应式状态管理、替代生命周期钩子函数的方法以及组件之间的通信。

通过深入学习和实践这些概念和技术,你可以提升自己在 Vue 开发中的技能水平。无论你是新手还是有经验的开发者,Vue3 的组合式 API 和单文件组件都将为你带来更好的开发体验和更高的效率。

在未来,Vue3 的发展还将带来更多新的特性和功能。我们鼓励你保持对 Vue 生态系统的关注,并继续深入学习和探索。谢谢你阅读本文,希望本文对你学习和实践 Vue3 组合式 API 和单文件组件有所帮助。祝你在 Vue 开发中取得更大的成功!

vue3 组合式 api 单文件组件写法的更多相关文章

  1. webpack入坑之旅(五)加载vue单文件组件

    这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...

  2. 一丢丢学习之webpack4 + Vue单文件组件的应用

    之前刚学了一些Vue的皮毛于是写了一个本地播放器https://github.com/liwenchi123000/Local-Music-Player,如果觉得ok的朋友可以给个star. 就是很简 ...

  3. 10: vue-router和单文件组件

    1.1 vue-router路由基本使用 官网: https://router.vuejs.org/zh/api/#router-link 1.安装vue-router bower info vue- ...

  4. Vue 定义组件模板的七种方式(一般用单文件组件更好)

    在 Vue 中定义一个组件模板,至少有七种不同的方式(或许还有其它我不知道的方式): 字符串 模板字面量 x-template 内联模板 render 函数 JSF 单文件组件 在这篇文章中,我将通过 ...

  5. vue.js单文件组件中非父子组件的传值

    最近在研究vue.js,总体来说还算可以,但是在web开发群里有一些人问在单文件组件开发模式中非父子组件如何传值的问题,今天在这里讲讲,希望对大家有所帮助! 在官网api中的这段讲解很少,也很模糊:官 ...

  6. Vue -3:单文件组件

    在很多 Vue 项目中,我们使用 Vue.component 来定义全局组件,紧接着用 new Vue({ el: '#container '}) 在每个页面内指定一个容器元素. 这种方式在很多中小规 ...

  7. ts-loader如何与vue单文件组件衔接

    .ts-loader是如何与vue单文件组件衔接作用的 https://github.com/microsoft/TypeScript-Vue-Starter https://www.npmjs.co ...

  8. vue 单文件组件最佳实践

    vue 单文件组件最佳实践 生命周期 template <template> <section> <h1>vue single file components te ...

  9. Vue.js的组件(slot/动态组件等)、单文件组件、递归组件使用

    一.组件 1> 组件命名方式有两种(注意:在DOM模板中只有kebab-case命名方法才生效): html中引用组件: <!-- 在DOM模板中,只有 kebab-case命名才生效 - ...

  10. vue3组合式API

    vue3组合式API 为什么要用组合式API,我们来看看它是如何解决vue2的局限性的 1.vue2的局限性 当组件内容越来越多,逻辑越来越复杂,可读性就会降低,并且难以维护. vue2组件采用配置式 ...

随机推荐

  1. 2021-04-20:手写代码:最小生成树算法之Prim。

    2021-04-20:手写代码:最小生成树算法之Prim. 福大大 答案2021-04-20: 解锁点,解锁边,解锁点,解锁边,一直解锁下去. 代码用golang编写.代码如下: package ma ...

  2. golang基础面试题,不完整

    启动流程 Q.go的init函数是什么时候执行的? Q.多个init函数执行顺序能保证吗? Q.go init 的执行顺序,注意是不按导入规则的(这里是编译时按文件名的顺序执行的) Q.init函数能 ...

  3. 2022-01-17:单词规律 II。 给你一种规律 pattern 和一个字符串 str,请你判断 str 是否遵循其相同的规律。 这里我们指的是 完全遵循,例如 pattern 里的每个字母和字符

    2022-01-17:单词规律 II. 给你一种规律 pattern 和一个字符串 str,请你判断 str 是否遵循其相同的规律. 这里我们指的是 完全遵循,例如 pattern 里的每个字母和字符 ...

  4. SQL Server修改列的数据类型

    ALTER TABLE LJPA001H DROP CONSTRAINT DF_LJPA001H_pa_sex_1 ALTER TABLE LJPA001H ALTER COLUMN pa_sex V ...

  5. C++面试八股文:struct、class和union有哪些区别?

    某日小二参加XXX科技公司的C++工程师开发岗位5面: 面试官:struct和class有什么区别? 小二:在C++中,struct和class的唯一区别是默认的访问控制.struct默认的成员是pu ...

  6. 《数据结构》之栈和堆结构及JVM简析

    导言: 在数据结构中,我们第一了解到了栈或堆栈,它的结构特点是什么呢?先进后出,它的特点有什么用呢?我们在哪里可以使用到栈结构,栈结构那么简单,使用这么久了为什么不用其它结构替代? 一.程序在内存中的 ...

  7. C++面试八股文:了解sizeof操作符吗?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第10面: 面试官:了解sizeof操作符吗? 二师兄:略微了解(不就是求大小的嘛..) 面试官:请讲以下如何使用sizeof? 二师兄:sizeof ...

  8. 20230611 再次升级SSD

    家里常用电脑的硬盘又显得捉襟见肘,老规矩,升级SSD.幸亏几年前摸索的方法记录下来了,翻出以前的博客复习一下.为了保险起见,也重新在网上搜了一下,看是不是有新的更方便的方法,答案是没有,只是搜出很多推 ...

  9. 重新温习git

    在本地文件夹创建项目,使用git bash here,然后使用git clone[url]命令克隆,提示权限不足, 这是需要ssh重置了 1.删除原有.ssh文件下的known_hosts 2.设置用 ...

  10. 前端Vue自定义导航栏菜单 定制左侧导航菜单按钮 中部logo图标 右侧导航菜单按钮

    前端Vue自定义导航栏菜单 定制左侧导航菜单按钮 中部logo图标 右侧导航菜单按钮, 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin? ...