Vue3学习笔记:Day7 组件概论
Vue中使用组件来模块化管理代码,并且实现了代码复用,并且通过组件向外暴露的接口控制组件的行为
组件实例
1 | // 创建一个Vue 应用 |
使用Vue应用的component
方法创建组件,此处使用的是字符串模板,将组件的HTML以字符串的形式写在组件配置中,在调用时只需要使用组件的标签就可以实现组件模块中定义的功能
1 | <div id="components-demo"> |
并且组件是可以复用的,可以当作一个模块放到你想使用的地方,因为每次使用一次组件,就会生成一次组件的实例,所以所有相同组件内的数据时相互独立的,是由各个组件独立维护的
1 | <div id="components-demo"> |
组件的结构
在Vue应用中的组件是相互嵌套形成树的结构
因此要确定组件的作用域,之前使用的是全局注册的方法注册组件,组件可以在整个应用中使用,还可以使用局部注册的方法,将子组件限制在某个组件内使用
组件的Prop
组件可以自定义属性,在调用组件的时候可以将特定的属性传入,增加组件的复用程度
可以在配置组件的对象中加入props
项,这个项的值是一个数组,储存所有的属性
1 | const app = Vue.createApp({}) |
代码中的title
即一个属性名,在调用此组件时,可以传入这个属性值
1 | <div id="blog-post-demo" class="demo"> |
同样可以使用v-bind
指令来将变量绑定到自定义组件的属性上
组件的事件
从父组件中调用时,可以绑定组件的任意事件
1 | <blog-post ... @enlarge-text="postFontSize += 0.1"></blog-post> |
在组件中要接收到这个事件,就需要调用$emit
方法,传入事件名称
1 | <button @click="$emit('enlargeText')"> |
中间的过程类似广播,从子组件发送的广播消息的频道是enlargeText
,父组件必须监听这个频道才能收到消息
因为在HTML中不区分大消息,所以和JS交互的命名规则都为短横线,在JS中使用时可以切换成驼峰命名
还可以提前将事件填入emits内,这样可以验证他们
1 | app.component('blog-post', { |
组件向上抛值
组件中使用$emit
第二个参数来向上抛出一个值
1 | <button @click="$emit('enlargeText', 0.1)"> |
在父组件监听时可以使用$event
来访问到这个值或者调用一个方法,而这个值会当作方法的第一个参数
1 | <blog-post ... @enlarge-text="postFontSize += $event"></blog-post> |
或者
1 | <blog-post ... @enlarge-text="onEnlargeText"></blog-post> |
1 | methods: { |
这个过程就好像原始DOM事件返回信息一样,比如处理点击事件逻辑时可以通过$event
来访问到点击事件的一些等等,就好比组件使用广播发送信息,在enlargeText
频道上发送信息,发送的信息就是一些参数,父节点切换到对应频道接收信息
组件使用v-model
自定义组件要实现v-model
,就需要理解v-model
指令的本质
其本质是双向绑定,即表单上的值会更新Vue变量,Vue变量也会更新表单上的值。所以v-model
指令可以分为两部分
- Vue变量可以更新表单,即使用
v-bind
绑定表单value
属性,实现变量更新,value
跟随着更新 - 表单值更新Vue变量,即使用
v-on
指令接受表单改变事件,将事件中的更改后的表单值赋值给Vue变量可以实现
所以我们要自定义组件实现v-model
指令,就需要实现上述两种操作
1 | <custom-input |
1 | app.component('custom-input', { |
model-value
绑定的就是searchText
变量和自定义组件中input表单的value
值,update:model-value
事件监听自定义组件中input表单的input事件,并将从事件中传出的值赋值给searchText
变量
插槽分发内容
组件的模板中可以使用<slot>
插槽标签来占位,在组件调用时,将组件传入的值插入到插槽中
1 | <alert-box> |
1 | app.component('alert-box', { |
即可将Something bad happened.
插入到<slot></slot>
位置
动态组件
1 | <!-- 组件会在 `currentTabComponent` 改变时改变 --> |
使用is
属性可以改变此处绑定的组件类型,可以绑定这个属性,用变量来控制
其中currentTabComponent
变量可以是一个已经注册了的组件名字,也可以是一个组件的实例对象