Vue2 消息订阅与发布

news2024/11/16 9:30:56

1.pubsub-js 第三方库实现

实现任何框架的消息订阅发布

npm i pubsub-js

<template>
  <div class="student">
    <h2>展示学生的名称:{{ name }}</h2>
    <h2>展示学生的性别:{{ sex }}</h2>
  </div>
</template>

<script>
import pubsub from "pubsub-js";

export default {
  name: "MyStudentt",
  data() {
    //这里存放数据
    return {
      name: "我是一个人",
      sex: 12,
    };
  },
  mounted() {
    // console.log(this.$refs.school1.__proto__===this.$refs.school2.__proto__);//true
    //   this.$bus.$on("show", (data)=>{
    //     console.log('事件总线收到了数据',data); 两个都生效
    //     this.name = data;
    //   });
    //  this.$bus.$on("show", (data)=>{
    //     console.log('事件总线收到了数据1',data);
    //     this.sex = data;
    //   });
    //订阅一个消息 show 是一个主题
   const pubId =  pubsub.subscribe("show", (msg, data) => {
      //消费者
      console.log("有人发布了消息,show消息回调成功", data);
      this.name = data;
    });

   this.pubId = pubId;
    //   pubsub.subscribe('show',(msg,data)=>{//消费者
    //   console.log('有人发布了消息,show消息回调成功',data);
    //   this.sex = data;
    // })
  },
  beforeDestroy() {
    // this.$bus.$off("show");

    pubsub.unsubscribe(this.pubId);
  },
};
</script>

<style scoped>
.student {
  background-color: green;
  padding: 5px;
  margin-top: 30px;
}
</style>
<template>
  <div class="school">
    <h2 >展示学校的名称:{{name}}</h2>
    <h2>展示学校的地址:{{ address }}</h2>
    <button @click="show">传入事件总线数据</button>
  </div>
</template>

<script>


import pubsub from 'pubsub-js';

export default {
  name: "MySchool",
  data() {
    //这里存放数据
    return {
      name: "辽工",
      address: "锦州",
    };
  },
  methods:{
      show(){
          // this.$bus.$emit('show',this.name);
          pubsub.publish('show',this.name);
      }




  }
  

};
</script>
<style scoped>

  .school{
    background-color: red;
    padding: 5px;
     margin-top: 30px;
  }

</style>
<template>
  <div class="app">
    <h1>{{ msg }}</h1>
    <Student ref="student"/>
    <MySchool ref="school"/>
  </div>
</template>

<script>
//引入School组件 随便起名字
import Student from "./components/Student.vue";
import MySchool from "./components/School.vue"; 

export default {
  name: "App",
  components: {
    Student,
    MySchool,
  },
  data() {
    return {
      msg: "你好啊!",
    };
  },
  mounted(){
  
  }
};
</script>

<style scoped>
.app {
  background-color: gray;
  padding: 5px;
}
</style>

2.$nextTick

<template>
  <div
    id="container"
    @mouseover="handleMouseOver"
    @mouseleave="handleMouseLeave"
  >
    <div id="d">
      <input type="checkbox" v-model="todo.done" />

      <span @click="info" v-show="!todo.showUpdate">{{ todo.title }}</span>
        
      <!-- v-inputfocus="todo.showUpdate" -->
      <input
        type="text"
        ref="updateInput"
        v-model="updateTitle"
        @keyup.enter="submitUpdate"
        @blur="cancelUpdate"
        v-show="todo.showUpdate"
      />
    </div>
    <div>
      <button class="btn update" v-show="showDelete" @click="updateTodo">
        修改
      </button>
      <button class="btn" v-show="showDelete" @click="deleteTodo">删除</button>
    </div>
  </div>
</template>

<script>
import pubsub from "pubsub-js";

export default {
  name: "TodoItem",
  data() {
    return {
      todo: this.todoObj,
      updateTitle: "",
      showDelete: false,
    };
  },
  methods: {

    //todo.hasOwnProperty这个属性是否有api  
    removeFocus() {
      //  this.$refs.updateInput.blur();
    },
    info() {
      console.log(this.todo);
    },
    handleMouseOver() {
      this.showDelete = true;
    },
    handleMouseLeave() {
      this.showDelete = false;
    },
    deleteTodo() {
      //  let a = this.$bus.$emit('removeTodo',this.todoObj.id)
      //  console.log(a===this.$bus);//a === vm

      if (confirm("你确定要删除吗?")) {
        pubsub.publish("removeTodo", this.todoObj.id);
      }
    },
    updateTodo() {
      if (this.todo.showUpdate) {
        this.todo.showUpdate = false;
      } else {
        this.updateTitle = this.todo.title;
        // this.$bus.$emit("updateTodoInputShow", this.todoObj.id, true);
        this.todo.showUpdate = true;
        //vue 提供api 在下次dom节点更新完毕后执行的回调
        this.$nextTick(function(){
          this.$refs.updateInput.focus();
          // console.log(this.$refs.updateInput);
        });

      }
      //vue 是等方法结束以后才回去解析模板, input框 focus 在display状态是不会聚焦的
    },

    submitUpdate() {
      if (confirm("你确定要保存吗?")) {
        if(this.updateTitle.trim()===''){
          alert('输入不能为空')
          return;
        }
        this.$bus.$emit("updateTodo", this.todo.id, this.updateTitle);
      }
      this.todo.showUpdate = false;
    },
    cancelUpdate() {
      this.todo.showUpdate = false;
    },
  },
  props: {
    todoObj: {
      //传入的若是引用对象 则里面修改了,外面同样生效
      type: Object,
      required: true,
    },
  },
  directives: {
    // inputfocus(e,v){
    //   if (v) {
    //       e.focus();
    //     }
    // }
    // inputfocus: {
    //   inserted(element, value) {
    //     if (value) {
    //       element.focus();
    //     }
    //   },
    //   update(element, value) {
    //     if (value) {
    //       element.focus();
    //     }
    //   },
    // },
  },
};
</script>

<style scoped>
#container:hover {
  background-color: #a09a9a;
}

#container {
  display: flex;
  justify-content: space-between; /*  水平居左 */
  align-items: center; /* 垂直居中 */
  width: 500px;
  height: 30px;
  border: 0.1px solid #ccc;
  border-radius: 2px;
  padding-left: 10px;
  padding-top: 5px;
  padding-bottom: 5px;
}

#container * {
  padding: 5px;
}

.btn {
  width: 50px;
  height: 28px;
  color: white;
  background-color: #eb1212;
  border: 1px solid #ccc;
  border-radius: 5px;
  padding: 5px;
  margin-right: 15px;
  cursor: pointer; /* 鼠标悬停时显示手型光标 */
  transition: background-color 0.3s ease; /* 平滑过渡 */
}
.btn:hover {
  background-color: #d10d0d; /* 鼠标悬停时颜色变化 */
}

.btn:active {
  background-color: #a00; /* 按下时颜色变化 */
  transform: translateY(2px); /* 按下时按钮下移效果 */
}

.update {
  background-color: #1233eb;
  margin-right: 5px;
}
.update:hover {
  background-color: #4e70dc; /* 鼠标悬停时颜色变化 */
}
.update:active {
  background-color: rgb(71, 0, 170); /* 按下时颜色变化 */
  transform: translateY(2px); /* 按下时按钮下移效果 */
}
</style>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2043185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浏览器插件利器--allWebPluginV2.0.0.16-Stable版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

ollama使用llama3.1案例

ollama安装和运行llama3.1 8b conda create -n ollama python3.11 -y conda activate ollama curl -fsSL https://ollama.com/install.sh | sh ollama run songfy/llama3.1:8b 就这么简单就能运行起来了. 我们可以在命令行中与他交互. 当然我们也可以用接口访问: curl http:…

在IDEA中用自带的数据库 连接 redis 失败(JedisAccessControlException)

文章目录 1、问题出现的背景2、分析问题出现的原因3、解决办法不用输入用户名直接输入密码即可 1、问题出现的背景 redis.clients.jedis.exceptions.JedisAccessControlException: WRONGPASS invalid username-password pair or user is disabled.2、分析问题出现的原因 查看…

智慧水务项目(六)PyScada学习一,初步建立项目并测试

一、说明 Pyscada是scada的python实现&#xff0c;需要学习一下&#xff0c;以备不时之需&#xff0c;目前我的想法是用他来模拟opc数据&#xff0c;毕竟我准备做的项目需要系统与scada通过opc进行通信&#xff0c;正好做一个简单的scada系统 是一个开源的SCADA&#xff08;S…

记录|C#主界面设计【Web风格】

目录 前言一、页面效果二、布局设计2.1 左边菜单栏搭建框架Step1. panelMenu &#xff1a;Step2. panelLogoStep3. button模板Step4. 复制buttonStep5. 微调Button 2.2 界面颜色变换Step1. ThemeColor类Step2. From1.csStep3. 更换按钮点击颜色效果 2.3 按钮点击事件2.4 顶部ti…

十、Linux二进制安装ClickHouse集群(含rpm安装)

目录 十、Linux二进制安装ClickHouse集群(含rpm安装&#xff0c;单机版使用rpm&#xff0c;集群使用tar包安装方式)1 部署前服务器配置&#xff08;集群的话三台都要配置&#xff09;1.2 配置hosts文件1.3 打开文件数限制1.4 取消 SELINUX1.5 禁用透明大页 2 下载所需文件2.1 t…

24/8/14算法笔记 复习_支持向量机svc

支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种强大的监督学习模型&#xff0c;用于分类、回归甚至异常检测。它基于统计学习理论&#xff0c;特别关注找到数据的最佳分隔超平面。 import numpy as np import matplotlib.pyplot as pltfrom sklearn.sv…

vue3 antdv a-datepicker 修改datepicker 的panel宽度,初始弹出一些正常,但再次弹出,宽度就再次变小的解决

1、展示页面的框架结构&#xff1a; 2、然后&#xff0c;我们上二张图对比一下&#xff1a; 图1-1 需要的效果图&#xff1a; 图1-2 对比一下图1-1与图1-2&#xff0c;我们就会发现图1-1中的农历&#xff0c;换行显示了&#xff0c;第二张是有效的。 3、我们修改样式&#x…

秋招突击——8/15——知识补充——垃圾回收机制

文章目录 引言正文指针引用可达性分析算法垃圾回收算法标记清除算法标记整理算法复制分代收集 垃圾收集器Serial收集器ParNew并行收集器Parallel Scavenge吞吐量优先收集器Serial Old老年代收集器Parallel old收集器CMS收集器G1收集器&#xff08;Garbage First垃圾优先&#x…

关于堆的介绍

1.堆的概念及结构 如果有一个关键码的集合&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中&#xff0c;并满足&#xff1a;且则称为小堆&#xff08;或大堆&#xff09;。将根节点最大的堆叫做最大堆或者大根堆&#xff0c;根节点最小的堆叫做最小…

【Linux】:进程控制(创建、终止、等待、替换)

目录 1.进程创建 2.进程终止&#xff08;退出&#xff09; 2.1 什么是进程终止 2.2 进程退出的场景&#xff08;原因&#xff09; 2.3 进程退出码 2.4 错误码errno 2.5 进程常见的退出方法 正常终止 从main函数返回 调用库函数exit 系统接口_exit 3.进程等待 3.1 …

【Linux】简易线程池项目

线程池是一个可以巩固一些线程相关接口 && 加强理解的一个小项目。 注意&#xff1a;这里的线程池使用的线程并不是Linux原生接口&#xff0c;而是经过封装的&#xff0c;具体请看线程封装&#xff0c;为什么不使用原生接口&#xff1f; 因为原生接口一旦进行pthread…

2024最新easyrecovery 14中文破解版图文教程

使用EasyRecovery易恢复进行数据恢复非常简单。首先&#xff0c;用户需要选择需要恢复的数据类型&#xff0c;如文档、图片、视频等。然后&#xff0c;软件会对选定的存储设备进行全面扫描&#xff0c;以寻找可恢复的数据。在扫描过程中&#xff0c;用户可以预览部分已找到的文…

成化瓷器“制字衣横少越刀”--还有例外

孙瀛洲先生关于成化款瓷器的名言非常经典&#xff0c;但是&#xff0c;凡事总有以外。 图1&#xff0c;本人收藏成化斗彩鸡缸杯底款&#xff0c;制字的衣横越过双勾刀。 下面是两件台北故宫成化瓷器底款&#xff0c;制字下面的衣横也是越过刀了。 所以&#xff0c;凡事总有例外…

mysql5.7安装

1.创建一个software文件 2.先下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 3安装源包 rpm -ivh mysql-community-release-el7-5.noarch.rpm 可能会报错 改成命令 rpm -ivh mysql-community-release-el7-5.noarch.rpm --nodeps…

优化图像处理:从旋转与缩放到水印添加

1. 旋转与缩放的仿射变换 在 OpenCV 中&#xff0c;cv2.getRotationMatrix2D() 函数可以生成旋转矩阵&#xff0c;该矩阵用于对图像进行旋转和缩放变换。旋转矩阵的主要参数是&#xff1a; Center&#xff1a;旋转中心点的坐标 (x, y)。 Angle&#xff1a;旋转角度&#xff0…

数据结构与算法--图的应用

文章目录 回顾提要连通图生成树最小生成树构造最小生成树的算法普里姆(Prim)算法克鲁斯卡尔(Kruskal)算法 最短路径狄杰斯特拉 (Dijkstra) 算法当前最短路径的更新拓扑排序拓扑排序方法拓扑排序示例总结 回顾 图的遍历方法&#xff1a; 深度优先遍历 (DFS)&#xff1a;从任意…

在centos7安装mysql

1.卸载旧环境 ps axj | grep mysql ps axj | grep mariabd 如果是这样就什么都不需要做。 如果不是 2.检查并卸载系统安装包 //检查安装包 rpm -qa | grep mysql//卸载安装包 rpm -qa | grep mysql | xargs yum -y remove 3.安装官方yum源 先查看系统的版本 比如我是7.9版…

力扣高频SQL 50题(基础版)第四十题之1164. 指定日期的产品价格

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第四十题1164. 指定日期的产品价格题目说明实现过程准备数据实现方式结果截图总结FIRST_VALUE()函数LAST_VALUE()函数NTH_VALUE()函数 LAST_VALUE()函数NTH_VALUE()函数 力扣高频SQL 50题&#xff08;基础版&#xff0…

YJ0043定制版抖音电商卷抢购系统带回收商城抖音电商优惠卷投资理财系统

系统是基于逍遥商城二开的系统&#xff0c;pc手机端都新增了邀请码验证 手机端重新定制的UI&#xff0c;前端产品不至于抖音卷也可以自行更改其他产品 用户前端下单&#xff0c;后台订单可以直接回收&#xff0c;后台支持设置默认邀请码和抢卷时间限制