vue中组件传值的常用方式

方法一 父组件向子组件传值 (props传参)
父组件

<template>
  <div class="container">
    <div>我是父组件</div>
    <Son
      str="字符串"
      :num="5"
      :obj="{ name: '对象信息' }"
      :func="() => {this.list()}"
      :arr="arr"
    ></Son>
  </div>
</template>
<script>
  import Son from './son'
  export default {
    name: 'Father',
    components: { Son },
    data() {
      return {
        arr: [1, 2, 3],
      }
    },
    methods: {
      list() {
        console.log('list')
      },
    },
  }
</script>

子组件

<template>
  <div class="container">
    <div>我是子组件</div>
  </div>
</template>
<script>
  export default {
    name: 'Son',
    props: {
      arr: Array, //定义参数类型
      num: Number,
      str: String,
      str2: {
        type: String,
        default: '默认是字符串', //定义默认值
      },
      func: {
        type: Function,
        require: false, // 定义参数是否必须值
      },
      obj: {
        type: Object,
        require: false,
      },
    },
    created() {
      console.log(this.str) //字符串
      console.log(this.str2) //默认字符串
      console.log(this.num) //5
      console.log(this.arr) //[1,2,3]
      console.log(this.func()) // list
      console.log(this.obj) // name:'对象信息'
    },
  }
</script>

方法二 子组件向父组件传值 (事件传递)
父组件

<template>
  <div class="container">
    <div>我是父组件</div>
    <Son @func="speak" ></Son>
  </div>
</template>
<script>
  import Son from './son'
  export default {
    name: 'Father',
    components: { Son },
   
    methods: {
      speak(msg) {
        console.log(msg) //我是子组件发送的消息
      },
    },
  }
</script>

子组件

<template>
  <div class="container">
    <div>我是子组件</div>
  </div>
</template>
<script>
  export default {
    name: 'Son',
    mounted() {
      this.$emit('func', '我是子组件发送的消息!')
    },
  }
</script>

方法三 事件监听
父组件

<template>
  <div class="container">
    <div>我是父组件</div>
    <Son ref="son" ></Son>
  </div>
</template>
<script>
  import Son from './son'
  export default {
    name: 'Father',
    components: { Son },
   
   mounted() {
     this.$refs['son'].$on('func',(msg)=>{
         console.log(msg);  //我是子组件传递的消息
     })
   }
  }
</script>

子组件

<template>
  <div class="container">
    <div>我是子组件</div>
    <button @click="sendMsg">Send</button>
  </div>
</template>
<script>
  export default {
    name: 'Son',
    methods: {
      sendMsg() {
        this.$emit('func', '我是子组件传递的消息!')
      },
    },
  }
</script>

方法四 消息发布与订阅
安装pubsub-js插件: npm install pubsub-js -s //可实现全局参数传递

组件A

<template>
  <div class="container">
    <div>我是A组件</div>
    <button @click="sendMsg">Send</button>
  </div>
</template>
<script>
  import pubsub from 'pubsub-js'
  export default {
    name: 'A',
    methods: {
      sendMsg() {
        pubsub.publishSync('sendMsg', '这是A组件发布的消息!')
      },
    },
  }
</script>

组件B

<template>
  <div class="container">
    <div>我是B组件</div>
  </div>
</template>
<script>
  import pubsub from 'pubsub-js'
  export default {
    name: 'B',
    mounted() {
      pubsub.subscribe('sendMsg', (e, msg) => {
        console.log(e, msg) //sendMsg 这是A组件发布的消息!
      })
    },
  }
</script>

publishSync 同步发送消息
publish 同步发送消息
subscribe 订阅消息
unsubscribe 卸载特定订阅消息
clearAllSubscriptions 清除所有订阅消息

方法五 非父子组件传值 (EventBus传参)
在main.js中挂载全局EventBus
1.Vue.prototype.$EventBus = new Vue()

组件A

<template>
  <div class="container">
    <div>我是A组件</div>
    <button @click="sendMsg">send</button>
  </div>
</template>
<script>
  import Son from './son'
  export default {
    name: 'A',
    methods: {
      sendMsg() {
        this.$EventBus.$emit('sendMsg','这是A组件发送的消息!')
      }
    }
  }
</script>

组件B

<template>
    <div>
        <div>我是组件B</div>
    </div>
</template>
 
<script>
    export default {
        name: "B",
        mounted(){
            this.$EventBus.$on('sendMsg',(msg)=>{
                console.log(msg);//这是组件A发送的消息!
            })
        },
    }
</script>

通过挂载全局Vue对象传递参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值