Vue 组件基础
2023-06-13 09:14:40 时间
组件基础
什么是组件
需求: 如果页面中有多个一样结构的控件,比如
<div id="app">
<!-- 页面中有多个一样结构的标签: span+button -->
<span>{{count1}}</span> <button @click="changeCount1">按钮</button> <br>
<span>{{count2}}</span> <button @click="changeCount2">按钮</button> <br>
<span>{{count3}}</span> <button @click="changeCount3">按钮</button> <br>
<span>{{count4}}</span> <button @click="changeCount4">按钮</button> <br>
<span>{{count5}}</span> <button @click="changeCount5">按钮</button> <br>
</div>
<script src="./vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
count1: 0,
count2: 0,
count3: 0,
count4: 0,
count5: 0
},
methods: {
changeCount1() {
this.count1++;
},
changeCount2() {
this.count2++;
},
changeCount3() {
this.count3++;
},
changeCount4() {
this.count4++;
},
changeCount5() {
this.count5++;
}
}
});
</script>
问题:
- 代码重复 冗余
- 不利于维护
解决方案: 使用Vue中一个十分重要的特性-组件
体验组件的使用
<div id="app">
<!-- 2. 使用组件 -->
<span-btn></span-btn>
<span-btn></span-btn>
<span-btn></span-btn>
<span-btn></span-btn>
</div>
<script src="./vue.js"></script>
<script>
// 注册全局组件
Vue.component('span-btn', {
template: `
<div>
<span>{{count}}</span>
<button @click="changeCount">按钮</button>
</div>
`,
data() {
return {
count: 0
}
},
methods: {
changeCount() {
this.count++;
}
}
});
new Vue({
el: '#app'
});
</script>
什么是组件:
组件系统是 Vue 的另一个重要概念,允许我们使用小型、独立和通常可复用的组件构建大型应用。
仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树:
例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。
- 组件是可复用的 Vue 实例,且带有一个名字
- 组件的选项:
- 组件与
new Vue
接收相同的选项:例如data
、computed
、watch
、methods
以及生命周期钩子等。 - 仅有的例外是像
el
这样根实例特有的选项
- 组件与
- 另外, 组件也有自己的选项 template components等
组件的特点
- 组件是一种封装
- 组件能够让我们复用已有的html、css、js
- 可复用
- 是一个特殊的Vue实例
- 可以任意次数的复用
- 每用一次组件,就会有一个它的新实例被创建
- 组件中的data要求必须是一个函数,且需要返回一个对象
- 组件有自己的作用域
- template 每个组件模板有且只有一个根元素
建议: 在实际开发中,尽可能使用各种第三方组件
组件的分类和使用
- 分类: 全局注册和局部注册
- 使用(步骤): 1. 注册组件 2. 通过组件名字使用组件
全局注册
- 使用Vue.component(组件名,组件选项) 进行注册 组件名:推荐小写加减号的命名方式
- 用在其被注册之后的任何 (通过
new Vue
) 新创建的 (一个或者多个)Vue 实例
Vue.component('组件名', {
// 组件选项: data methods template等(没有el)
// data 的值是一个函数, 需要返回一个对象
});
<div id="app">
<!-- 2. 使用组件 -->
<span-btn></span-btn>
<span-btn></span-btn>
<span-btn></span-btn>
<span-btn></span-btn>
</div>
<hr>
<div id="app1">
<span-btn></span-btn>
<My-Component></My-Component>
</div>
<hr>
<div id="app2">
<span-btn></span-btn>
</div>
<hr>
<div id="app3">
<span-btn></span-btn>
</div>
<script src="./vue.js"></script>
<script>
// 1. 注册组件
// Vue.component('组件名', {
// // 组件选项: data methods template等
// });
Vue.component('span-btn', {
// template: 页面字符串,有且仅有一个根元素
template: `
<div>
<span>{{count}}</span>
<button @click="changeCount">按钮</button>
</div>
`,
data() {
return {
count: 0
}
},
methods: {
changeCount() {
this.count++;
}
}
});
Vue.component('myComponent', {
template: `
<div>
<h1>{{num}}</h1>
<button @click="changeTitle">按钮</button>
</div>
`,
style: './style.css',
data() {
return {
num: 0
}
},
methods: {
changeTitle() {
this.num++;
}
}
});
new Vue({
el: '#app'
});
new Vue({
el: '#app1'
});
new Vue({
el: '#app2'
});
new Vue({
el: '#app3'
});
</script>
注意:
- 全局组件必须写在Vue实例创建之前,才在该根元素下面生效
- 在不同的Vue实例中可以使用多个不同的全局组件
- 每个组件有自己的作用域
局部注册
- 直接在Vue实例里面通过 components选项进行注册
- 对于
components
对象中的每个属性来说,- 其属性名就是自定义元素的名字,其属性值就是这个组件的选项对象。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<!-- 2 使用组件 -->
<com-A></com-A>
<com-B></com-B>
<com-C></com-C>
</div>
<script src="./vue.js"></script>
<script>
// 局部组件的选项
const comA = {
template: `<div>{{titleA}}</div>`,
data() {
return {
titleA: 'comA中的data里的titleA'
}
}
};
const comB = {
template: `<div>{{titleB}}</div>`,
data() {
return {
titleB: 'comB中的data里的titleB'
}
}
};
const comC = {
template: `<div>{{titleC}}</div>`,
data() {
return {
titleC: 'comC中的data里的titleC'
}
}
};
new Vue({
el: '#app',
// 1. 在Vue实例中设置components选项{组件名:组件选项}
components: {
// 在页面中的组件名:组件选项
'comA': comA,
'comB': comB,
'comC': comC
}
});
</script>
</body>
</html>
组件嵌套
我们可以在new Vue()实例中使用自定义组件, 也可以在注册自定义组件时,嵌套另一个自定义组件,也就是父子组件的关系
父子组件-写法一
<div id="app">
<!-- 2. 通过组件名使用组件 -->
<parent-Com></parent-Com>
</div>
<script src="./vue.js"></script>
<script>
// 1. 注册全局组件
Vue.component('childCom', {
template: `
<div>
<h1>childCom全局组件</h1>
</div>
`
});
Vue.component('parentCom', {
// 在parentCom中嵌入childCom组件
// parentCom和childCom属于父子组件
// 父组件是parentCom
// 子组件是childCom
template: `
<div>
<h1>parentCom全局组件</h1>
<child-Com></child-Com>
</div>
`
});
new Vue({
el: '#app'
});
</script>
父子组件-写法二
<div id="app">
<!-- 2. 通过组件名使用组件 -->
<parent-Com></parent-Com>
</div>
<script src="./vue.js"></script>
<script>
// 1. 局部组件的选项
const childCom = {
template: `
<div>
<h1>childCom局部组件</h1>
</div>
`
};
// 在parentCom组件选项中 使用components选项设置其子组件
// 在template中使用该子组件
const parentCom = {
template: `
<div>
<h1>parentCom局部组件</h1>
<child-Com></child-Com>
</div>
`,
components: {
'childCom': childCom
}
};
new Vue({
el: '#app',
components: {
'parentCom': parentCom
}
});
</script>
相关文章
- Vue项目实战05:18n实现多语言自动切换-浏览器语言设置「建议收藏」
- vue父子组件传值:详解父组件向子组件传值(props)
- vue-router详解[通俗易懂]
- VUE 数据分页
- vue双向绑定经典案例「建议收藏」
- 你知道import Vue from 'vue' 吗?
- 总结了Vue组件通信方式,别再说不会组件通信了
- 记录第三天-Vue组件
- Vue组件库实现按需引入可以这么做
- vue子组件向父组件传值的三种方式_vue子组件改变父组件的值
- 熬夜整理的vue面试题
- 富文本vue-quill-editor结合el-element实现自定义上传组件
- Java 编写Vue组件(VueGWT的初尝试)
- 今天讲vue讲解专栏里的VUE组件
- 【架构师(第三十三篇)】 Vue 中的实例及本地图片预览
- Vue CLI 2 脚手架 TabBar 组件封装
- vue是如何获取元素节点 ?
- vue.js客服系统实时聊天项目开发(十七)解决url get传参后进行base64解密问题
- VUE入门 生命周期 计算属性 监听器 组件【2】
- Vue递归组件
- Vue提示框组件vue-notification使用实例演示
- 使用Vue从Redis获取数据(vue去redis取数据)