因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 data、computed、watch、methods 以及生命周期钩子等。仅有的例外是像 el 这样根实例特有的选项。
组件基础:
全局组件:可以在任何(根)实例中使用的组件;
局部组件:只能在某一实例中使用的组件:
一、定义全局组件和局部组件的两种方法:
方法一:定义一个全局组件和局部组件
全局组件:
let like = Vue.extend({
template: `
`
});
Vue.component('like-com', like);
局部组件:
let like = Vue.extend({
template: `
`
});
new Vue({
el: '#app1',
components: {
'like-com': like
}
});
方法二:定义一个全局组件和局部组件
全局组件:
Vue.component('like', {
template: `
`
});
局部组件:
new Vue({
el: '#app1',
components: {
'love': {
template: `
`
}
}
});
方法三、使用template定义
使用template定义的组件
使用template定义的组件的内容!
Vue.component('my-love', {
template: '#temp-com'
});
方法四、使用script定义
Vue.component('my-love', {
template: '#temp-com'
});
方法五:在模块系统中局部注册
你使用了诸如 Babel 和 webpack 的模块系统。在这些情况下,我们推荐创建一个 components 目录,并将每个组件放置在其各自的文件中。
然后你需要在局部注册之前导入每个你想使用的组件。例如,在一个假设的 ComponentB.js 或 ComponentB.vue 文件中:
import ComponentA from './ComponentA'
import ComponentC from './ComponentC'
export default {
components: {
ComponentA,
ComponentC
},
// ...
}
现在 ComponentA 和 ComponentC 都可以在 ComponentB 的模板中使用了。
二、父子组件:
let child1 = Vue.extend({
template: `
子组件child1
`
});
let child2 = Vue.extend({
template: `
子组件child2
`
});
Vue.component('like', {
components: {
'child-com1': child1,
'child-com2': child2
},
template: `
`
});
let child1 = Vue.extend({
template: `
子组件child1
`
});
let child2 = Vue.extend({
template: `
子组件child2
`
});
new Vue({
el: '#app1',
components: {
'child-app1': {
components: {
'child-com1': child1,
'child-com2': child2
},
template: `
`
}
}
});
三、父子组件通信:从父到子,用props属性绑定
Vue.component('my-comp', {
props: ['username'],
template: '
{{ username }}
'
});
new Vue({
el: '#app',
data: {
nickname: '小七'
}
})
五、平行组件传递数据:用空实例搭建桥梁
var Event = new Vue();
Vue.component('huahua', {
template: `
我说:
`,
methods: {
on_change: function(){
Event.$emit('huahua-said-something', this.i_said);
}
},
data: function(){
return {
i_said: ''
}
}
})
Vue.component('shuangdan', {
template: '
花花说:{{huahua_said}}
',
data: function(){
return {
huahua_said: ''
}
},
mounted: function(){
var me = this;
Event.$on('huahua-said-something', function(data){
me.huahua_said = data;
})
}
})
new Vue({
el: '#app'
})
六、prop:
1、在 JavaScript 中对象和数组是通过引用传入的,所以对于一个数组或对象类型的 prop 来说,在子组件中改变这个对象或数组本身将会影响到父组件的状态。
2、prop 会在一个组件实例创建之前进行验证,所以实例的属性 (如 data、computed 等) 在 default 或 validator 函数中是不可用的。
七、is:
解析 DOM 模板时的注意事项
有些 HTML 元素,诸如
、、 和