vue实现右键点击弹框信息功能

 更新时间:2023年12月05日 10:21:01   作者:冷冷清清中的风风火火  
这篇文章主要介绍了vue实现右键点击弹框信息功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

vue右键点击弹框信息功能

当某个地方需要右键弹出信息,已供快速选择时,例如一些用到惯用语的地方。

在这里插入图片描述

输入框部分代码

      <el-row style="margin-top:50px">
        <el-col :span="24">
          <el-form-item label="意见"
                        prop="note1">
            <div v-click-outside>
              <div  @contextmenu.prevent="rightShow">
              <el-input type="textarea" :autosize="{ minRows: 4}" v-model="ruleForm.note1" @input="forceInput()" placeholder="请输入整改验收意见" ></el-input>
                <ul id="menu"  ref="msgRightMenu" v-show="isPersoncontextMenus">
                  <li @click.stop="selectPhrase(item)"
                  v-for="item in sceneList"
                  :key="item.id">{{ item.content}}</li>
                </ul>
              </div>
            </div>
          </el-form-item>
        </el-col>
      </el-row>
  showRightMenu: false,
  isPersoncontextMenus:false,
  sceneList:[]
// 位置在 export default {} 里,点击输入框外的地方会关闭弹窗
  directives: {
    clickOutside: {//自定义指令:clickOutside
      bind (el, bindings, vnode) {//自定义指令生命周期:bind ;参数:el, bindings, vnode
        let handler = (e) => {
          if (el.contains(e.target)) {
            if (!vnode.context.isPersoncontextMenus) {
              vnode.context.focus()
            }
          } else {
            if (vnode.context.isPersoncontextMenus) {
              vnode.context.blur()
            }
          }
        }
        el.handler = handler
        document.addEventListener('click', handler)
      },
      unbind (el) {//自定义指令生命周期:unbind
        document.removeEventListener('click', el.handler)
      }
    }
  },
    // methods
    rightShow() {
    let menu = this.$refs.msgRightMenu
    this.isPersoncontextMenus = true
    this.$post('/test/getList', {}, res => {
      if (res.success === true) {
        this.sceneList = res.data;
      } else {
        this.isCommiting = false
        this.isPersoncontextMenus = false
      }
    })
    var evt = event || window.event;
    var clientWidth = document.documentElement.clientWidth || document.body.clientWidth ;
    var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
    var clientHeight = document.documentElement.clientHeight || document.body.clientHeight ;
    var scrollTop = document.documentElement.scrollTop || document.body.scrollTop ;
    //给left和top分别赋值为鼠标的位置;
    menu.style.left = evt.pageX+"px";
    menu.style.top = evt.pageY+"px";
    //如果鼠标右边放不下菜单,就把left的值的改了
    if(evt.pageX+100>clientWidth+scrollLeft){//菜单应该在鼠标左边;
    var left1 = evt.pageX-100;
    menu.style.left = left1+"px";
    }
    //如果鼠标下边放不下菜单,就把top的值的改了
    if(evt.pageY+100>clientHeight+scrollTop){
    var top1 = (evt.pageY-100);
    menu.style.top = top1+"px";
    }
    menu.style.display = "block";
    },
    // 选择要用的常用语
    selectPhrase(item) {
      // if (item.content === '暂无惯用语') return
      this.ruleForm.note1 = item.content
      this.isPersoncontextMenus = false
    },
    // showNo(){
    //   console.log('showNo')
    //   console.log('showNossssssssssssssss')
    // let menu = this.$refs.msgRightMenu
    // menu.style.display = "none";
    // },
     focus () {
      this.isPersoncontextMenus = true
      let menu = this.$refs.msgRightMenu
      menu.style.display = "block";
    },
    blur () {
      this.isPersoncontextMenus = false
      let menu = this.$refs.msgRightMenu
      menu.style.display = "none";
    },

如果加完右键功能,发现该输入框或者的内容无法修改,也无法输入。

出现该问题的原因是

vue页面进行数据渲染时,层次嵌套或者多重数据绑定导致该组件信息框数据不能被Vue实时监听到,以此出现了数据发生改变但页面上更新或删除对应信息框的数据毫无反应的现象,此时需要强制更新,重新渲染。

可以在输入框添加@input=“forceInput()”,然后在methods中添加方法:

forceInput() {
  this.$forceUpdate();
},

forceUpdate用来强制渲染,避免data中对象层次太深,Vue框架不自动渲染的情况。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Nuxt 项目性能优化调研分析

    Nuxt 项目性能优化调研分析

    这篇文章主要介绍了Nuxt 项目性能优化调研分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • vue之el-tree懒加载数据并且实现树的过滤问题

    vue之el-tree懒加载数据并且实现树的过滤问题

    这篇文章主要介绍了vue之el-tree懒加载数据并且实现树的过滤问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 浅析vue-router实现原理及两种模式

    浅析vue-router实现原理及两种模式

    这篇文章主要介绍了vue-router实现原理及两种模式分析,给大家介绍了vue-router hash模式与history模式不同模式下处理逻辑,需要的朋友可以参考下
    2020-02-02
  • vue实现横向斜切柱状图

    vue实现横向斜切柱状图

    这篇文章主要为大家详细介绍了vue实现横向斜切柱状图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • vue将data恢复到初始状态 && 重新渲染组件实例

    vue将data恢复到初始状态 && 重新渲染组件实例

    这篇文章主要介绍了vue将data恢复到初始状态 && 重新渲染组件实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 解决vue-cli-service不是内部或外部命令也不是可运行的程序或批处理文件的报错问题

    解决vue-cli-service不是内部或外部命令也不是可运行的程序或批处理文件的报错问题

    这篇文章主要介绍了解决vue-cli-service不是内部或外部命令也不是可运行的程序或批处理文件的报错问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 在Vue中实现网页截图与截屏功能详解

    在Vue中实现网页截图与截屏功能详解

    在Web开发中,有时候需要对网页进行截图或截屏,Vue作为一个流行的JavaScript框架,提供了一些工具和库,可以方便地实现网页截图和截屏功能,本文将介绍如何在Vue中进行网页截图和截屏,需要的朋友可以参考下
    2023-06-06
  • Vue滚动页面到指定位置的实现及避坑

    Vue滚动页面到指定位置的实现及避坑

    这篇文章主要介绍了Vue滚动页面到指定位置的实现及避坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • element-ui实现表格边框的动态切换并防抖

    element-ui实现表格边框的动态切换并防抖

    这篇文章主要介绍了element-ui实现表格边框的动态切换并防抖方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Vue3实现Element Plus表格的多选功能与条件操作

    Vue3实现Element Plus表格的多选功能与条件操作

    Element-plus是ElementUI的升级版,是一套基于vue2与vue3的桌面端组件库,它提供了丰富的组件帮助开发人员快速构建功能强大、风格统一的页面,本文给大家介绍了Vue3实现Element Plus表格的多选功能与条件操作,需要的朋友可以参考下
    2024-08-08

最新评论