组件之间的传值

1. 子组件传父组件  

子组件

<li class="smaili" v-for="(item,index) in MonitorList" :key="index"> 
                            <input type="checkbox" id="jack" :value="item.monitoringPointName" v-model="checkedNames">
                            <label class="oneMenuChild" for="jack"  @click="sendMsg(item.monitoringPointAddress)">{{item.monitoringPointName}}</label>
                        </li>
  @click="sendMsg(item.monitoringPointAddress)点击子组件的时候传值给父组件
sendMsg(videoUrl){
      // this.$emit('getVideoUrl',videoUrl)
      this.$emit('getVideoUrl',videoUrl)
      
    }

父组件接收

<div class="jkmenuaaa" >
      <jkmenu @getVideoUrl="videoUrlFn" ref="sun"/>    //对应子组件自动执行getVideoUrl
 </div>
    videoUrlFn(data){
            console.log(data)
            this.monitorUrl = data
            this.videoPlay()
        },
     let chil = this.$refs.sun //父组件可以通过$refs拿到子组件的对象,然后直接调用子组件methods里的方法和data里的数据

 

2. 父组件传子组件 

父组件

:currScenicId="currid" //要传递的数据
 <div class="pop_con">
                <yjyd1 class="con" :currScenicId="currid" v-show="iconNowIndex===2"/>
                <yjyd2 class="con" v-show="iconNowIndex===0"/>
            </div>

子组件

export default{
  props: ['currScenicId']
}

  

全局事件实现兄弟组件传参(也适用于父子关系的传参)

  $emit('自定义事件名',  要传送的数据)

  $on('对应自定义事件名',  回调函数)

  home.vue中引入a和b组件,  实现a.vue向b.vue传送一句话

  main.js 挂载$bus

new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>',
  beforeCreate(){
    Vue.prototype.$bus = this  //通过全局事件传参
  }
})

  home.vue

<template>
  <div>
    <com1></com1>
    <com2></com2>
  </div>
</template>

<script>
import com1 from '@/components/components/a.vue'
import com2 from '@/components/components/b.vue'
export default {
  name: 'HelloWorld',
  components: {
    com1,com2
  },
  data () {
    return {
    }
  }
}
</script>

  a.vue

<template>
    <div>
        <h3 @click="showName('name111111')">name1</h3>
        <div>{{name}}</div>
        <div @click="sendMessage()">向b传送数据</div>
    </div>
</template>
<script>
import {minxinName} from '@/mixin.js'
    export default {
        mixins: [minxinName],
        data(){
            return{
                name
            }
        },
        methods: {
            sendMessage(){
                    this.$bus.$emit('toB', '暗恋不是一个人的事情')
                }
        }
    }
</script>

  b.vue

<template>
    <div>
        <h3 @click="showName('name222222')">name2</h3>
        <div>{{name}}</div>
        <div>获取a页面中的数据:{{getToB}}</div>
    </div>
</template>
<script>
import {minxinName} from '@/mixin.js'
    export default {
        mixins: [minxinName],
        data(){
            return{
                name,
                getToB: ''
            }
        },
        mounted(){
            console.log(this)
            this.$bus.$on('toB',(data)=>{
                this.getToB = data
                })
        },
        beforeDestroy(){
            this.$bus.$off('toB')    //用完以后销毁toB
        }
    }
</script>

 

 

 

 

*a, b页面中同时实现混入功能(相同的事件功能)*

  src下新建mixin.js

export let minxinName = {
    methods: {
        showName: function (name1){
            this.name = name1
        }
    }
}

 

 

 

 

posted @ 2019-11-29 16:23  番茄西红柿u  阅读(277)  评论(0编辑  收藏  举报