vue父子、兄弟组件传值

1.父组件向子组件传值

父组件传值

<template>
  <div>
    <son :sonName="name"
         :sonTitle="title"></son>   // 子组件
  </div>
</template>
<script>
import son from '../components/son'
export default {
    
    
  data () {
    
    
    return {
    
    
      name: 'Tom',
      title: 'vue父组件向子组件传值'
    }
  },
  components: {
    
    
    son
  }
}
</script>

子组件接收

<template>
  <div>
    {
    
    {
    
    sonName}}
    {
    
    {
    
    sonTitle}}
  </div>
</template>
<script>
export default {
    
    
  props: {
    
              // 接收父组件的传值
    sonName: {
    
    
      type: String
    },
    sonTitle: {
    
    
      type: String,
      default: ''
    }
  }
}

2.子组件向父组件传值($emit)

子组件传值

子组件传值
<template>
  <div>
    <button @click="toFather">传值</button>
  </div>
</template>
<script>
export default {
    
    
  data () {
    
    
    return {
    
    
      name: 'Tom',
    }
  },
  methods: {
    
    
    toFather () {
    
    
      this.$emit('handleChange', this.name)
    }
  }
}
</script>

父组件接收

<template>
  <div>
    <son @handleChange="loadSon"></son>
  </div>
</template>
<script>
import son from '../components/son'
export default {
    
    
  methods: {
    
    
    loadSon (name) {
    
    
      console.log(name)   // 接收到子组件传过来的值
    }
  },
  components: {
    
    
    son
  }
}
</script>

3.兄弟组件之间传值(bus.js)

方法一

1.在main.js中,new一个空的vue挂在到vue原型上:

Vue.prototype.$bus = new Vue();

2.在demo.vue中使用bus发送数据(可以通过点击事件触发)

this.$bus.$emit("sendData",{
    
    data:"需要发送的数据"})

3.在另一个test.vue中接收数据(可以写在created生命周期函数中)

this.$bus.$on("sendData",d=>{
    
    console.log(d)})

方法二
1.新建bus.js

import Vue from 'vue'
export default  new Vue

2.在需要传值和接受值的vue文件中,各自引入bus.js

import bus from '../util/bus'

3.定义传值的方法,使用bus.$emit(‘methodName’,data), methodName是自定义的方法名

<button @click="trans()">传值</button>
methods: {
    
    
    trans(){
    
    
      bus.$emit('test',this.helloData)
    }
  }

4.在要接收值的组件里,使用bus.on(‘methodName’,val =>{ }) ,val 就是传过来的值

 mounted(){
    
    
    bus.$on('test',val=>{
    
    
      console.log(val);
      this.cdata = val
    })
  }

如果要传多个值:

 bus.$emit('test',data1,data2,data3……)

同样接收时候,需要接收多个值

bus.$on(test,(val,val2,val3……)=>{
    
    
     console.log(val,val2,val3)
})

如果需要不触发事件,就把值传递给兄弟组件,那么必须通过异步的方法传递,例如axios或者setTimeout

 // 不通过点击事件,把数据传递给兄弟组件,一定要setTimeout,或者axios请求
     setTimeout(() => {
    
    
       bus.$emit('test',data)
     }, 2000);

猜你喜欢

转载自blog.csdn.net/weixin_42164004/article/details/110436867