1.组件的出现是为了拆分Vue实例的代码量的,能够让我们以不同的组件来规划不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可
2.组件化和模块化的不同
模块化:是从代码逻辑的角度进行划分的,方便代码分层开发,保证每个功能模块的职能单一
组件化:是从UI界面的角度进行划分的,前端的组件化方便UI组件的重用
一:创建组件:
1.方法一:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../lib/vue.js"></script>
<link rel="stylesheet" href="../lib/animate.css">
<style>
</style>
</head>
<body>
<div id="app">
<!-- 如果要使用组件,直接把组件的名称以HTML标签的形式,
引入到页面中即可
名字不能写驼峰,如果命名的时候是驼峰就在这改成-
-->
<my-com1></my-com1>
</div>
</div>
<script>
/*方法一:
//1.1使用Vue.extend来创建全局的Vue组件
var com1 = Vue.extend({
template: '<h3>这是使用Vue.extend创建的组件</h3>' //通过template属性制定了组件要展示的HTML结构
})
//1.2使用Vue.component('组件的名称',创建出来的组件模板对象)
// 如果使用Vue.component定义全局组件的时候,
组件名称使用了驼峰命名,则在引用组件的时候,需要把驼峰改成小写的字母,
// 同时两个单词之间使用-连接,如果不使用驼峰,名字直接拿来用就行
Vue.component('myCom1', com1)
*/
/* 方法一的简写:
Vue.component('myCom1', Vue.extend({
template: '<h3>这是使用Vue.extend创建的组件</h3>'
}))*/
// 再简写
// 注意:不论是哪种方式创建出来的组件,组件的template属性指向的模板内容,必须有且只能有
// 唯一一个根元素,比如h3和span就会报错,同级元素,但是可以用一个div包起来
Vue.component('myCom1', {
template: '<div><h3>这是使用Vue.extend创建的组件</h3><span>这是span</span></div>'
})
var vm = new Vue({
el: "#app",
data: {},
methods: {}
})
</script>
</body>
</html>
2.方法二
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../lib/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 标签形式 -->
<mycom></mycom>
</div>
<div id="app2">
<mycom></mycom>
</div>
<!-- 在被控制的#app外面,使用template元素,定义组件的HTML模板结构 -->
<template id="tmp">
<div>
<!-- 同级元素同样不能在一起,用更大的div包一起 -->
<h1>这是通过template元素,在外部定义的组件结构,这个方式有代码的智能提示和高亮</h1>
<h4>h4标签</h4>
</div>
</template>
<script>
Vue.component('mycom', {
template: '#tmp'
})
var vm = new Vue({
el: "#app",
data: {},
methods: {}
})
var vm2 = new Vue({
el: "#app2",
data: {},
methods: {}
})
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../lib/vue.js"></script>
</head>
<body>
<div id="app">
<mylogin></mylogin>
</div>
<script>
//对象变量,并不是名字,定义的一个组件模板对象
var login={
template:'<h1>123456<h1>'
}
Vue.component('mylogin',login)
var vm = new Vue({
el: "#app",
data: {
},
methods: {}
})
</script>
</body>
</html>
3.私有组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../lib/vue.js"></script>
</head>
<body>
<div id="app">
</div>
<div id="app2">
<login></login>
</div>
<template id="tmp">
<h1>这是一个私有组件</h1>
</template>
<script>
var vm = new Vue({
el: "#app",
data: {},
methods: {}
})
var vm2 = new Vue({
el: "#app2",
data: {},
methods: {},
components: {
//定义实例内部私有组件 只能在vm2控制的区域用
login: {
template: '#tmp'
}
}
})
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../lib/vue.js"></script>
</head>
<body>
<div id="app">
<login></login>
</div>
<script>
//对象变量,并不是名字,定义的一个组件模板对象
var login = {
template: '<h1>123456<h1>'
}
var vm = new Vue({
el: "#app",
data: {
},
methods: {},
components: {
login
}
})
</script>
</body>
</html>
二:组件中的data
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../lib/vue.js"></script>
</head>
<body>
<div id="app"><mycom></mycom></div>
<script>
// 组件可以有自己的data数据,组件的data和实例的data不一样,实例的data可以为一个对象,但是组件中的必须是一个方法
//组件中的data除了必须为一个方法之外,这个方法内部还必须返回一个对象
//组件中的data数据使用方式和实例中的data使用方式完全一样
Vue.component('mycom',{
template:'<h1>这是全局组件----{{msg}}</h1>',
data:function(){
return {
msg:'这是组件中的data定义的数据'
}
}
})
var vm = new Vue({
el: "#app",
data: {},
methods: {}
})
</script>
</body>
</html>
1.为什么组件的data必须是一个function
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../lib/vue.js"></script>
</head>
<body>
<div id="app">
<counter></counter>
<hr>
<counter></counter>
<hr>
<counter></counter>
</div>
<template id="tmp">
<div>
<input type="button" value="+1" @click="increment">
<h3>{{count}}</h3>
</template>
<script>
//设置一个计数器组件,每当点击按钮 让data中的count值+1
// var dataObj = {
// count: 0
// }
Vue.component('counter', {
template: '#tmp',
data: function () {
//在上面定义了dataObj 这种方式点击一个+1的按钮 其他的都跟着加,
//如果是每次经历一个data里面的function 这样就会重新有个数据,说明data必须是个function
// return dataObj
return { count: 0}
},
methods:{
increment(){
this.count++
}
}
})
var vm = new Vue({
el: "#app",
data: {},
methods: {}
})
</script>
</body>
</html>