Vue组件,扩展html,封装可重用的代码
组件命名方式有两种
(1)短横线分隔命名,如 'b-box'
(2)PascalCase首字母大写命名即大驼峰,但是当使用 PascalCase 定义组件时,在html文档里引用时必须使用kebab-case短横线分隔命名才生效,否则报错,如'TableBox'要写成'table-box'
原因:因为HTML对大小写不敏感,JS对大小写敏感
组件里的data属性必须是一个函数
1.局部组件
在Vue实例中,创建一个components对象,里面定义组件名称,一些数据方法等,先定义一个组件名称,template里写的是可重用的HTML模板,props里定义的是一些静态属性
components: {
'b-box': {
template: `
{{title}}
{{content}}
`,
props: ['title', 'content']
}
}
当要使用这个模板时,标签就是要使用的组件名,在Vue实例中,挂载对象,定义相关的数据,然后组件就可绑定这些数据,渲染页面
注意:局部组件只能在当前Vue实例作用域下有效
2.全局组件
全局组件必须写在Vue实例创建之前,才在该根元素下面生效;
Vue.component:(
'b-count', {
template: `
{{types}}
`,
})
组件间的数据传递
子组件通过$emit可以触发事件,第一个参数为要触发的事件,第二个事件为要传递的数据
在组件中来监听MyCount值的变化
watch: {
MyCount(val) {
console.log(val);
this.$emit('synccount', val)
}
}
在Vue实例中接收MyCount值的变化
methods: {
synccount(index, e) {
this.list[index].count = e
}
}
在模板中点击触发事件
3.父子组件
$parent是获取父组件对象
$root是获取根组件对象
$children是获取子组件对象
$ref返回的是一个对象,对象中包含所有带有ref属性的组件
父组件
ue.component('b-tabs', {
template:`
- {{item}}
`,
data() {
return {
//高亮索引
activeIndex:0,
//定义titles数组
titles:[]
}
},
watch:{
//监听高亮索引
activeIndex(val){
//先隐藏所有的子组件
this.$children.forEach(c=>c.isShow=false)
//再显示当前高度的子组件
this.$children[val].isShow = true
}
},
// 父组件挂载完成时,所有的子组件一定全部都挂载完成了
mounted() {
this.$children[this.activeIndex].isShow = true
},
})
子组件
Vue.component('b-tabs-item', {
props:['title'],
template:`
`,
data() {
return {
//是否显示
isShow:false
}
},
created() {
// 在子组件的created生命周期函数中,可以获取到父组件的数据
this.$parent.titles.push(this.title)
},
})
模板运用
南京的盐水鸭真好吃
- 北京的烤鸭真好吃
无锡的小笼包真好吃
运行截图
插槽问题
用
4.第三方组件库
如element-ui,vant,iview等,在需要使用的页面中引入其样式及文件,就可以使用了,简单又高效