麻烦老师看下对嘛?还有关于作用域的改变能详解一下嘛?谢谢
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title></title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<style>
button {
padding: 10px 20px;
margin: 20px auto;
border-radius: 5px;
outline: none;
}
.red {
background: pink;
}
.green {
background: green;
}
</style>
</head>
<body>
<div id="app">
<!-- 组件1和组件2是兄弟组件,组件1下有一个子组件,即:组件3。点击组件3时,改变组件2的背景颜色,点击组件2时,改变组件3的背景颜色 -->
<one></one>
<two></two>
</div>
<script>
//在Vue的原型对象prototype上添加一个bus属性等于Vue的实例对象。
Vue.prototype.bus = new Vue()
//在组件1的template中添加组件3,让组件3作为组件1的子组件
Vue.component('one',{
template:'<p><three></three></p>',
})
//组件二
Vue.component('two',{
template:'<button :class="curClass" @click="btnClick">组件2</button>',
data: function () {
return {
curClass: 'green'//设置组件2的样式
}
},
methods:{
btnClick:function(){
//使用this.bus.$emit给触发事件,直接传递类名'green'
this.bus.$emit('twoChange','red')
}
},
mounted:function(){
//需要把this作为一个保存,防止下面function的this作用域发生了变化
var this_=this
//监听bus的改变
this.bus.$on('threeChange',function(msg){
this_.curClass = msg;
})
}
})
//组件三
Vue.component('three',{
template:'<button :class="curClass" @click="btnClick">组件3</button>',
data: function () {
return {
curClass: ''//设置组件3的样式
}
},
methods:{
btnClick:function(){
//使用this.bus.$emit给触发事件,直接传递类名'red'
this.bus.$emit('threeChange','red')
}
},
mounted:function(){
//需要把this作为一个保存,防止下面function的this作用域发生了变化
var this_=this
//监听bus的改变
this.bus.$on('twoChange',function(msg){
this_.curClass = msg;
})
}
})
var vm = new Vue({
el: "#app",
})
</script>
</body>
</html>
11
收起
正在回答
1回答
同学你好,点击“组件2”,“组件3”的背景变为粉色了,不符合要求。建议修改:在组件2的点击事件中触发twoChange事件时,传递的类名为green。如下:

因为普通函数中的this指向调用该函数的对象,方法虽然在当前组件中的定义的,但是在另一个组件中触发调用的,导致函数内部的this并不是指向当前组件,所以需要在函数外提前保存this指向才可以实现效果,可以结合下图理解:

祝学习愉快~
4.Vue与React高级框架开发
- 参与学习 人
- 提交作业 239 份
- 解答问题 10739 个
本阶段带你深入前端开发的肌理,通过ES6基础知识和前端主流高级框架的学习,助你快速构建企业级移动webAPP应用,进入职场的终极battle
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星