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框架不自动渲染的情况。

总结

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

相关文章

  • 浅谈Vue2.0父子组件间事件派发机制

    浅谈Vue2.0父子组件间事件派发机制

    本篇文章主要介绍了浅谈Vue2.0父子组件间事件派发机制,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Vue CLI项目迁移eslint报错解决办法及最佳实践

    Vue CLI项目迁移eslint报错解决办法及最佳实践

    ESLint是一个ECMAScript/JavaScript语法规则和代码风格的检查工具,它的目标是保证代码的一致性和避免错误,这篇文章主要介绍了Vue CLI项目迁移eslint报错解决办法及最佳实践的相关资料,需要的朋友可以参考下
    2025-09-09
  • Vue Echarts实现柱形图从右向左滚动效果

    Vue Echarts实现柱形图从右向左滚动效果

    这篇文章主要为大家详细介绍了Vue如何利用Echarts实现柱形图从右向左滚动的效果,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-05-05
  • vue制作抓娃娃机的示例代码

    vue制作抓娃娃机的示例代码

    这篇文章主要介绍了vue制作抓娃娃机,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 详解Vue-cli 创建的项目如何跨域请求

    详解Vue-cli 创建的项目如何跨域请求

    本篇文章主要介绍了详解Vue-cli 创建的项目如何跨域请求 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • vue实现简单加法计算器

    vue实现简单加法计算器

    这篇文章主要为大家详细介绍了vue实现简单加法计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • Vue在echarts tooltip中添加点击事件案例详解

    Vue在echarts tooltip中添加点击事件案例详解

    本文主要介绍了Vue项目中在echarts tooltip添加点击事件的案例详解,代码具有一定的价值,感兴趣的小伙伴可以来学习一下
    2021-11-11
  • 修改vue+webpack run build的路径方法

    修改vue+webpack run build的路径方法

    今天小编就为大家分享一篇修改vue+webpack run build的路径方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • Vue dep.notify() 含义及作用详解

    Vue dep.notify() 含义及作用详解

    dep.notify() 是Vue2响应式系统中触发依赖更新的核心方法,也是理解Vue2 视图“自动更新”的关键,本文给大家介绍Vue dep.notify() 含义及作用,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Vue3+Swiper.js实现无缝轮播图组件的最佳实践

    Vue3+Swiper.js实现无缝轮播图组件的最佳实践

    vue是一款流行的前端框架,它提供了一系列的工具和组件,使得开发者可以更加便捷地创建交互式的Web应用程序,轮播图是Web应用程序中常见的一种交互式组件,这篇文章主要介绍了Vue3+Swiper.js实现无缝轮播图组件的最佳实践,需要的朋友可以参考下
    2026-04-04

最新评论