1.3.2、驼峰式PascalCase
引用驼峰式命名的组件,调用时 <my-component-name></my-component-name> 和 <MyComponentName></MyComponentName> 都可以
但是我们直接在DOM(即非字符串的模板)中使用时只有短横线法是有效的。在后面CLI调用两种方法都可以
app.component(‘My-Component-Name’,{
data(){
return {
}
},
template: ``
})
全局组件:在整个Vue实例中都可以被调用
局部组件:只能在当前组件中被使用
1.4.1、全局组件
如下代码,我们在 app 下注册了一个全局组件,这意味着该组件可以在app实例内部任意地方使用:我们可以在 app 实例下使用,也可以在 home 实例下使用,也可以在 message 实例下使用。
首页
消息

当然我们也可以设置多个全局组件,代码如下:
首页
消息

当然我们全局组件之间可以相互使用,使用方式如下:我们在定义第二个全局组件,若向使用第一个全局组件,只需要将第一个全局组件的名称标签写入模板template中即可
// 定义第二个全局组件
app.component(‘lk-box’,{
template: `
盒子组件
`
})

1.4.2、局部组件🔥
如下代码,局部组件是使用一个常量来接收,我们将此局部组件通过 components 可以将其挂载在app实例中,这样我们在 app 实例里面就可以使用了

当然我们可以定义多个局部组件,然后通过 components 可以将其挂载在app实例中:

若我们想要局部组件之间相互使用,不能像全局组件那样在注册时向模板template写入名称标签,比如在注册组件时通过components将其挂载在想使用的实例中,然后再如全局组件那样向模板template写入名称标签:
// 注册第二个局部组件
const Box = {
components: {
‘lk-count’: Counter,
},
template: `
盒子组件
`
}

1.4.3、总结
全局组件:在整个Vue实例中都可以被调用,若想要全局组件之间相互使用,只需将想使用全局组件的名称写入 template 中
局部组件:只能在当前组件中被使用,若想在其他组件中使用,必须使用 components 将其挂载在想使用的组件中,然后再如全局组件那样向模板template写入名称标签
我们之后其实对局部组件用的更多一些。
template 模块写法不够清晰,如果我们能将其中的HTML分离出来写,然后挂载到对应的组件上,必然结构会变得非常清晰
Vue 提供了两种方案来定义HTML模板内容
-
使用 < script > 标签
-
使用 < template > 标签
1.5.1、使用script标签
下面代码是我们之前注册局部组件的代码,我们可以看到 templates 里面有一个 button 按钮
我们使用 script 标签将其抽离

1.5.2、使用template标签🔥
我们使用 template 标签将其抽离
<button @click=“count++”>你点击了{{count}}次

问题:组件可以访问Vue实例数据吗?
结论:组件不能直接访问Vue实例中的 data
组件是一个单独功能模块的封装:
- 这个模块有属于自己的 HTML 模板,也应该有属于自己的数据 data
组件自己的数据存放在哪呢?
-
组件对象也有一个 data 属性(也可以有 methods 属性)
-
只是这个 data 属性必须是一个函数
-
而且这个函数返回一个对象,对象内部保存着数据
// 注册一个局部组件
const Counter = {
data() {
return {
count: 0
}
},
template: `
<button @click=“count++”>你点击了{{count}}次
`,
methods: {}
}
为什么 data 在组件中必须是一个函数呢?
我这里来写一个简单介绍:我们设立两个对象,虽然都是空对象,但是两者不相等。
let obj1 = {};
let obj2 = {};
console.log(obj1 === obj2); // false
上述代码在内存中的示意图如下:

我们创建一个对象
let obj = {
name: ‘秦晓’
}
let p1 = obj;
let p2 = obj;
let p3 = obj;
console.log(p1,p2,p3);
console.log(p1 === p2); // true

let obj = {
name: ‘秦晓’
}
let p1 = obj;
let p2 = obj;
let p3 = obj;
// 我们修改p1的name
p1.name = ‘大林’;
console.log(p1,p2,p3);
console.log(p1 === p2);

从上述例子中就可以看出,如果我们在使用对象的时候,很容易造成值拷贝。现在我们来回答一下为什么 data 在组件中必须是一个函数呢?
-
首先,如果不算是一个函数,Vue 直接就会报错
-
其次,原因是在于 Vue 让每个组件对象都返回一个新的对象,因为如果是同一个对象,组件在多次使用后会相互影响
组件通信的常用方式有4种:
-
props
-
自定义事件
-
消息订阅与发布
-
vuex
在上一个小节中,我们提到了子组件是不能引用父组件或者Vue实例的数据的
但是,在开发中,往往一些数据确实需要从上层传递到下层
-
比如在一个页面中,我们从服务器请求到了很多的数据
-
其中的一部分数据,并非是我们整个页面的大组件来展示的,而是需要下面的子组件进行展示
-
这个时候,并不会让子组件再次发送一个网络请求,而是直接让大组件(父组件) 将数据传递给小组件(子组件)
组件中,使用选项 props 来声明需要从父级接收到的数据(properties)
props 的值有两种方式:
-
方式一:字符串数组,数组中的字符串就是传递时的名称
-
方式二:对象,对象可以设置传递时的类型,也可以设置默认值等。
1.7.1、props传数组
我们先来看方式一:先看如下代码,我们使用局部组件展示数据



2万+

被折叠的 条评论
为什么被折叠?



