一、简介
1. Vue 核心
Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。
Vue 的两个核心功能:
- 声明式渲染:Vue 基于标准 HTML 拓展了一套模板语法,使得我们可以声明式地描述最终输出的 HTML 和 JavaScript 状态之间的关系。
- 响应性:Vue 会自动跟踪 JavaScript 状态并在其发生变化时响应式地更新 DOM。
2. 渐进式框架
Vue 是一个渐进式框架(一个可以与你共同成长、适应你不同需求的框架),也是一个生态。
Vue 的设计非常注重灵活性和“可以被逐步集成”这个特点。根据你的需求场景,你可以用不同的方式使用 :
- 无需构建步骤,渐进式增强静态的 HTML
- 在任何页面中作为 Web Components 嵌入
- 单页应用 (SPA)
- 全栈 / 服务端渲染 (SSR)
- Jamstack / 静态站点生成 (SSG)
- 开发桌面端、移动端、WebGL,甚至是命令行终端中的界面
3. 单文件组件
单文件组件是 Vue 的标志性功能。
4. API 风格
Vue 的组件可以按两种不同的风格书写:选项式 API 和组合式 API。
选项式 API (Options API) (Vue2 的设计)
包含多个选项的对象来描述组件的逻辑,例如 data、methods 和 mounted。选项所定义的属性都会暴露在函数内部的 this 上,它会指向当前的组件实例。
组合式 API (Composition API)(Vue3 的设计)
通过组合式 API,我们可以使用导入的 API 函数来描述组件逻辑。在单文件组件中,组合式 API 通常会与 < script setup> 搭配使用。
<script setup>
import { ref, onMounted } from 'vue'
// 响应式状态(使用 ref 绑定到Dom上)
const count = ref(0)
// 用来修改状态、触发更新的函数
function increment() {
count.value++ // (使用 .value 来改变绑定属性的值)
}
// 生命周期钩子
onMounted(() => {
console.log(`The initial count is ${count.value}.`)
})
</script>
<template>
<button @click="increment">Count is: {{ count }}</button>
</template>
两种 API 区别
- 选项式 API 以“组件实例”的概念为中心 (即上述例子中的 this),对于有面向对象语言背景的用户来说,这通常与基于类的心智模型更为一致。
它将响应性相关的细节抽象出来,并强制按照选项来组织代码,从而对初学者而言更为友好。 - 组合式 API 的核心思想是直接在函数作用域内定义响应式状态变量,并将从多个函数中得到的状态组合起来处理复杂问题。这种形式更加自由,也需要你对 Vue 的响应式系统有更深的理解才能高效使用。相应的,它的灵活性也使得组织和重用逻辑的模式变得更加强大。
二、基础
1. 创建一个 Vue 应用
创建根组件,应用实例必须在调用了 .mount() 方法后才会渲染出来。
import { createApp } from 'vue'
// 从一个单文件组件中导入根组件
import App from './App.vue'
const app = createApp(App)
app.mount('#app') // 挂载根组件应用
2. 模板语法
- 最基本的数据绑定形式是文本插值,它使用的是“Mustache”语法 (即双大括号):
- v-bind 指令,绑定属性值
v-bind 指令指示 Vue 将元素的 id attribute 与组件的 dynamicId 属性保持一致。如果绑定的值是 null 或者 undefined,那么该 attribute 将会从渲染的元素上移除。 - v-on 指令,绑定事件
<template>
<div class="wrapper">
<span>使用文本插值,count 的值是:{{ count }}</span>
<button v-on:click="increment">增加1</button>
<input type="text" v-bind:value="count" />
</div>
</template>
3. 响应式基础
选项式
<script>
export default {
data() {
return { count: 6 };
},
methods: {
increment() {
this.count++;
}
}
}
</script>
<template> 同上…… </template>
组合式之一:纯组合< script>
<script>
import { ref } from "vue";
export default {
setup() {
const count = ref(6);
function increment() {
count.value++;
}
// 不要忘记同时暴露 increment 函数
return { count, increment };
}
}
</script>
<template> 同上…… </template>
组合式之二:使用< script setup>
<script setup>
import { ref } from "vue";
const count = ref(6);
function increment() {
count.value++;
}
</script>
<template> 同上…… </template>
组合式之三:使用< script setup lang=“ts”>
<script setup lang="ts">
import { ref } from "vue";
const count = ref<number>(6);
function increment(num: number): void {
count.value += num;
}
</script>
<template> 同上…… </template>