Vue - 组件传值(父子组件间传值、非父子组件间传值)

我就是我 2022-12-21 11:00 434阅读 0赞

推荐:Vue汇总

Vue - 组件传值(父子组件间传值、非父子组件间传值)

如果你对组件不太了解,推荐你先阅读它:Vue - Vue组件基础

父子组件间传值

父组件向子组件传值:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>组件传值</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="div">
  10. <child :message="message"></child>
  11. </div>
  12. </body>
  13. </html>
  14. <script> Vue.component('child' , { props:{ message: String }, template: '<div>{ {message}}</div>' }); var vue = new Vue({ el: '#div', data: { message: 'Hello Jack' } }) </script>

父组件向子组件传值通过Prop这种方式,Vue - Prop。

效果:
在这里插入图片描述
子组件向父组件传值:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>组件传值</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="div">
  10. <child :message="message" @click-child="clickChild"></child>
  11. <p v-show="Boolean(value)">{
  12. {value + 'kaven'}}</p>
  13. </div>
  14. </body>
  15. </html>
  16. <script> Vue.component('child' , { props:{ message: String }, data: function () { return { value: '你干嘛点我!' } }, template: '<div @click="clickDiv">{ {message}}</div>', methods: { clickDiv(){ this.$emit('click-child' , this.value); } } }); var vue = new Vue({ el: '#div', data: { message: 'Hello Jack', value: null }, methods: { clickChild(value) { this.value = value; console.log(this.value) } } }) </script>

子组件向父组件传值通过$emit(value)这种方式。
效果:
在这里插入图片描述
触发点击事件。
在这里插入图片描述
非父子组件间传值

非父子组件间传值,如果通过一层一层的父子组件间传值来实现就太繁琐了,代码也会及其复杂。这里介绍通过发布订阅模式或者说观察者模式来实现非父子组件间传值。

代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>组件传值</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="div">
  10. <child :message="message"></child>
  11. <child message="我是另外一个子组件,和上面子组件不是父子关系。"></child>
  12. </div>
  13. </body>
  14. </html>
  15. <script> Vue.prototype.bus = new Vue(); Vue.component('child' , { props:{ message: String }, data: function(){ return { value: this.message } }, template: '<div @click="clickDiv">{ {value}}</div>', methods: { clickDiv(){ this.bus.$emit('click' , this.value); }, }, mounted: function () { // 作用域发生变化 var _this = this; this.bus.$on('click' , function (value) { console.log(_this.value); _this.value = value; }) } }); var vue = new Vue({ el: '#div', data: { message: 'Hello Jack' } }) </script>

你可能会在很多组件里用到数据或者实用工具,但是不想污染全局作用域。这种情况下,你可以通过在prototype(原型)上定义它们,使其在每个Vue的实例中可用。

通过在prototype(原型)上定义bus(总线,其实就是一个Vue实例)来实现发布订阅模式,组件通过bus(总线)来进行发布和订阅消息,这样就实现了非父子组件间传值。
效果:
在这里插入图片描述
触发第一个子组件的点击事件。
在这里插入图片描述
触发第二个子组件的点击事件。
在这里插入图片描述

Vue的组件传值就介绍到这里。

写博客是博主记录自己的学习过程,如果有错误,请指正,谢谢!

发表评论

表情:
评论列表 (有 0 条评论,434人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Vue父子组件

    Vue父子组件传值:有四种方式:props,ref,emit 和模板传递通信slot 通过props来传值: 静态传值就是直接通过props来传递 动态传值是通