渐进式 JavaScript 框架 Vue 3 备忘清单的快速参考列表,包含常用 API 和示例。
Vue 是一套用于构建用户界面的渐进式框架
注意:Vue 3.x 版本对应 Vue Router 4.x 路由版本
已安装 16.0 或更高版本的 Node.js
$ npm init vue@latest
指令将会安装并执行 create-vue,它是 Vue 官方的项目脚手架工具
✔ Project name: … <your-project-name>
✔ Add TypeScript? … No/Yes
✔ Add JSX Support? … No/Yes
✔ Add Vue Router for Single Page Application development? … No/Yes
✔ Add Pinia for state management? … No/Yes
✔ Add Vitest for Unit testing? … No/Yes
✔ Add Cypress for both Unit and End-to-End testing? … No/Yes
✔ Add ESLint for code quality? … No/Yes
✔ Add Prettier for code formatting? … No/Yes
Scaffolding project in ./<your-project-name>...
Done.
安装依赖并启动开发服务器
$ cd <your-project-name>
$ npm install
$ npm run dev
当你准备将应用发布到生产环境时,请运行:
$ npm run build
此命令会在 ./dist 文件夹中为你的应用创建一个生产环境的构建版本
import { createApp } from 'vue'
const app = createApp({
  data() {
    return { count: 0 }
  }
})
app.mount('#app')
挂载应用
<div id="app">
  <button @click="count++">
    {{ count }}
  </button>
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<div id="app">{{ message }}</div>
<script>
  const { createApp } = Vue
  createApp({
    data() {
      return {
        message: 'Hello Vue!'
      }
    }
  }).mount('#app')
</script>
<div id="app">{{ message }}</div>
<script type="module">
  import { createApp } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
  createApp({
    data() {
      return {
        message: 'Hello Vue!'
      }
    }
  }).mount('#app')
</script>
<span>Message: {{ msg }}</span>
使用的是 Mustache 语法 (即双大括号),每次 msg 属性更改时它也会同步更新
<p>Using text interpolation: {{ rawHtml }}</p>
<p>Using v-html directive: <span v-html="rawHtml"></span></p>
双大括号{{}}会将数据解释为纯文本,使用 v-html 指令,将插入 HTML
<div v-bind:id="dynamicId"></div>
简写
<div :id="dynamicId"></div>
<button :disabled="isButtonDisabled">
  Button
</button>
data() {
  return {
    objectOfAttrs: {
      id: 'container',
      class: 'wrapper'
    }
  }
}
通过不带参数的 v-bind,你可以将它们绑定到单个元素上
<div v-bind="objectOfAttrs"></div>
{{ number + 1 }}
{{ ok ? 'YES' : 'NO' }}
{{ message.split('').reverse().join('') }}
<div :id="`list-${id}`"></div>
<!-- 这是一个语句,而非表达式 -->
{{ var a = 1 }}
<!-- 条件控制也不支持,请使用三元表达式 -->
{{ if (ok) { return message } }}
<span :title="toTitleDate(date)">
  {{ formatDate(date) }}
</span>
<p v-if="seen">Now you see me</p>
<a v-bind:href="url"> ... </a>
<!-- 简写 -->
<a :href="url"> ... </a>
<a v-on:click="doSomething"> ... </a>
<!-- 简写 -->
<a @click="doSomething"> ... </a>
<a v-bind:[attributeName]="url"> ... </a>
<!-- 简写 -->
<a :[attributeName]="url"> ... </a>
这里的 attributeName 会作为一个 JS 表达式被动态执行
<a v-on:[eventName]="doSomething"> ... </a>
<!-- 简写 -->
<a @[eventName]="doSomething">
<form @submit.prevent="onSubmit">
  ...
</form>
.prevent 修饰符会告知 v-on 指令对触发的事件调用 event.preventDefault()
v-on:submit.prevent="onSubmit"
──┬─ ─┬──── ─┬─────  ─┬──────
  ┆   ┆      ┆        ╰─ Value 解释为JS表达式
  ┆   ┆      ╰─ Modifiers 由前导点表示
  ┆   ╰─ Argument 跟随冒号或速记符号
  ╰─ Name 以 v- 开头使用速记时可以省略
<div>{{ count }}</div>
export default {
  data() {
    return {
      count: 0
    }
  },
}
<button @click="increment">
  {{ count }}
</button>
export default {
  data() {
    return {
      count: 0
    }
  },
  methods: {
    increment() {
      this.count++
    }
  }
}
import { debounce } from 'lodash-es'
export default {
  created() {
    // 每个实例都有了自己的预置防抖的处理函数
    this.debouncedClick = debounce(this.click, 500)
  },
  unmounted() {
    // 最好是在组件卸载时
    // 清除掉防抖计时器
    this.debouncedClick.cancel()
  },
  methods: {
    click() {
      // ... 对点击的响应 ...
    }
  }
}
| :- | :- | 
|---|---|
| createApp() | # | 
| createSSRApp() | # | 
| app.mount() | # | 
| app.unmount() | # | 
| app.provide() | # | 
| app.component() | # | 
| app.directive() | # | 
| app.use() | # | 
| app.mixin() | # | 
| app.version | # | 
| app.config | # | 
| app.config.errorHandler | # | 
| app.config.warnHandler | # | 
| app.config.performance | # | 
| app.config.compilerOptions | # | 
| app.config.globalProperties | # | 
| app.config.optionMergeStrategies | # | 
| :- | :- | 
|---|---|
| onMounted() | 组件挂载完成后执行 # | 
| onUpdated() | 状态变更而更新其 DOM 树之后调用 # | 
| onUnmounted() | 组件实例被卸载之后调用 # | 
| onBeforeMount() | 组件被挂载之前被调用 # | 
| onBeforeUpdate() | 状态变更而更新其 DOM 树之前调用 # | 
| onBeforeUnmount() | 组件实例被卸载之前调用 # | 
| onErrorCaptured() | 捕获了后代组件传递的错误时调用 # | 
| onRenderTracked() | 组件渲染过程中追踪到响应式依赖时调用 # | 
| onRenderTriggered() | 响应式依赖的变更触发了组件渲染时调用 # | 
| onActivated() | 若组件实例是 <KeepAlive> 缓存树的一部分,当组件被插入到 DOM 中时调用 # | 
| onDeactivated() | 若组件实例是 <KeepAlive> 缓存树的一部分,当组件从 DOM 中被移除时调用 # | 
| onServerPrefetch() | 组件实例在服务器上被渲染之前调用 # | 
| :- | :- | 
|---|---|
| createRenderer() | # |