Vue 的应用实例
Vue
通过createApp
方法创建出一个「应用实例」。
import { createApp } from "vue";
import App from "./App.vue";
const app = createApp(App);
console.log(app);
// ======
// Vue2 通过实例化 Vue 进行创建应用实例
import Vue from "vue";
const app = new Vue({
// 一些配置
});
应用实例上有很多全局的方法,例如component
方法用来注册全局组件:
import { createApp } from "vue";
import App from "./App.vue";
import TodoList from "./components/TodoList.vue";
const app = createApp(App);
// 注册全局组件
app.component("TodoList", TodoList);
app.mount("#app");
<template>
<!-- 进行使用 -->
<TodoList />
</template>
app
应用实例对象上的方法大多数时候返回的是**app**
实例,所以你可以进行链式调用:
// 其他代码
const app = createApp(App);
const app2 = app.component("TodoList", TodoList);
app2.mount("#app");
console.log(app === app2); // true
根组件和根元素
「根组件」的本质就是一个对象{}
,createApp
执行的时候需要传递一个根组件,所以必须给createApp
提供一个对象。
根组件是Vue
渲染的起点,这就好比HTML
文档的html
标签,必须要有一个根标签。
import { createApp } from "vue";
import App from "./App.vue";
// 使用 mount 方法进行渲染挂载
const app = createApp(App).mount("#app");
「根元素」是一个HTML
的元素,createApp
执行创建Vue
应用实例时需要一个html
的根元素进行挂载渲染,这就是mount
方法的作用。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + Vue</title>
</head>
<body>
<!-- Vue 将从 #app 进行渲染挂载。当然你也可以把 id 更改为其他的什么东西,只需要保证 mount 能获取到对应的 DOM 节点即可 -->
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
:::info
**mount**
方法执行后返回的是「根组件」实例,并不是「应用实例」,也就是App
组件实例。这一点和app
应用实例对象上其他方法有所不同!!!
:::
// 其他代码
const app = createApp(App);
const vm = app.mount("#app");
console.log(vm);
<template>
<span>{{ msg }}</span>
</template>
<script>
export default {
data() {
return {
msg: "Hello Word",
};
},
};
</script>
从图中我们可以看到data
中的msg
属性也被添加到了根组件的实例上!
有的同学可能会经常看到vm
这个变量,其实vm
是ViewModel
的简称,来源于MVVM
模式,Vue
其实并不是一个完整的MVVM
的模型,只是参考了MVVM
模型。
组件实例
每个组件都有自己的组件实例,一个应用中所有的组件的共享一个应用实例,也就是app
应用实例对象!
无论是根组件还是应用内其他组件,配置项、组件的行为(方法、生命周期等)都是一样的。
// 一个组件基本的配置
const component = {
template: "<span>{{ msg }}</span>",
data() {
return {
msg: "Hello Word",
};
}
}
组件还可以配置props
、components
、methods
…的选项,这种方式就是Vue2
中的OptionsAPI
选项API
。
在组件中可以通过this.$attrs
、this.$emit
调用Vue
组件内置的方法。
const component = {
template: "<span @click='handleClick'>{{ msg }}</span>",
data() {
return {
msg: "Hello Word",
};
},
methods:{
handleClick(){
this.$emit("change", new Date());
}
}
}
组件的生命周期
组件是有一个初始化过程的,在这过程中,Vue
提供了很多每个阶段运行的函数,这就是生命周期函数。生命周期函数会在对应的阶段自动执行。
export default {
data() {
return {};
},
/**
* 初始化事件、生命周期
* */
// 创建组件之前
beforeCreate() {},
/**
* 初始化注入、响应式
* */
// 组件创建完成
created() {},
/**
* 是否有 template?
* yes:生成 AST 数据树 => 生成虚拟 DOM => 编译模版到渲染函数
* no:编译 el 的 innerHTML 到模版
* */
// 挂载之前
beforeMount() {},
/**
* 创建 app.$el,并添加到 el
* */
// 挂载完成
mounted() {},
// 数据更新之前
beforeUpdate() {},
/**
* 虚拟 DOM 重写渲染和更新
*/
// 数据已更新
updated() {},
// 组件销毁之前
beforeUnmount() {},
// 组件已销毁
beforeMount() {},
};