1. Vue组件 - component
什么是组件:
组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可。
组件化和模块化的不同:
模块化:是从代码逻辑的角度进行划分的;方便代码分层开发,保证每个功能模块的职能单一
组件化:是从UI界面的角度进行划分的;前端的组件化,方便UI组件的重用
一个优秀的组件 / 模块应该做到:高内聚,低耦合
耦合性:每个模块之间相互联系的紧密程度,模块之间联系越紧密,则耦合性越高,模块的独立性就越差
内聚性:一个模块中各个元素之间的联系的紧密程度,如果各个元素(语句、程序段)之间的联系程度越高,则内聚性越高,即‘高内聚’
高内聚是说模块内部要高度聚合,低耦合是说模块与模块之间的耦合度要尽量低。 前者说的是模块内部的关系,后者说的是模块与模块之间的关系。 看似不同,实又相关。
如一个项目中有15个模块,需要在另一个项目中调用其中的一个模块,但是必须把全部的15个模块都移植过去才能使用,这就是高耦合,只移入所需的一个模块就可以使用,就是低耦合。
然后在一个模块中,各个元素(语句、程序段等)之间的联系程度越高,则内聚性越高,即高内聚。
定义全局组件
1.使用 Vue.extend 配合 Vue.component 方法
var login = Vue.extend({
template: '<h1>登录</h1>'
});
//第一个为组件名称,第二个为绑定的组件的名称
Vue.component('login', login);
2.直接使用 Vue.component 方法
Vue.component('register', {
template: '<h1>注册</h1>'
});
3.将模板字符串,定义到script标签中,同时,需要使用 Vue.component 来定义组件
<script id="tmpl" type="x-template">
<div><a href="#">登录</a> | <a href="#">注册</a></div>
</script>
<script>
Vue.component('account', {
template: '#tmpl'
});
</script>
4.将模板字符串,定义到template标签中
< template id="tmpl">
<div><a href="#">登录</a> | <a href="#">注册</a></div>
</ template >
同时,需要使用 Vue.component 来定义组件
Vue.component('account', {
template: '#tmpl'
});
一般只用第四种方式定义全局组件。
注意:
1.组件中的DOM结构,有且只能有唯一的根元素(Root Element)来进行包裹,
即最外层不能有同级的HTML标签,一般用一个 div 将其他的DOM元素包裹起来。
2.命名不能和 H5 中已有的标签重名,且驼峰命名不好使,因为HTML大小写不敏感,
可以用-连接
定义私有组件
在Vue实例中添加 components 属性即可:
const vm = new Vue({
el: '#app',
data: {
flag: true
},
methods: {
},
components: {
"register": {
template: "#register"
},
"test": {
template: "#login"
},
// 必须写ID,不可以写类名
// "lll": {
// template: ".lllllll"
// }
}
})
引用组件:
<div id='app'>
<register v-if="flag"></register>
<test v-if="flag"></test>
</div>
组件中数据和方法的调用
组件中也有data属性、methods属性、八个生命周期钩子函数等,但是data属性的属性值
由Vue实例中的对象变为了函数,并且函数中必须要有一个返回值,返回值里是组件可调用
的数据,如:
Vue.component("hello", {
template: "#hello",
data() {
return {
msg: "Hello World",
nums: 666
}
},
methods: {
add() {
this.nums += 6
}
}
})
其目的是为了组件复用时的数据隔离, 否则不同的组件都共用一个数据的话,一个发生变化每一个都会发生变化,一般情况下这不是我们想要的效果。
案例:
<!DOCTYPE html>
<html>
<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></title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router@3.0.0/dist/vue-router.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.27.2/axios.js"></script>
</head>
<body>
<div id='app'>
<button @click="flag=!flag">销毁Hello</button>
<hello v-if="flag"></hello>
</div>
<template id="hello">
<div>{{msg}}
<button @click="add">增6
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)