L&Z's blog L&Z's blog
主页
  • HTML
  • CSS
  • JS
  • TS
  • Vue
  • Node
  • Markdown
  • Yaml
  • HTML
  • CSS
  • JS
  • TS
  • Vue
  • Node
  • 小程序
  • 博客
  • 工作
  • VSCode
  • Browser
  • Npm
  • Git
  • GitHub
  • 友链
  • 收藏
  • 足迹
  • 记录
  • 抽奖
  • 错 or 对
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)

L&Z

主页
  • HTML
  • CSS
  • JS
  • TS
  • Vue
  • Node
  • Markdown
  • Yaml
  • HTML
  • CSS
  • JS
  • TS
  • Vue
  • Node
  • 小程序
  • 博客
  • 工作
  • VSCode
  • Browser
  • Npm
  • Git
  • GitHub
  • 友链
  • 收藏
  • 足迹
  • 记录
  • 抽奖
  • 错 or 对
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)
  • CSS

  • JS

  • Vue

    • 基础

    • 组件

      • 使用组件的细节点
      • 父组件给子组件传值
      • 子组件派发事件和值给父组件
      • Prop验证与非Prop的Attribute
      • 自定义事件
      • 兄弟组件传值
      • 非父子组件传值
      • 父组件调用子组件方法并传入值
      • 动态组件与v-once指令
      • 插槽slot
      • vue父子组件的生命周期顺序
    • 过渡&动画

    • 可复用性&组合

    • 工具

    • 规模化

    • Vuex

    • Axios 常用配置
    • Vue中的防抖函数封装和使用
    • 操作本地缓存
  • Node

  • 小程序

  • 博客搭建

  • 工作

  • 笔记
  • Vue
  • 组件
lz
2021-08-15

非父子组件传值

当组件的嵌套多时,非父子组件间传值就显得复杂,除了使用vuex (opens new window)实现之外,还可以通过Bus(或者叫 总线/发布订阅模式/观察者模式)的方式实现非父子组件间传值。

<div id="root">
    <child1 content="组件1:点我传出值"></child1>
    <child2 content="组件2"></child2>
</div>

<script type="text/javascript">
  Vue.prototype.bus = new Vue()
  // 每个Vue原型上都会有bus属性,而且指向同一个Vue实例

  Vue.component('child1', {
  props: {
    content: String
  },
  template: '<button @click="handleClick">{{content}}</button>',
  methods: {
    handleClick(){
    this.bus.$emit('change', '我是组件1过来的~') // 触发change事件,传出值
    }
  }
  })

  Vue.component('child2', {
  data() {
    return {
    childVal: ''
    }
  },
  props: {
    content: String,
  },
  template: '<button>{{content}} + {{childVal}}</button>',
  mounted() {
    this.bus.$on('change', (msg) => { // 绑定change事件,执行函数接收值
    this.childVal = msg
    })
  }
  })

  var vm = new Vue({
  el: '#root'
  })
</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

上面代码中,在Vue原型上绑定一个bus属性,指向一个Vue实例,之后每个Vue实例都会有一个bus属性。

此方法传值,不限于兄弟组件之间,其他关系组件间都适用。

<div id="root">
    <child1 content="组件1:点我传出值"></child1>
    <child2 content="组件2"></child2>
</div>

<script>
Vue.prototype.bus = new Vue()
// 每个Vue原型上都会有bus属性,而且指向同一个Vue实例

Vue.component('child1', {
  props: {
    content: String
  },
  template: '<button @click="handleClick">{{content}}</button>',
  methods: {
    handleClick(){
      this.bus.$emit('change', '我是组件1过来的~')
      // 触发change事件,传入值
    }
  }
})

Vue.component('child2', {
  data() {
    return {
      childVal: ''
    }
  },
  props: {
    content: String,
  },
  template: '<button>{{content}} + {{childVal}}</button>',
  mounted() {
    this.bus.$on('change', (msg) => {
      this.childVal = msg
    })
  }
})

var vm = new Vue({
  el: '#root'
})
</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
编辑 (opens new window)
#Vue
上次更新: 2023/03/08, 02:53:55
兄弟组件传值
父组件调用子组件方法并传入值

← 兄弟组件传值 父组件调用子组件方法并传入值→

最近更新
01
nodejs递归读取所有文件
12-15
02
vue3响应式原理
09-20
03
原生js实现jquery中siblings效果
09-20
更多文章>

Gitalking ...

Theme by Vdoing | Copyright © 2021-2025 L&Z |
  • 跟随系统
  • 浅色模式
  • 深色模式