首页 > 其他分享 >Vue3 webSocket收到消息改变响应式全局对象从而实时改变界面

Vue3 webSocket收到消息改变响应式全局对象从而实时改变界面

时间:2023-07-14 17:13:46浏览次数:42  
标签:userName function false isRegister globalData 改变 websock Vue3 webSocket

需求在 main.js 中 创建一个 响应式全局对象 。通过WebSocket收到消息 改变这个全局对象时 ,子组件应同步响应。

效果:这几个标签框 绑定的全局对象json

 

main.js

定义 响应式全局对象

//全局对象
const globalData=reactive({
    extTelMonitorData: [
    {
        title: '用户组一',
            list: [
                {
                    groupID: "0",
                    groupName: "All Users",
                    userDomain: "equiinet.cn",
                    userExten: "1000",
                    userID: "1",
                    userName: "刘亦菲",
                    isRegister: false,
                    callStatus:""
                },
                {
                    groupID: "0",
                    groupName: "All Users",
                    userDomain: "equiinet.cn",
                    userExten: "1001",
                    userID: "2",
                    userName: "娜然",
                    isRegister: false,
                    callStatus:""
                },
                {
                    groupID: "0",
                    groupName: "All Users",
                    userDomain: "equiinet.cn",
                    userExten: "1002",
                    userID: "3",
                    userName: "佟丽娅",
                    isRegister: false,
                    callStatus:""
                },
                {
                    groupID: "0",
                    groupName: "All Users",
                    userDomain: "equiinet.cn",
                    userExten: "1003",
                    userID: "3",
                    userName: "迪丽热巴",
                    isRegister: false,
                    callStatus:""
                }
                ]
            },
            {
                title: '用户组二',
                list: [
                {
                    userName: '张三',
                    number: 1003,
                    isRegister: false 
                },
                {
                    userName: '王一',
                    number: 1005,
                    isRegister: false 
                } 
            ]
            },
            {
                title: '用户组三',
                list: [
                {
                    userName: '刘中',
                    number: 1006,
                    isRegister: false 
                },
                {
                    userName: '李毅',
                    number: 1007,
                    isRegister: false 
                } 
                ]
            },
            {
                title: '全部分机',
                list: [
                {
                    userName: '李安',
                    number: 1008,
                    isRegister: false 
                },
                {
                    userName: '李毅',
                    number: 1009,
                    isRegister: false 
                    }
                ]
            }
    ] 
    ,
    var2: 'value2'
})
app.provide('globalData', globalData);

main.js 中 webSocket函数部分

import { createApp } from 'vue'
import { reactive } from 'vue'

import App from './App.vue'
import axios from 'axios'

let websock=null;
 
//createApp(App).mount('#app')
const app = createApp(App);
//------------------------weosocket------------------
function initWebSocket(){  

  const wsuri = "ws://192.168.1.120:5011/chat/";
  console.log("打开一个websocket " +wsuri); 

  websock = new WebSocket(wsuri);
  websock.onmessage =  websocketonmessage;
  websock.onopen =  websocketonopen;
  websock.onerror =  websocketonerror;
  websock.onclose =  websocketclose;
} 
function websocketonopen(){ //连接建立之后执行send方法发送数据
  //let actions = {"test":"12345"};
  //this.websocketsend(JSON.stringify(actions));
  let strMsg="@&l_login:1001,1001,1001";
  websocketsend(strMsg);
  console.log("连接建立成功 发 " +strMsg); 
} 
function websocketonerror(){//连接建立失败重连
  initWebSocket();
} 
function websocketonmessage(e){ //数据接收
  //const redata = JSON.parse(e.data);
  console.log("数据接收 " +e.data); 
  //接收
  websocket_resMsg(e.data);
} 
function websocketsend(Data){//数据发送
  websock.send(Data);
} 
function websocketclose(e){  //关闭
  console.log('断开连接',e);
} 
//-------------------------------------------------------

初始化

//初始化
async function init() {
   
  initWebSocket();
  app.config.globalProperties.$websock = websock;

}
//执行初始化
app.use(init);

app.mount('#app');

处理收到websocket消息

//分析websocket收到的消息
function websocket_resMsg(msg){
  let length = msg.length;  
  if(length>12){
    var msgType= msg.substr(0, 12);
    //分机状态 
    if(msgType=="ExtTelStatus"){
      var msgExtTelStatus= msg.substr(12);
        //globalData.extTelMonitorData=JSON.parse(msgExtTelStatus);
       //将字符串转为json对象  赋全局对象
       globalData.extTelMonitorData=eval('('+msgExtTelStatus+')');
         console.log('收到分机状态 '+ msgExtTelStatus);
    
    }
  }
}

子组件 ExtTelStatusComponent

<template>
<div class="IndConB flex" id="divExtTelStatus1"> 
    <el-row :gutter="74"  v-for="(dataItem, index) in globalData.extTelMonitorData[0].list" :key="index">
        <el-col :span="8">  
            <div style="width:190px;">
            <a href="javascript:;" class="IndCona"  >
                <div class="IndConaH flexC Huans" style="width:95%;"><img src="../assets/images/pic/phone01.png">
                    <p  >   {{dataItem.userExten}}</p></div>
                <div class="IndConaP" style="width:95%;">
                    <div class="IndConaPz Huans">名称: {{dataItem.userName}}</div>
                    <div class="IndConaPz Huans">状态: {{dataItem.callStatus}}</div>
                </div>
                <div class="IndConaF flexC fl-cen" style="width:95%;"><img src="../assets/images/pic/tanhao.png">
                    <p>{{dataItem.isRegister}}</p></div>
                
                <div class="IndConaD Huans">
                    <p>名称 : 调度电话</p>
                    <p>号码 : {{dataItem.userExten}}</p>
                    <p>状态 : {{dataItem.isRegister}}</p>
                    <p>分区 : {{dataItem.groupID}}</p>
                    <p>终端 : {{dataItem.userDomain}}</p>
                </div>
            </a>
            </div>
        </el-col>
         
    </el-row> 
    <a href="javascript:;" class="IndConFa flexC fl-cen" v-on:click="foot_calltel()"><p>测试一下</p></a>
</div>
</template>

<script>
// 在子组件中注入全局对象
import { inject, watch } from 'vue'

export default {
  // 组件名称
    name: 'ExtTelStatusComponent',
    data() {
        return {
       
        extensionMonitorDataA: [
        {
          title: '用户组一',
          list: [
          {
            groupID: "0",
            groupName: "All Users",
            userDomain: "equiinet.cn",
            userExten: "1000",
            userID: "1",
            userName: "11111",
            isRegister: false,
            callStatus:""
          },
          {
            groupID: "0",
            groupName: "All Users",
            userDomain: "equiinet.cn",
            userExten: "1001",
            userID: "2",
            userName: "22222",
            isRegister: false,
            callStatus:""
          }
        ]
        } 
       ] 
        };
    },
    setup() {
        // 注入全局对象
    const globalData = inject('globalData');
 
        watch(() => globalData.extTelMonitorData, (newValue) => {
            // 更新 
            globalData.extTelMonitorData=newValue;
            console.log("ExtTelStatusComponent watch "+globalData.extTelMonitorData[0].list);    
        })

return {
            globalData,
            handleClick
        };

        function handleClick() {
         
        }
  },

  mounted() {
      
   },
  methods: {
        foot_calltel(){
            console.log("foot_calltel "+ "");   
            this.globalData.extTelMonitorData=this.extensionMonitorDataA;
        }
 
    }
    
}
</script>

 

标签:userName,function,false,isRegister,globalData,改变,websock,Vue3,webSocket
From: https://www.cnblogs.com/hailexuexi/p/17554454.html

相关文章

  • Vue3 响应式全局对象
    需求在main.js中创建一个 响应式全局对象。改变这个全局对象时,子组件应同步响应。效果:这几个标签框绑定的全局对象jsonmain.js定义 响应式全局对象//全局对象constglobalData=reactive({extTelMonitorData:[{title:'用户组一',......
  • vite+vue3+minio
    之前h5用的minio上传文件,现在web端也需要用这个,但h5是用的vue2,web用的vue3,就出现了一些问题 架子是用的vite搭建的,但vite不支持require导入。用import的话minio不支持import引入,也会报错一.用vue2搭个项目,将minio通过require方式导入,再进行导出,上传npm,然后再npminstall......
  • Vue3+Vue-Router+TypeScript+Vite+Element-Plus+Axios+Pinia快速搭建开发框架
    1、环境准备(1)首先你得需要安装node和npm2、环境初始化(1)先随意找个文件夹,初始化vite#安装pnpmnpmi-gpnpm#初始化vitepnpmcreatevite#安装依赖pnpminstall(2)最后我们执行pnpmrundev3、安装插件(1)Eslint校验代码工具安装eslint#安装eslint......
  • 使用vue3、egg和SQLite开发通用管理后台系统
    使用vue3、egg和SQLite开发通用管理后台系统plaform是一个基于RBAC模型开发的后台管理系统,没有多余的功能。本项目是一个以学习为目的的后台项目,旨在让前端也能充分了解RBAC模型是如何设计的,不建议用于线上,因为未经过充分的测试。项目地址:https://github.com/essay-org/platform......
  • Vue3
    一、创建Vue3.0工程1.使用vue-cli创建官方文档:https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-create##查看@vue/cli版本,确保@vue/cli版本在4.5.0以上vue--version##安装或者升级你的@vue/clinpminstall-g@vue/cli##创建vuecreatevue_test##......
  • nginx部署 vue3 同时 配置接口代理(详细)
    Vue项目配置.env文件在项目根目录下创建文件夹(.env.production)##.env.production生产环境配置VUE_APP_SYS_URL=sysapi##nginx需要用的的代理表示VUE_APP_MODE=product##模式baseUrl使用VUE_APP_SYS_URL变量代替Nginx下载部署和配置api代理Nginx下载......
  • 接口返回数据后,将其渲染到swiper上,但样式没发生改变
    varswiper=newSwiper("#swiper1",{slidesPerView:3,observer:true,observeParents:true,grid:{rows:2,},spaceBetween:30,pagination:{el:".swiper-pagination",clickable:true,},}......
  • vue3核心概念-Mutation-辅助函数
    你可以在组件中使用 this.$store.commit('xxx') 提交mutation,或者使用 mapMutations 辅助函数将组件中的methods映射为 store.commit 调用(需要在根节点注入 store)辅助函数只能在选项式API中使用<template><h3>Nums</h3><p>{{getCount}}</p><inputtype="......
  • vue3 图片懒加载
    使用vue第三方库useIntersectionObserver创建文件directives/index.js导入第三方库import{useIntersectionObserver}from'@vueuse/core'exportconstlazyPlugin={install(app){app.directive('img-lazy',{mounted(el,binding){......
  • el-table点击行,改变行的背景色
    为了防止污染自组件的table,row,可以在::v-deep{}外层再加一个class::v-deep{.current-row{td{background-color:rgba(0,191,255,.35)!important;}}}https://blog.csdn.net/LH2HA3/article/details/127888560......