018、钩子函数 mounted和beforeDestroy、父组件向子组件传递参数 props 的使用

news2024/11/14 2:21:57

文章目录

  • 1、mounted 和 beforeDestroy
    • 1.1、mounted
    • 1.2、beforeDestroy
  • 2、父组件向子组件传递参数 props
    • 2.1、子组件定义
    • 2.2、父组件调用子组件并传参
  • 3、完整例子
    • 3.1、父组件 Tags.vue
    • 3.2、子组件 TagsMenu.vue
    • 3.3、效果图

1、mounted 和 beforeDestroy

1.1、mounted

mounted() 钩子函数在组件被挂载到 DOM 后调用。代码 document.addEventListener(“click”, this.closeMenu) 在组件挂载后,为整个文档添加了一个点击事件监听器,当用户在文档任何地方点击时,都会触发 this.closeMenu 方法。

<script>
  export default {
 mounted() {
      //动作
    },

1.2、beforeDestroy

beforeDestroy() 钩子函数在组件被销毁之前调用。代码 document.removeEventListener(“click”, this.closeMenu) 在组件销毁之前,移除之前添加的点击事件监听器,避免组件销毁后仍然存在监听器,导致潜在的错误或内存泄漏。

 <script>
  export default {
 beforeDestroy() {
       //动作
    },

2、父组件向子组件传递参数 props

2.1、子组件定义

<script>
  export default {
    props: ["clientX", "clientY", "clickIndex","tagsLength"],
    //其余内容略
    }

2.2、父组件调用子组件并传参

<template>
//其余略
<TagsMenu v-show="isShowTagsMenu" :clientX="clientX" :clientY="clientY" :clickIndex="clickIndex"
      :tagsLength="tags.length" />
      //其余略
</template>
<script>
  import TagsMenu from './TagsMenu.vue';
  //其余略

3、完整例子

3.1、父组件 Tags.vue

<template>
  <div class="tags">
    <!-- .native 用法:在 Vue.js 中,.native 修饰符用于监听原生 DOM 事件,而不是 Vue 组件的自定义事件。
    例如,@contextmenu.native="rightClick($event)"
    .prevent 阻止浏览器默认行为
    表示你希望监听原生的 contextmenu 事件(通常是右键点击),
    而不是 Vue 组件中可能定义的 contextmenu 事件。这在你想要直接处理 DOM 事件时非常有用,
    尤其是当组件内部没有提供相应的事件时。 -->
    <el-tag size="medium" :closable="index>0" v-for="item,index in tags" :key="item.path"
      :effect="item.title==$route.name?'dark':'plain'" @click="goTo(item.path)" @close="close(index)"
      :disable-transitions="true" @contextmenu.native.prevent="rightClick($event,index)">
      <i class="cir" v-show="item.title==$route.name"></i>
      {{item.title}}</el-tag>

    <TagsMenu v-show="isShowTagsMenu" :clientX="clientX" :clientY="clientY" :clickIndex="clickIndex"
      :tagsLength="tags.length" />
  </div>
</template>

<script>
  import TagsMenu from './TagsMenu.vue';
  export default {
    components: {
      TagsMenu
    },
    data() {
      return {
        tags: [{
          title: "layout",
          path: "/layout",
          isActive: true,
        }],
        isShowTagsMenu: false,
        clientX: 0,
        clientY: 0,
        clickIndex: 0,
      }
    },
    mounted() {
      document.addEventListener("click", this.closeMenu)
    },
    beforeDestroy() {
      document.removeEventListener("click", this.closeMenu)
    },
    methods: {
      closeMenu() {
        this.isShowTagsMenu = false
      },
      rightClick(e, i) {
        console.log("右键点击了", e.clientX, e.clientY, i);
        this.clientX = e.clientX;
        this.clientY = e.clientY;
        this.isShowTagsMenu = true;
        this.clickIndex = i;
        //关闭浏览器的默认行为
        window.event.returnValue = false;
        return false;
      },
      goTo(path) {
        this.$router.replace({
          path: (path == '/' || path == undefined ? '/Index' : path)
        });
      },
      close(index) {
        const name = this.tags[index].title;
        this.tags.splice(index, 1);
        if (this.tags.length == 0) return;
        //如果关闭当前页,则激活最后一个标签页
        const path = this.tags[this.tags.length - 1].path;
        if (name === this.$route.name && this.tags.length != 0) {
          this.$router.replace({
            path: (path == '/' || path == undefined ? '/Index' : path)
          });
        }

      }
    },
    watch: {
      $route: {
        immediate: true,
        handler(val, oldVal) {
          console.log(val);
          const bool = this.tags.find(item => {
            return item.path == val.path;
          });

          if (!bool) {
            this.tags.push({
              title: val.name,
              path: val.path
            });
          }

        }
      }
    }

  }
</script>

<style scoped>
  .tags {
    margin-top: 3px;
    /* 添加距离上边缘的距离 */
  }

  .tags .el-tag {
    padding-left: 10px;
    padding-top: 0px;
    margin-right: 5px;

    .cir {
      width: 8px;
      height: 8px;
      margin-right: 4px;
      background-color: #fff;
      border-radius: 50%;
      display: inline-block;
    }
  }
</style>

3.2、子组件 TagsMenu.vue

<template>
  <div class="tags-menu" :style="{left:clientX+'px',top:clientY+'px'}">
    <ul>
      <li v-for="item,index in tmenu" :key="index" v-show="isShowLi(index)">
        <i :class="item.icon"></i>
        {{item.text}}
      </li>
      <li>{{clientX+","+clickIndex}}</li>
    </ul>
  </div>
</template>

<script>
  export default {
    props: ["clientX", "clientY", "clickIndex","tagsLength"],
    methods: {
      isShowLi(i) {
        if(this.tagsLength===1){
          //只有首页
          return i===0;
        }
        if (this.clickIndex == 0) {
          return ![1, 3].includes(i)
        }
        if(this.clickIndex == 1 && this.clickIndex==this.tagsLength-1){
          return ![3,4].includes(i)
        }else if(this.clickIndex == 1 && this.clickIndex!=this.tagsLength-1){
          return ![3].includes(i)
        }else if(this.clickIndex==this.tagsLength-1){
          return ![4].includes(i)
        }
        return true;
      }
    },
    data() {
      return {
        tmenu: [{
            icon: "el-icon-refresh-right",
            text: "刷新页面"
          },
          {
            icon: "el-icon-close",
            text: "关闭当前"
          },
          {
            icon: "el-icon-circle-close",
            text: "关闭其他"
          },
          {
            icon: "el-icon-back",
            text: "关闭左侧"
          },
          {
            icon: "el-icon-right",
            text: "关闭右侧"
          },
          {
            icon: "el-icon-circle-close",
            text: "关闭全部"
          }
        ]
      }
    }
  }
</script>

<style>
  .tags-menu {
    position: absolute;
    z-index: 1000;
    /* 确保菜单在最上层 */
    background-color: white;
    /* 设置背景颜色为白色 */
    border: 1px solid #ddd;
    /* 添加边框 */
    border-radius: 4px;
    /* 圆角效果 */
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
    /* 添加阴影 */
    padding: 10px;
    /* 内边距 */
    min-width: 120px;
    /* 最小宽度 */
    /* 可选:添加过渡效果 */
    transition: opacity 0.2s ease;
  }

  .tags-menu ul {
    list-style: none;
    /* 去掉列表样式 */
    margin: 0;
    /* 去掉外边距 */
    padding: 0;
    /* 去掉内边距 */
  }

  .tags-menu li {
    padding: 8px 12px;
    /* 单个菜单项的内边距 */
    cursor: pointer;
    /* 鼠标悬停变成手指 */
    transition: background-color 0.2s;
    /* 添加过渡效果 */
  }

  .tags-menu li:hover {
    background-color: #f5f5f5;
    /* 悬停时的背景颜色 */
  }
</style>

3.3、效果图

在这里插入图片描述

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

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

相关文章

人类是怎样提取特征并学习和表达复杂的模式的?

人类提取特征、学习和表达复杂模式的过程涉及多方面的认知和神经机制。一些关键步骤和机制涉及&#xff1a; 感知是人类获取外部信息的过程。通过感官&#xff08;视觉、听觉、触觉等&#xff09;&#xff0c;人类可以接触到各种数据。注意力机制帮助我们从大量信息中筛选出重要…

Trying to Insert an input function using Python in OpenAI

题意&#xff1a;尝试在 OpenAI 中使用 Python 插入一个输入函数 问题背景&#xff1a; import os import openai openai.api_key API_Key Question "\\n\\nQ: input("Enter Question")?\\nA:", response openai.Completion.create( model"text-…

C++ 容器 deque(双端队列)

我们在学习之前的数据结构链表和顺序表的时候&#xff0c;发现顺序表插入删除慢&#xff0c;但是下标查找等速度快&#xff0c;链表下面查找等速度慢&#xff0c;但是插入删除快。它们互补。 那么我们是否可以将两个数据结构结合起来&#xff0c;产生一个完美的数据结构呢&…

LangChain与Elasticsearch向量数据库的完美结合

在过去的一年中&#xff0c;生成式 AI (Generative AI) 领域取得了显著的进展。许多新的服务和工具应运而生。其中&#xff0c;LangChain 已成为构建大语言模型 (LLM) 应用程序&#xff08;例如检索增强生成 (RAG) 系统&#xff09;最受欢迎的框架之一。该框架极大地简化了原型…

【网络安全】通过设备ID绕过双因素身份验证

未经许可,不得转载。 文章目录 正文正文 某站点登陆界面如下所示:https://redacted.com/login 输入正确的用户名密码并拦截登录请求,请求包如下: POST /api/authentication/login-2fa HTTP/1.1 Host: redacted.com Content-Length: 100 Sec-Ch-Ua: "Not)A;Brand&quo…

(南京观海微电子)——投影仪原理及使用介绍

投影仪 是一种用来放大显示图像的投影装置。目前已经应用于会议室演示以及在家庭中通过连接DVD影碟机等设备在大屏幕上观看电影。在电影院&#xff0c;也同样已开始取代老电影胶片的数码影院放映机&#xff0c;被用作面向硬盘数字数据的银幕。 投影仪的成像原理 首先&#xff…

这款新的 AI 工具会消灭 ChatGPT 吗?

随着大型语言模型 (LLM) 的出现&#xff0c;ChatGPT迅速成为全球计算机用户的家喻户晓的名字。这款由 OpenAI 设计的深度学习聊天机器人以知识宝库而闻名——一部互联网百科全书。 继ChatGPT的脚步之后&#xff0c;许多其他生成式AI工具也纷纷涌现。 2023 年 3 月&#xff0c;一…

大型、复杂、逼真的安全服和安全帽检测:SFCHD数据集和SCALE方法

智能守护工地安全&#xff1a;SFCHD数据集与SCALE模块介绍 在人工智能&#xff08;AI&#xff09;技术飞速发展的今天&#xff0c;其在建筑工地安全领域的应用正逐渐展现出巨大潜力。尤其是高风险行业如化工厂的施工现场&#xff0c;对工人的保护措施要求极为严格。个人防护装…

07、stm32外部中断

一、配置 二、代码 /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ uint8_t keyFalg 0; // 1按键被按下 /* USER CODE END PD *//* USER CODE BEGIN 4 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {if…

GStreamer 简明教程(三):动态调整 Pipeline

系列文章目录 GStreamer 简明教程&#xff08;一&#xff09;&#xff1a;环境搭建&#xff0c;运行 Basic Tutorial 1 Hello world! GStreamer 简明教程&#xff08;二&#xff09;&#xff1a;基本概念介绍&#xff0c;Element 和 Pipeline 文章目录 系列文章目录前言一、静…

windows11怎么加密?如何对win11系统文件进行加密?

“昔者&#xff0c;有物藏于室&#xff0c;恐人窥之&#xff0c;必施锁钥以护之。今之世&#xff0c;信息如海&#xff0c;数据若金&#xff0c;保护之责&#xff0c;重于泰山。Windows 11&#xff0c;微软之新篇&#xff0c;亦需加密之术&#xff0c;以护数据安全。” 本文将…

Golang | Leetcode Golang题解之第341题扁平化嵌套列表迭代器

题目&#xff1a; 题解&#xff1a; type NestedIterator struct {vals []int }func Constructor(nestedList []*NestedInteger) *NestedIterator {var vals []intvar dfs func([]*NestedInteger)dfs func(nestedList []*NestedInteger) {for _, nest : range nestedList {if…

期末速成复习资料——操作系统

体型&#xff1a;选择20判断10填空10*2简答4*5计算2*10 第一章 在一个计算机系统中&#xff0c;通常都含有多种硬件和软件资源。归纳起来可将这些资源分为四类&#xff1a;处理机、存储器、I/O设备以及文件&#xff08;数据和程序&#xff09;。相应地&#xff0c;OS的主要功能…

html中的<base>标签和 href属性的使用

先截图一个菜鸟教程的案例 说白了就是将本页面所有的URL前边都加上base标签后边的href中的内容即&#xff1a;

财务会计与管理会计(八)

文章目录 电商绩效工资计算IF函数的应用 参数表的格式转换INDEX、MATCH函数的应用 巧妙计算计件工资引出问题调整方案增加变量扩大范围 智能值班表VLOOKUP函数的使用方法 按照设备类别自动编号VLOOKUP、COUNTIF、TEXT函数的使用方法 多公司多月份损益汇总表OFFSET、INDIRECT函数…

154 · 正则表达式匹配

链接&#xff1a;LintCode 炼码 - 更高效的学习体验&#xff01; 题解&#xff1a; class Solution { public:/*** param s: A string * param p: A string includes "." and "*"* return: A boolean*/bool isMatch(string &s, string &p) {// w…

Unity求向量和平面的交点

已知条件&#xff1a;平面P的法向量&#xff0c;平面上的一点P0&#xff0c;直线L的方向向量&#xff0c;直线上的一点L0 公式推导&#xff1a; 主要是两点&#xff1a; 1.目标点T在直线上&#xff1a;TL0D*&#xff08;D未知&#xff09; 2.目标点T在平面上&#xff0c;则T…

Kubectl 常用命令汇总大全

kubectl 是 Kubernetes 自带的客户端&#xff0c;可以用它来直接操作 Kubernetes 集群。 从用户角度来说&#xff0c;kubectl 就是控制 Kubernetes 的驾驶舱&#xff0c;它允许你执行所有可能的 Kubernetes 操作&#xff1b;从技术角度来看&#xff0c;kubectl 就是 Kubernetes…

【JavaEE】一文学会如何使用:文件IO操作(详解)

目录 前言 什么是IO&#xff1f; IO流原理 IO流分类 InputStream字节流输入 文件输入流--FileInputStream 理解InputStream中的read方法 关闭文件操作 利用Scanner进行字符获取 OutputStream字节流输出 文件输出流--FileOutputStream 理解OutputStream中的…

计算机毕业设计选题推荐-在线学习平台-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…