理解应用实例和组件实例 | 重学Vue3

前言

这个月开始重新开始学习Vue3,从理解基本使用到模拟实现!

本文关于应用实例和组件实例

基本目录如下:

image.png

创建一个Vue的应用实例

这部分主要讲以下3点:

image.png

1. 通过createApp函数创建Vue的应用实例

代码如下:

const app = Vue.createApp({ /* 相关选项配置 */ })

app即是应用实例

2. 返回的应用实例可以用于注册全局组件

比如:

app.component('Xxx', XxxComponent)

3. 应用实例上有很多方法都允许链式调用

比如:

Vue.createApp({ /* 相关选项配置 */ })
    .component('Xxx', XxxComponent)

原因在于,它们都是返回同一个app实例

根组件

这部分主要讲以下几点:

image.png

1. 利用createApp创建实例时需要传递一个选项,表示根组件的配置

比如,我们使用vite创建的项目中,有个main.js文件

//main.js
import { createApp } from 'vue'
import App from './App.vue'
import './index.css'

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

上述代码中所传递的App即是根组件的配置

对应找到App.vue文件看看

//App.vue
//.....Omit some code.....
<script>
import HelloWorld from './components/HelloWorld.vue'
export default {
  name: 'App',
  components: {
    HelloWorld
  }
}
</script>

这里可以看到它导出的东西,我们干脆一探究竟,在看看子组件HelloWorld.vue

//components/HelloWorld.vue
//.....Omit some code.....
<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  },
  data() {
    return {
      count: 0
    }
  }
}
</script>

于是我们可以看到这个组件的配置有namepropsdata等,在实际使用中配置会更加丰富一些,之后会具体讲到

2. 可通过mount方法将一个应用挂载到一个DOM中,当挂载时,根组件会作为渲染的起点。需要注意:mount返回的是根组件实例,而不是应用实例了

为了看清楚,我们可以将app应用实例和根组件实例打印出来看

const app = createApp(App)
console.log(app);
console.log(app.mount('#app'));

结果如下:

image.png

可以看到两者是不一样的!

3. 一个根组件可以包含n个子组件,每个组件将有自己的组件实例,这些组件实例都共享同一个应用实例

还是以vite创建的Vue3项目为例,App组件中还包含子组件HelloWorld

import HelloWorld from './components/HelloWorld.vue'
export default {
  name: 'App',
  components: {
    HelloWorld
  }
}

除此之外,你还可以添加其他自定义的组件

4. 本质上,根组件与其他组件是一样的

都是组件,两者并没有什么不同,包括行为和传递的配置其实都是一样的,只是根组件作为根,其他组件作为根组件的子组件而已

组件配置选项

这部分主要讲以下4点:

image.png

1. data中定义的属性都是通过组件实例暴露

比如在App组件中的配置data,里面定义一个属性name

data() {
    return {
      name: 'Alice'
    }
}

然后我们通过组件实例来获取到,需要注意不是应用实例

const app = createApp(App)
const vm = app.mount('#app')
console.log(app.name) // undefined
console.log(vm.name) // Alice

2. 其他选项如methods,props,computed,inject 和 setup,当中定义的属性也会添加到组件实例中

其实就在导出的配置选项中填入需要配置的东西即可

{
  name: 'Xxx',
  props: {...},
  data() {
    return {
      //...
    }
  },
  setup(){
      //....
  }
  //等等
}

3. 组件实例的所有属性,都可以在组件的模板中访问

比如HelloWorld组件中的count属性

//components/HelloWorld.vue
<template>
  <h1>{{ msg }}</h1>
  <button @click="count++">count is: {{ count }}</button>
  <p>Edit <code>components/HelloWorld.vue</code> to test hot module replacement.</p>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  },
  data() {
    return {
      count: 0
    }
  }
}
</script>

4. 组件实例还存在一些内置属性,如$attrs$emit

前面有个$,是为了避免与用户定义的属性发生冲突

生命周期钩子函数

这里主要讲以下5点内容

image.png

1. 每个组件在被创建时都会经过一系列的初始化过程,这个过程中会运行一些生命周期钩子函数

这个过程会包括模板编译、挂载、数据变化、更新DOM等等

2. 作用是,用户可以在组件的不同阶段添加自己的代码

例如我在组件挂载的时候执行一些操作

<template>
  <img alt="Vue logo" src="./assets/logo.png" />
  <HelloWorld msg="Hello Vue 3.0 + Vite" />
  <h1>{{name}}<h1>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'
export default {
  name: 'App',
  components: {
    HelloWorld
  },
  data() {
    return {
      name: 'Alice'
    }
  },
  mounted(){
    console.log(`组件挂载了,修改name属性~`);
    this.name = 'Tom'
  }
}
</script>

结果如下

image.png

可以看到,我们通过钩子函数mounted,成功修改了name的值

3. 常见的钩子函数,如created、mounted、updated 和 unmounted等等

其实还有很多,由于都列出来没多大意义。后面用到的时候我再详细讲解!

4. 里头this指向调用它的当前活动实例

其实就是当前组件实例,上个例子已经试过了

this.name = 'Tom'

5. 注意:不要在选项配置的属性中使用箭头函数,也不要在钩子函数的回调中使用箭头函数,原因是箭头函数中没有this

箭头函数没有this,所以如果使用箭头函数,它会一直向上找,直至找到为止!为了避免出错,一般都不要这样写

mounted: () => {...}

END

以上就是关于应用实例和组件实例的所有内容

如有问题,欢迎留言告知,感谢~

为了方便下载,我将相关的高清思维导图及源文件上传至GitHub,可移步下载:https://github.com/jCodeLife/mind-map

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 创建一个应用实例 每个Vue应用都是通过createApp函数创建一个应用实例开始的: 应用实例是注册一个可供组件...
    zhouyu629阅读 238评论 0 0
  • Vue.mixin 混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对...
    LUOTAOLUOTAO阅读 186评论 0 0
  • 全局API createApp 返回一个提供应用上下文的应用实例。应用实例挂载的整个组件树共享同一个上下文。 de...
    WangLizhi阅读 2,464评论 0 0
  • Vue实例是Vue应用的启动器,Vue组件是Vue实例的扩展。 1. Vue实例 通过构造函数可以创建一个Vue的...
    娜姐聊前端阅读 10,103评论 2 12
  • 快速开始 通过 CDN: 通过 Codepen[https://codepen.io/yyx990803/pen/...
    AAA前端阅读 556评论 0 1