Vue2.x 文档笔记-3
本文最后更新于:2023年6月27日 晚上
Vue2.x 文档笔记-3-深入了解组件部分
组件注册
全局注册
1 |
|
局部注册
1 |
|
Prop
prop类型
我们可以为每个prop指定值类型,这和python的类型提示十分相似,那就是在属性名后面加冒号,然后再带上期待的值类型:
1 |
|
传递静态或动态Prop
如果我们想告诉prop我们将要传递的值不是字符串,而是一个JavaScript表达式的话,就需要使用v-bind
指令:
1 |
|
单向数据流
我们不应该一个子组件内部改变prop。如果子组件中需要用到prop
的值,可以定义一个本地的data property或者计算属性:
定义本地data property:
1
2
3
4
5
6props: ['initialCounter'],
data: function () {
return {
counter: this.initialCounter
}
}定义计算属性:
1
2
3
4
5
6props: ['size'],
computed: {
normalizedSize: function () {
return this.size.trim().toLowerCase()
}
}
prop验证
在本节开头的prop类型其实就是prop验证。如果传入的值不满足需求,那么Vue会在浏览器控制台警告你(注意了,只是警告)。
当然prop验证还支持很多定制验证,如多个可能的类型、必填、带默认值等等。
非Prop的Attribute
一个非prop的attribute是指传向一个组件,但是该组件并没有相应prop定义的attribute。
虽然组件中没有相关定义,但是这个attribute仍会自动添加到组件的根元素上。
替换/合并已有的Attribute
对于绝大多数attribute来说,从外部提供给组件的值会替换掉组件内部设置好的值,比如type
属性,假设现在有一个组件的根元素上是type="date"
,但如果我们提供了type="input"
的话,那这个组件就会从日期选择器变成输入框,而这不是我们想要的结果。
但是有两个例外,class
和style
并不会替换,而是合并。比如组件内部提供了class="red"
,而外部传入了一个class="big"
,那么最终得到的是class="red big"
。
禁用Attribute继承
如果不希望组件的根元素继承attribute,可以在组件的选项中设置inheritAttrs: false
。
自定义事件
事件名
事件名请使用kebab-case命名规范进行命名
自定义组件的v-model
一个组件上的v-model
默认会利用名为value
的prop和名为input
的事件,但是我们可以对其进行自定义:
1 |
|
.sync修饰符
我们可以对一个prop进行“双向绑定”,即子组件的值变更时也能够反馈到父组件上。
假设现在有一个子组件,内含一个名为title
的prop,我们想在这个title
的值更新时,让父组件的某个值也进行更新,那就可以用update:myPropName
的模式触发事件来实现:
1 |
|
在父组件中监听这个事件并根据需要更新即可:
1 |
|
这种模式的缩写就是.sync
修饰符:
1 |
|
注意带有 .sync
修饰符的 v-bind
不能和表达式一起使用!
插槽
具名插槽
这个功能使得我们能够在组件里面创建很多个插槽而互不干扰、正常渲染。在创建插槽时,使用<slot>
元素的 name
属性为这个插槽命名:
1 |
|
然后在为这些具名插槽提供内容时,就在<template>
元素中使用v-slot
指令来指定我们需要传入的插槽:
1 |
|
作用域插槽
其实就是让父组件能访问到子组件中的某些data的功能。比如子组件中有一个user
data,要让这个data在父级的插槽内容可用,可以将user
作为<slot>
元素的一个attribute绑定上去:
1 |
|
绑定在<slot>
元素上的attribute被称为插槽prop。
在父组件中,我们可以使用带值的v-slot
来定义我们提供的插槽prop的名字,并且使用该插槽prop:
1 |
|
default
其实就是默认插槽,插槽不带名就等于<slot name="default">
具名插槽的缩写
跟v-on
和v-bind
一样,v-slot
也有缩写,即把参数之前的所有内容 (v-slot:
) 替换为字符#
。例如v-slot:header
可以被重写为#header
。
希望本文章能够帮到您~