非父子组件通信

非父子组件通信有以下两种方式:中间人模式 && bus中央总线

<!-- child1 && child2都是组件,并且他们组件之间没有嵌套关系,这种情况下child1和child2需要进行通信,我们称之为非父子组件通信-->
<div id="box">
  <child1></child1>
  <child2></child2>
</div>

中间人模式

两个组件A,B没有办法通信。我们采用一个中间组件C,让A先和C通信,得到数据后,再由C传递给B

案例:

  1. film-item组件先通过子传父,将数据传到父组件
    this.$emit(“callback”,this.item.synopsis)
  2. 父组件接受数据,并传递给film-detail子组件
    handleCallBack(data){ this.detailInfo = data }
<div id="box">
   <button @click="handleAjax">ajax</button>
   <film-item v-for="item in datalist" :key="item.filmId" :item="item"  @callback="handleCallBack"></film-item>
   <film-detail :myinfo="detailInfo"></film-detail>
</div>
Vue.component("film-detail",{
    props:["myinfo"],/// this.myinfo myinof
    template:`
        <div class="filminfo">
            {{myinfo}}
        </div>
    `
})

Vue.component("film-item",{
    props:["item"],//接受属性, this.item
    template:`
        <div class="item">
            <img :src="item.poster"/>
            <div>{{item.name}}</div>
            <button @click="handleDetail">详情</button>   
        </div>
    `,
    methods:{
        handleDetail(){
            // console.log(this.item.synopsis)
            this.$emit("callback",this.item.synopsis)
        }
    }
})

new Vue({
   el:"#box",
    data:{
        datalist:[],
        detailInfo:""
    },
    methods:{
        handleAjax(){
            fetch("json/test.json").then(res=>res.json())
            .then(res=>{
                // console.log(res)
                this.datalist = res.data.films
            })
        },
        handleCallBack(data){
            // console.log("父组件触发",data)
            this.detailInfo = data
        }
    }
})

bus中央总线

一个组件负责监听bus.$on,一个组件负责触发bus.$emit
mounted生命周期中进行监听

<div id="box">
   <button @click="handleAjax">ajax</button>
   <film-item v-for="item in datalist" :key="item.filmId" :item="item"></film-item>
   <film-detail></film-detail>
</div>
var bus = new Vue() //中央事件总线
Vue.component("film-detail",{  
  template:`
      <div class="filminfo">
         {{info}}
      </div>
  `,
  data(){
      return {
          info:""
      }
  },
  // 8个生命周期 ---mounted
  mounted(){
      console.log("mounted","当前挂载到页面上就会执行")
      bus.$on("kerwin",(data)=>{
          // console.log("kerwin事件",data)
          this.info = data
      })
  }
})

Vue.component("film-item",{
  props:["item"],//接受属性, this.item
  template:`
      <div class="item">
          <img :src="item.poster"/>
          <div>{{item.name}}</div>
          <button @click="handleDetail">详情</button>   
      </div>
  `,
  methods:{
      handleDetail(){
          bus.$emit("kerwin", this.item.synopsis)
      }
  }
})
new Vue({
  el:"#box",
  data:{
      datalist:[],
  },
  methods:{
      handleAjax(){
          fetch("json/test.json").then(res=>res.json())
          .then(res=>{
              this.datalist = res.data.films
          })
      }
  }
})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值