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实现分割验证码效果

    vue实现分割验证码效果

    这篇文章主要为大家详细介绍了vue实现分割验证码效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 详解Vue中watch的详细用法

    详解Vue中watch的详细用法

    在vue中,使用watch来响应数据的变化。watch的用法大致有三种。下面代码是watch的一种简单的用法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-11-11
  • vue+electron 自动更新的实现代码

    vue+electron 自动更新的实现代码

    这篇文章主要介绍了vue+electron 自动更新的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-02-02
  • vue.js修改el-popover组件显示位置

    vue.js修改el-popover组件显示位置

    el-popover是一个基于element-ui框架设计的,用于浮动展示提示或菜单的UI组件,下面这篇文章主要给大家介绍了关于vue.js修改el-popover组件显示位置的相关资料,需要的朋友可以参考下
    2023-06-06
  • 巧用Vue.js+Vuex制作专门收藏微信公众号的app

    巧用Vue.js+Vuex制作专门收藏微信公众号的app

    这篇文章主要为大家详细介绍了vue自定义指令三步如何实现数据拉取更新,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • vue2项目中封装echarts地图的优雅方法

    vue2项目中封装echarts地图的优雅方法

    这篇文章主要给大家介绍了关于vue2项目中封装echarts地图的优雅方法,需要的朋友可以参考下
    2022-03-03
  • 基于ant-design-vue实现表格操作按钮组件

    基于ant-design-vue实现表格操作按钮组件

    这篇文章主要为大家介绍了基于ant-design-vue实现表格操作按钮组件示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Vue使用Ref跨层级获取组件的步骤

    Vue使用Ref跨层级获取组件的步骤

    这篇文章主要介绍了Vue使用Ref跨层级获取组件的步骤,帮助大家更好的理解和使用vue框架,感兴趣的朋友可以了解下
    2021-01-01
  • vue通过子组件修改父组件prop的多种实现方式

    vue通过子组件修改父组件prop的多种实现方式

    这篇文章主要介绍了vue通过子组件修改父组件prop的几种实现方式,比较常用的方式是通过Prop单向传递的规则,需要的朋友可以参考下
    2021-09-09

最新评论