当前位置: 首页 > 知识库问答 >
问题:

javascript - 这种场景,如何设计 vue 主页面分发消息给子组件?

糜单弓
2024-02-03

vue 项目, 有多个主页面,这里用 Home.vue About.vue 模拟

每个主页面内部有一个 websocket
且有多个不同层级的子组件,这里用 HellowWorld.vue模拟

每当主页面收到 websocket 消息的时候,通过某种方式通知到子组件

我目前的方案

  • Home.vue

    <template><div class="home">  <HelloWorld msg="Welcome to Your Vue.js App"/>  <el-button @click="send('home')">home</el-button></div></template><script>import HelloWorld from '@/components/HelloWorld.vue'export default {name: 'Home',components: {  HelloWorld},data () {  return {    wsChildren: []  }},provide () {  return {    ipcRoot: this  }},methods: {  send (data) {    this.wsChildren.forEach(vm => vm.onWsMessage(data))  }}}</script>
  • About.vue

    <template><div class="about">  <img alt="Vue logo" src="../assets/logo.png">  <HelloWorld msg="Welcome to Your Vue.js App"/>  <el-button @click="send('about')">about</el-button></div></template><script>// @ is an alias to /srcimport HelloWorld from '@/components/HelloWorld.vue'export default {name: 'About',components: {  HelloWorld},data () {  return {    wsChildren: []  }},methods: {  send (data) {    this.wsChildren.forEach(vm => vm.onWsMessage(data))  }}}</script>
  • HelloWorld.vue

    <template><div class="hello">  child</div></template><script>export default {name: 'HelloWorld',inject: {  ipcRoot: {    default: null // 提供默认值为 null,当没有找到 ipcRoot 时使用  }},mounted () {  if (this.ipcRoot && this.ipcRoot.wsChildren) {    this.ipcRoot.wsChildren.push(this)  }},methods: {  onWsMessage (data) {    console.log('__SY__�� ~ HelloWorld onWsMessage ~ data:', data)  }}}</script>

也就是当子组件挂载完成后,主页面主动收集,然后通过遍历去分发消息,这种模式以后的维护性如何?

请问各位到老有没有更好的方式,虚心求教!!!

共有1个答案

蓟安歌
2024-02-03

可以使用 vuex 或者 EventBus

EventBus为例,创建一个新的 vue 实例,通过全局注册,让所有 vue 都能访问到同一个实例,然后通过 $emit$on 做到跨页面、跨层级的事件监听。

只需要在要分发数据的文件中调用 this.$bus.$emit('onMsg', msg),需要监听的文件在 mounted 周期中注册监听事件 this.$bus.$on('onMsg', function(msg))即可。

记得在页面卸载时调用 this.$bus.$off('onMsg', function(msg))关闭监听,不然可能会有重复监听的问题。

bus.js

import vue from 'vue'export default new vue()

main.js

import Bus from './bus'vue.prototype.$bus = Bus

主页面

this.$bus.$emit('事件名', '数据')

子组件

this.$bus.$on('事件名', function() => {})
 类似资料:
  • 比如我创建了几个指令 v-number,v-text 来限制输入不同的文本 此时我遍历生成子组件的时候,要根据不同的type来配置不一样的指令,这个需求要如何实现? 如果我的指令还包含参数,比如可以通过下面不同的字段 v-input:number、v-input:text 在指令内部进行处理 但是主要问题还是在于动态渲染组件的时候如何动态配置不同的指令,以及指令不同的传参?

  • 面试体验是面过的所有大厂中最好的 全部流程走完1个月,流程一共四面:专业面,专业面,经理面,hr面 具体过程: 一面(约30min) 1.自我介绍 2.提问 ①DCC软件的使用情况(什么软件以及熟练程度) ②之前的游戏项目场景设计工作是怎样展开的 ③平时玩什么游戏,怎么协调玩游戏和学习? ④自我学习的路径和流程是怎样的? ④自身游戏引擎的使用情况 ⑤会不会自己写shader ⑥未来职业规划 ⑦你有

  • 接口说明 设置场景的基本信息,其中包括名称、说明、标签 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/scene/1.0.0/set 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 id string form 是 场景ID title string form 是 场景名称 descript str

  • 请问各路大佬,这种图怎么做 尝试了各种方案,效果都差强人意,有没有组件可以借鉴的,分支图。

  • 接口说明 获取场景分享信息 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 GET /wish3dearth/api/scene/share/v1.0.0/getShareInfo 是否需要登录 否 请求字段说明 参数 类型 请求类型 是否必须 说明 shareId string query 是 场景分享ID 响应字段说明 参数 类型 说明