1.0 Vue组件的简单使用
- 创建组件构造器对象:Vue.extend;创建完组件构造器时,通常使用template定义我自己的组件模板;这种定义模板的方式只限在Vue2.x里面使用
- 注册组件:Vue.component;需要传递两个参数:1.注册组件的标签名 2.组件构造器
- 使用组件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<my-cpn></my-cpn>
<my-cpn></my-cpn>
<my-cpn></my-cpn>
<my-cpn></my-cpn>
</div>
<script src="../js/vue.js"></script>
<script>
const cpnc = Vue.extend({
template: `
<div>
<h2>我是中国人</h2>
<p>中国的红色革命</p>
<p>中国的快速崛起</p>
</div>`
});
Vue.component('my-cpn',cpnc);
const app = new Vue ({
el: '#app',
data: {
message: '中国人'
}
});
</script>
</body>
</html>
2.0 Vue的全局组件和局部组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app1" style="border: 1px cornflowerblue solid;">
<!--3.使用组件-->
<my-cpn></my-cpn>
<my-cpn></my-cpn>
<my-cpn></my-cpn>
</div>
<div id="app2" style="border: 1px crimson solid;">
<!--3.使用组件-->
<cpn></cpn>
</div>
<script src="../js/vue.js"></script>
<script>
const cpnc = Vue.extend({
template: `
<div>
<h2>我是中国人</h2>
<p>中国的红色革命</p>
<p>中国的快速崛起</p>
</div>`
});
const cpne = Vue.extend({
template: `
<div>
<h2>我是中国人</h2>
<p>中国的红色革命</p>
<p>中国的快速崛起</p>
</div>`
});
Vue.component('my-cpn',cpnc);
const app1 = new Vue ({
el: '#app1',
data: {
message: '中国人'
}
});
const app2 = new Vue ({
el: '#app2',
data: {
message: '中国人'
},
components:{
cpn: cpne
}
});
</script>
</body>
</html>
3.0 Vue父组件和子组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<cpnc2></cpnc2>
</div>
<script src="../js/vue.js"></script>
<script>
const cpnc1 = Vue.extend({
template: `
<div>
<h2>你是儿子</h2>
<p>中国的红色革命</p>
<p>中国的快速崛起</p>
</div>`
});
const cpnc2 = Vue.extend({
template: `
<div>
<h2>我是爸爸</h2>
<p>中国的红色革命</p>
<p>中国的快速崛起</p>
<cpnc1></cpnc1>
</div>`,
components:{
cpnc1: cpnc1
}
});
const app = new Vue ({
el: '#app',
data: {
message: '中国人'
},
components:{
cpnc2: cpnc2
}
});
</script>
</body>
</html>
Vue组件语法糖
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<my-cpn></my-cpn>
<my-cpn></my-cpn>
<my-cpn></my-cpn>
<my-cpn></my-cpn>
<cpc></cpc>
</div>
<script src="../js/vue.js"></script>
<script>
Vue.component('my-cpn',{
template: `
<div>
<h2>我是中国人</h2>
<p>中国的红色革命</p>
<p>中国的快速崛起</p>
</div>`
});
const app = new Vue ({
el: '#app',
data: {
message: '中国人'
},
components:{
cpc:{
template: `
<div>
<h2>我是中国人</h2>
<p>中国的红色革命</p>
<p>中国的快速崛起</p>
</div>`
}
}
});
</script>
</body>
</html>
Vue组件中的数据存放问题
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<cpn></cpn>
<cpn></cpn>
<cpn></cpn>
</div>
<template id="cpn">
<div>
<h2>{{message}}</h2>
<p>我是内容,hehehe..</p>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
Vue.component('cpn',{
template: '#cpn',
message:'等你电话'
});
const app = new Vue ({
el: '#app',
data: {
message: '中国人'
}
});
</script>
</body>
</html>
Vue为什么data必须返回的是函数
- 每一个函数都会在data里面划分一块内存区域;这样做的好处是,当组件到多个地方使用的时候,数据不会因为一个动作改变了而产生其它地方数据改变了
- 如果想以前Vue中定义属性,就会出现数据因为一个动作变了,其它地方也变了;这是因为一个属性只划分一个内存区域,大家都在一起使用它
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<cpn></cpn>
<cpn></cpn>
<cpn></cpn>
</div>
<template id="cpn">
<div>
<h2>当前计数:{{counter}}</h2>
<button @click="increment">+</button>
<button @click="decrement">-</button>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
Vue.component('cpn',{
template:'#cpn',
data(){
return{
counter: 0
}
},
methods:{
increment(){
this.counter++
},
decrement(){
this.counter--
}
}
})
const app= new Vue ({
el: '#app',
data: {
message: '你是猪吗???'
}
})
</script>
</body>
</html>
父子通信,父传子
- 儿子想要用父亲的东西必须定义一样的函数去接
- 关键函数properties(简写:props)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!--数组写法-->
<!--<cpn v-bind:cmessage="message" :cmovies="movies"></cpn>-->
<cpn :cmessage="message" :cmovies="movies"></cpn>
</div>
<template id="cpn">
<div>
<p>{{cmovies}}}</p>
<h2>{{cmessage}}</h2>
<ul>
<li v-for="item in cmovies">{{item}}</li>
</ul>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
const cpn={
template:'#cpn',
//数组写法
//props:['cmovies','cmessage'],
props:{
cmessage:{
type:String,
default:'未提供数据!',
required:true,
},
cmovies:{
type:Array,
default(){
return ['大海有风,我有你']
}
}
},
data(){
return {}
}
}
const app = new Vue({
el:'#app',
data:{
message:"你好啊!老大",
movies:['海尔兄弟','海贼王','海王']
},
components:{
cpn
}
})
</script>
</body>
</html>
组件通信,子传父
- 关键函数:$emit
- 子组件发送一个点击事件,同时子组件要使用点击事件,用$emit把值传递给父组件;父组件监听到点击事件触发 ,执行父组件里面的点击事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<cpn @itemclick="cpnClick"></cpn>
</div>
<template id="cpn">
<div>
<button v-for="item in categories"
@click="btnClick(item)"
>{{item.name}}</button>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
const cpn={
template:"#cpn",
data(){
return{
categories:[
{id:'aaaa',name:'热门推荐'},
{id:'bbbb',name:'手机数码'},
{id:'cccc',name:'家用电器'},
{id:'dddd',name:'电脑办公'},
]
}
},
methods:{
btnClick(item){
this.$emit('itemclick',item);
}
}
}
const app=new Vue({
el:'#app',
data:{
},
components:{
cpn
},
methods:{
cpnClick(item){
console.log(item);
}
}
});
</script>
</body>
</html>