vue2中兄弟组件通讯

方法一:(bus事件总线)推荐

一、 main.js

//创建vm
new Vue({
	el:'#app',
	render: h => h(App),
	beforeCreate() {
		Vue.prototype.$bus = this
	},
})

、App 搜索案例

APP组件
<template>
  <div class="app">
    <Search />
    <br />
    <hr />
    <List />
  </div>
</template>
<script>
import List from '@/components/List'
import Search from '@/components/search'
export default {
  name: 'App',
  components: { List, Search },
  data () {
    return {
      dataList: [],
    }
  }
}
</script>
<style>
.app {
  width: 90vw;
  margin: 20px auto;
}
</style>

、在Search组件中 通过this.$bus.$emit方法先提交一个bus事件

Search组件
<!--
 * @Description: 
 * @Author: Ran junlin
 * @Date: 2022-02-11 10:02:28
 * @LastEditTime: 2022-02-11 14:44:38
 * @LastEditors: Ran junlin
-->
<template>
  <div class="search">
    <input type="text" placeholder="请输入名称" v-model="keyWord" />
    <button @click="searchBtn">搜索</button>
  </div>
</template>

<script>
import axios from 'axios'
export default {
  name: 'Test',
  data () {
    return {
      keyWord: ''
    }
  },
  methods: {
    searchBtn () {
      if (this.keyWord.trim()) {
        this.$bus.$emit('updateListData', [], true, false)
        axios.get(`https://api.github.com/search/users?q=${this.keyWord}`).then(res => {
          this.$bus.$emit('updateListData', res.data.items, false, false)
        },
          error => {
            this.$bus.$emit('updateListData', [], false, false)
            console.log(error.message);
          }
        )
      }
    }
  },
}
</script>

<style scoped>
.search {
  width: 50%;
  margin: 0 auto;
}
input {
  width: 70%;
  height: 38px;
}
button {
  width: 60px;
  height: 38px;
  margin-left: 5px;
}
</style>

、List组件中挂载和调用方法

<!--
 * @Description: 
 * @Author: Ran junlin
 * @Date: 2022-02-11 10:02:28
 * @LastEditTime: 2022-02-11 14:45:15
 * @LastEditors: Ran junlin
-->
<template>
  <div class="List-content">
    <ul class="list" v-if="dataList.length">
      <li v-for="item in dataList" :key="item.id">
        <transition appear>
          <div class="user-item">
            <img class="img" :src="item.avatar_url" alt="" />
            <span class="name">{{ item.login }}</span>
          </div>
        </transition>
      </li>
    </ul>
    <div v-if="loading">loading...</div>
    <div v-if="isFirst">欢迎!</div>
  </div>
</template>

<script>
export default {
  name: 'List',
  data () {
    return {
      dataList: [],
      isFirst: true,
      loading: false
    }
  },
  mounted () {
    this.$bus.$on('updateListData', (dataList, loading, isFirst) => {
      this.dataList = dataList
      this.loading = loading
      this.isFirst = isFirst
    })
  },
}
</script>

<style scoped>
.v-enter-active {
  animation: myAn 0.5s linear;
}
.v-leave-active {
  animation: myAn 0.5s reverse;
}
@keyframes myAn {
  from {
    transform: translateY(-100%);
  }
  to {
    transform: translateY(0);
  }
}
.List-content {
  width: 80vw;
}
.list {
  box-shadow: 3px 2px 3px 1px #ccc;
  display: flex;
  justify-content: center;
  align-content: center;
  flex-wrap: wrap;
}
li {
  width: calc(100% / 3);
  height: 250px;
  list-style: none;
  margin: 10px auto;
  padding: 5px;
}
.img {
  width: 200px;
  height: 200px;
  border-radius: 50%;
}
.user-item {
  width: 100%;
  padding: 5px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-content: center;
  align-items: center;
  border: 1px solid rgb(230, 230, 230);
  border-radius: 9px;
}
.nodata {
  font-size: 24px;
  text-align: center;
  height: 200px;
  line-height: 200px;
  color: rgb(114, 109, 109);
}
</style>

二、 方法二:search传递给App父组件,父再传给list子组件(比较麻烦)

三、方法三(消息订阅与发布)

以pubsub中间件为例子

1.安装 npm i pubsub-js
2.引入 import pubsub from ‘pubsub-js’
3.search组件发布消息,使用 pubsub.publish(‘事件名’,参数)
4.list组件订阅

	this.dataList= pubsub.subscribe('事件',(msgName,参数)=>{
				console.log(this)
				// console.log('有人发布了hello消息,hello消息的回调执行了',msgName,data)
			})
		beforeDestroy() {
			// this.$bus.$off('hello')
			pubsub.unsubscribe(this.dataList)
		},
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue2兄弟组件之间的通信可以通过以下几种方式实现: 1. 使用事件总线(eventBus):创建一个Vue实例作为事件心,兄弟组件通过该事件心进行通信。需要在事件心实例上定义事件和对应的处理函数,在一个组件触发事件,另一个组件监听并处理该事件。 2. 使用Vuex:Vuex是Vue的官方状态管理库,可以在兄弟组件之间共享数据。在Vuex,将需要共享的数据存储在state,通过mutations进行修改,兄弟组件可以通过获取和修改state的数据来进行通信。 3. 使用provide/inject:provide和inject是Vue2提供的一种高级选项,可以在祖先组件通过provide提供数据,然后在后代组件通过inject注入并使用这些数据。 这些方法都可以实现兄弟组件之间的通信,具体选择哪种方法取决于你的应用场景和需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue实现的组件兄弟间通信功能示例](https://download.csdn.net/download/weixin_38528939/12949066)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Vue组件之间8通信方式](https://blog.csdn.net/u012260238/article/details/100056012)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值