正在回答 回答被采纳积分+1
兄弟组件通信一般是借助于一个公共的Vue的实例对象,不同的组件可以通过该对象完成事件的绑定和触发,示例如下(这里为了方便演示效果,使用的是引入<script src="https://cdn.jsdelivr.net/npm/vue"></script>的方法):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | <!DOCTYPE html> <html> <head> <meta charset= "UTF-8" > <title>兄弟通信</title> <style> #wrap1, #wrap2 { width: 300px; padding: 20px; border: 1px solid red; border-radius: 8px; margin: auto; } #wrap1 { margin-bottom: 20px; border: 1px solid blue; } </style> <script src= "https://cdn.jsdelivr.net/npm/vue" ></script> </head> <body> <div id= "app" > <son1></son1> <son2></son2> </div> </body> </html> <!--子组件son1--> <template id= "son1" > <div id= "wrap1" > <h2>子组件1</h2> <button @click= "toSon2('hello world')" >向son2发消息</button> </div> </template> <!--子组件son2--> <template id= "son2" > <div id= "wrap2" > <h2>子组件2</h2> <p>显示son1传过来的内容:{{greeting}}</p> </div> </template> <script> var totalVm = new Vue(); var son1 = { template: '#son1' , methods: { toSon2(str) { // 发消息都是通过viewmodel的实例对象发送的 totalVm.$emit( 'event1' , str); } } }; var son2 = { template: '#son2' , created() { totalVm.$on( 'event1' , this .fn1); }, data() { return { greeting: '' } }, methods: { fn1(str) { console.log( "子组件2收到子组件1的消息" ,str); this .greeting = str; } } }; new Vue({ el: '#app' , data: {}, components: { son1, son2 }, created() { // 只要实例监听到该事件,当有组件发送($emit)时,就会触发回调函数 totalVm.$on( 'event1' , (str) => { console.log( '父级接收到的消息:' , str) }); } }); </script> |
实现思路是在son1子组件中,给button按钮绑定一个点击事件toSon2, 在事件中通过公共的vue对象totalVm.$emit()方法去触发一个定义事件event1,并传递参数str,然后在son2组件创建的钩子created()中监听事件event1, 并触发回调函数fn1, fn1在methods中声明,用来输出传入的参数hello world’
同学可以自己测试一下效果,理解一下哦
希望可以帮到你!
1、先来了解什么是父组件、什么是子组件
每个组件都是一份独立的实例,所谓父子组件,指的只是它们的引用关系,因为在A里面引用了B,所以B是A的子组件,假设有两个 vue 文件 one.vue和two.vue,在one.vue中会注册two.vue,如下所示:
1 2 3 4 5 6 | import Two from ./two... new Vue({ ... components: { Two}, ... }) |
这个时候,父组件是one.vue,子组件是two.vue
2、父组件通过 prop 给子组件下发数据,子组件通过$emit触发事件给父组件发送消息,即 prop 向下传递,事件向上传递,示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | < template > < div class = "parent" > < h1 >我是父组件</ h1 > <!--父组件监听子组件触发的say方法,调用自己的parentSay方法--> <!--通过:msg将父组件的数据传递给子组件--> < children :msg = "msg" @ say = "parentSay" ></ children > </ div > </ template > < script > import Children from './children.vue' export default { data() { return { msg: 'hello, children' } }, methods: { // 参数就是子组件传递出来的数据 parentSay(msg) { console.log(msg) // hello, parent } }, // 引入子组件 components: { children: Children } } </ script > |
子组件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | < template > < div class = "hello" > < div class = "children" @ click = "say" > < h1 >我是子组件</ h1 > < div > 父组件对我说:{{msg}} </ div > </ div > </ div > </ template > < script > export default { //父组件通过props属性传递进来的数据 props: { msg: { type: String, default: () => { return '' } } }, data () { return { childrenSay: 'hello, parent' } }, methods: { // 子组件通过emit方法触发父组件中定义好的函数,从而将子组件中的数据传递给父组件 say(){ this.$emit('say' , this.childrenSay); } } } </ script > |
希望可以帮到你!
- 参与学习 人
- 提交作业 239 份
- 解答问题 10739 个
本阶段带你深入前端开发的肌理,通过ES6基础知识和前端主流高级框架的学习,助你快速构建企业级移动webAPP应用,进入职场的终极battle
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧