记录:262
体验Vue.component注册全局组件,components注册局部组件,父组件向子组件传值,子组件向父组件传值,同级组件之间传递值。
本例环境:
jQuery:3.6.0;Vue:2.6.0
1.体验Vue.component注册全局组件
全局组件使用Vue.component注册。组件重复使用,不冲突。
1.1HTML标签
<div id="app">
<div><strong>开始体验Vue.component</strong></div>
<div style="color: blue;">体验Vue.component全局API</div>
<button-city></button-city>
<button-city></button-city>
</div>
1.2组件代码
Vue.component('button-city',{
data:function(){
return {
cityInfo:''
}
},
template: `
<div>
<button @click="handleCity">点击</button>
<div><span>城市: </span>{{cityInfo}}</div>
</div>
`,
methods:{
handleCity:function(){
if( this.cityInfo==''){
this.cityInfo = '杭州';
}else{
this.cityInfo=''
}
}
}
});
1.3对应Vue代码
var vm = new Vue({
el: '#app',
data: {
},
});
1.4效果
运行效果如下:
2.体验components注册局部组件
局部组件使用components注册。
2.1HTML标签
<div id="app">
<div><strong>开始体验components</strong></div>
<div style="color: blue;">体验components局部组件</div>
<div style="color: orange;">country-info组件</div>
<country-info></country-info>
<div style="color: orange;">province-info组件</div>
<province-info></province-info>
<div style="color: orange;">city-info组件</div>
<city-info></city-info>
</div>
2.2组件代码
var countryInfo = {
data: function () {
return {
country: ''
}
},
template: `
<div>
<button @click="handleCountry">点击</button>
<div><span>国: </span>{{country}}</div>
</div>
`,
methods: {
handleCountry: function () {
this.country = '中国,是一个美丽国家.';
}
}
};
var provinceInfo = {
data: function () {
return {
province: ''
}
},
template: `
<div>
<button @click="handleProvince">点击</button>
<div><span>省: </span>{{province}}</div>
</div>
`,
methods: {
handleProvince: function () {
this.province = '浙江,是一个经济发达地区.'
}
}
};
var cityInfo = {
data: function () {
return {
cityInfo: ''
}
},
template: `
<div>
<button @click="handleCity">点击</button>
<div><span>市: </span>{{cityInfo}}</div>
</div>
`,
methods: {
handleCity: function () {
this.cityInfo = '杭州,是一个互联网发达城市.';
}
}
};
2.3对应Vue代码
var vm = new Vue({
el: '#app',
data: {
},
components: {
'hello-world': HelloWorld,
'hello-tom': HelloTom,
'hello-jerry': HelloJerry
}
});
2.4效果
运行效果如下:
3.体验Vue.component父组件向子组件传值
父组件向子组件传递值,使用props属性。
3.1HTML标签
<div id="app">
<div><strong>开始体验组件间传值(全局组件)</strong></div>
<div style="color: blue;">父组件向子组件传值(使用props)</div>
<component-info :country='countryInfo' :province='provinceInfo' :girl='girlInfo'></component-info>
</div>
3.2组件代码
Vue.component('component-info',{
props:['country','province','girl'],
template:`
<div>
<div style="color: orange;">国:</div>
<div>{{country}}</div>
<div style="color: orange;">华东各省:</div>
<div :key='index' v-for='(item,index) in province'>{{item}}</div>
<div style="color: orange;">美女信息:</div>
<div>罩杯: {{girl.cup}} ,身高: {{girl.height}}</div>
</div>
`
});
3.3对应Vue代码
var vm = new Vue({
el: '#app',
data: {
countryInfo:'中国是一个宜居国家.',
provinceInfo:['上海','浙江','福建','江苏'],
girlInfo:{
cup:'D',
height: 160
}
}
});
3.4效果
运行效果如下:
4.体验Vue.component子组件向父组件传值
子组件向父组件传值,使用$emit触发事件,使用$event接收事件。
4.1HTML标签
<div id="app">
<div><strong>开始体验组件间传值(全局组件)</strong></div>
<div style="color: blue;">子组件向父组件传值(使用props)</div>
<sub-to-main :province='provinceInfo' @change-city='handleCity' @check-height='handleHeight($event)'></sub-to-main>
<div>城市: {{cityInfo}}</div>
<div>身高: {{height}}</div>
</div>
4.2组件代码
Vue.component('sub-to-main', {
props: ['province'],
template: `
<div>
<div style="color: orange;">华东各省:</div>
<div :key='index' v-for='(item,index) in province'>{{item}}</div>
<div><span>切换城市: </span>
<button @click='$emit("change-city")'>切换</button>
</div>
<div><span>校验高度: </span>
<button @click='$emit("check-height",2)'>校验</button>
</div>
</div>
`
});
4.3对应Vue代码
var vm = new Vue({
el: '#app',
data: {
provinceInfo: ['上海', '浙江', '福建', '江苏'],
cityInfo: '上海',
height: 160
},
methods: {
handleCity: function () {
if (this.cityInfo == '上海') {
this.cityInfo = '杭州';
} else {
this.cityInfo = '上海'
}
},
handleHeight: function (value) {
this.height += value;
}
}
});
4.4效果
运行效果如下:
5.体验Vue.component同级组件之间传递值
体验Vue.component注册的局部组件,同级组件之间传递值,使用vm.$emit触发事件,使用vm.$on监听事件,需要创建一个全局的var vm= new Vue()。
5.1HTML标签
<div id="app">
<div><strong>开始体验组件间传值(全局组件)</strong></div>
<div style="color: blue;">同级组件之间传递值(vm.$emit触发,vm.$on监听)</div>
<div style="color: orange;">体验girl-component组件</div>
<girl-component></girl-component>
<div style="color: orange;">体验boy-component组件</div>
<boy-component></boy-component>
<div style="color: orange;">关闭组件之间传递通道</div>
<div><button @click="stopSendEvent">关闭</button> <span style="color: red;">{{stopInfo}}</span></div>
</div>
5.2组件代码
var messageHub = new Vue();
Vue.component('girl-component', {
data: function () {
return {
sendInfo: "请继续努力,共同进步.",
receiveInfo: ''
}
},
template: `
<div>
<div>
<span>向boy-component组件发送信息</span>
<button @click='handleInfo'>点击发送</button>
</div>
<div>接收boy-component组件信息: <span style="color: red;">{{receiveInfo}}</span></div>
</div>
`,
methods: {
handleInfo: function () {
messageHub.$emit('to-boy-event', this.sendInfo);
}
},
mounted: function () {
messageHub.$on('to-girl-event', (value) => {
this.receiveInfo = value;
});
}
});
Vue.component('boy-component', {
data: function () {
return {
sendInfo: '共同学习,共同进步.',
receiveInfo: ''
}
},
template: `
<div>
<div>
<span>向girl-component组件发送信息</span>
<button @click='handleInfo'>点击发送</button>
</div>
<div>接收girl-component组件信息: <span style="color: red;">{{receiveInfo}}</span></div>
</div>
`,
methods: {
handleInfo: function () {
messageHub.$emit('to-girl-event', this.sendInfo);
}
},
mounted: function () {
messageHub.$on('to-boy-event', (value) => {
this.receiveInfo = value;
});
}
});
5.3对应Vue代码
var vm = new Vue({
el: '#app',
data: {
stopInfo: '组件信息传递通道已开启.'
},
methods: {
stopSendEvent: function () {
messageHub.$off('to-boy-event');
messageHub.$off('to-girl-event');
this.stopInfo = '组件信息传递通道已关闭';
}
}
});
5.4效果
运行效果如下:
6.体验components同级组件之间传递值
体验components注册的局部组件,同级组件之间传递值,使用vm.$emit触发事件,使用vm.$on监听事件,需要创建一个全局的var vm= new Vue()。
6.1HTML标签
<div id="app">
<div><strong>开始体验组件间传值(局部组件)</strong></div>
<div style="color: blue;">同级组件之间传递值(vm.$emit触发,vm.$on监听)</div>
<div style="color: orange;">体验girl-component组件</div>
<girl-component></girl-component>
<div style="color: orange;">体验boy-component组件</div>
<boy-component></boy-component>
<div style="color: orange;">关闭组件之间传递通道</div>
<div><button @click="stopSendEvent">关闭</button> <span style="color: red;">{{stopInfo}}</span></div>
</div>
6.2组件代码
var messageHub = new Vue();
var girlComponent = {
data: function () {
return {
sendInfo: "请继续努力,共同进步.",
receiveInfo: ''
}
},
template: `
<div>
<div>
<span>向boy-component组件发送信息</span>
<button @click='handleInfo'>点击发送</button>
</div>
<div>接收boy-component组件信息: <span style="color: red;">{{receiveInfo}}</span></div>
</div>
`,
methods: {
handleInfo: function () {
messageHub.$emit('to-boy-event', this.sendInfo);
}
},
mounted: function () {
messageHub.$on('to-girl-event', (value) => {
this.receiveInfo = value;
});
}
};
var boyComponent = {
data: function () {
return {
sendInfo: '共同学习,共同进步.',
receiveInfo: ''
}
},
template: `
<div>
<div>
<span>向girl-component组件发送信息</span>
<button @click='handleInfo'>点击发送</button>
</div>
<div>接收girl-component组件信息: <span style="color: red;">{{receiveInfo}}</span></div>
</div>
`,
methods: {
handleInfo: function () {
messageHub.$emit('to-girl-event', this.sendInfo);
}
},
mounted: function () {
messageHub.$on('to-boy-event', (value) => {
this.receiveInfo = value;
});
}
};
6.3对应Vue代码
var vm = new Vue({
el: '#app',
data: {
stopInfo: '组件信息传递通道已开启.'
},
methods: {
stopSendEvent: function () {
messageHub.$off('to-boy-event');
messageHub.$off('to-girl-event');
this.stopInfo = '组件信息传递通道已关闭';
}
},
components: {
'girl-component': girlComponent,
'boy-component': boyComponent,
}
});
6.4效果
运行效果如下:
以上,感谢。
2021年9月15日