elementPlus中的Autocomplete弹出层错位问题解决分析

 更新时间:2023年07月25日 14:36:34   作者:水冗水孚  
这篇文章主要介绍了elementPlus中的Autocomplete弹出层错位问题解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

问题描述

  • 在饿了么UI中有一个Autocomplete搜索建议输入框组件,一般这个组件是用于做远程关联搜索的(类似百度一下咱们输入一个字,会提示出相关的选择建议)
  • 可是在某些情况下,这个Autocomplete组件的弹出层部分会出现错位的情况(Autocomplete组件 = 输入框部分 + 弹出层部分)
  • 就像下面的这个效果图

对于这样的错位问题,笔者提供一个偏向于源头的写法,能够快速解决问题

思路分析

  • 我们知道,就前端而言,弹出层是一个非常基础的效果功能
  • 目前市面上我们所使用的开源组件库的,但凡涉及到弹出层功能的,比如dropdownTooltipSelect的弹出层,基本上都是在Popper.js的基础之上封装的
  • vue2版本中vue团队基于Popper.js封装了一个vue-popper组件
  • 而饿了么团队又基于vue-popper组件去封装成各个带有弹出层的组件功能
  • PS:前端组件就是不停的封装(套壳子)...
  • 笔者也曾经基于vue-popper组件封装了一个属于自己的tooltip,大家有空了也可以点击链接去瞅瞅

文章地址:https://www.jb51.net/javascript/29319297k.htm

  • 既然Autocomplete组件的弹出层出现了错位的问题,那么本质上来说,还是源头上Popper.js的问题
  • 因为弹出层的位置,是Popper.js计算出来的
  • 所以,当弹出层位置错位的时候,我们只需要让Popper.js重新计算一下位置就能恢复正常了
  • Popper.js的源代码中有监听resize事件,从而计算出对应的弹出层位置

popper.js的源代码

笔者去github上扒了一下popper.js的源代码,简单截图如下:

所以解决方案就有啦...

解决方案

  • 当我们的弹出层位置不对的时候
  • 我们只需要再次派发一个resize事件即可
  • 因为Popper.js监听了resize事件,会自动计算的,相当于钩子函数
  • 需要让Popper.js重新计算一下就能“罗汉归位”
  • 如何去派发一个resize事件呢?很简单:

window.dispatchEvent(new Event('resize'))

window.dispatchEvent(new Event('resize'))

window.dispatchEvent(new Event('resize'))

比如以下代码demo:

const querySearchAsync = (queryString, cb) => {
    setTimeout(() => {
        let apiData = [
            {
                value: '孙悟空',
                id: '111'
            },
            {
                value: '猪八戒',
                id: '222'
            },
            {
                value: '沙和尚',
                id: '333'
            },
        ]
        cb(apiData)
        // 解决el-autocomplete弹出建议层错位问题(poper.js就是监听resize事件重新计算dom位置的)
        window.dispatchEvent(new Event('resize'))
    }, 340);
}

 注意,要在合适的时机去派发resize事件哦

以上就是elementPlus中的Autocomplete弹出层错位问题解决分析的详细内容,更多关于elementPlus Autocomplete弹出层错位的资料请关注脚本之家其它相关文章!

相关文章

  • vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法

    vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法

    今天小编就为大家分享一篇vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • 一文带你掌握vue3中侦听器的使用

    一文带你掌握vue3中侦听器的使用

    侦听器和计算属性都可以用于侦听响应式数据的变化,如果需要在数据变化后执行操作,修改依赖项,那么就应该使用侦听器,下面就跟随小编一起来学习一下vue3中侦听器的使用吧
    2023-09-09
  • vue移动端实现手机左右滑动入场动画

    vue移动端实现手机左右滑动入场动画

    这篇文章主要为大家详细介绍了vue移动端实现手机左右滑动入场动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • element-ui图像组件、上传组件以及分页组件实现代码

    element-ui图像组件、上传组件以及分页组件实现代码

    工作中碰到需要多图上传,在使用element-ui解决过程中碰到一些问题,在这里分享给大家,这篇文章主要给大家介绍了关于element-ui图像组件、上传组件以及分页组件实现的相关资料,需要的朋友可以参考下
    2024-02-02
  • 优雅地使用loading(推荐)

    优雅地使用loading(推荐)

    这篇文章主要介绍了在Vue和React中如何优雅地使用loading,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • vue项目检测依赖包是否有使用的问题

    vue项目检测依赖包是否有使用的问题

    这篇文章主要介绍了vue项目检测依赖包是否有使用的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Vue 实现一个命令式弹窗组件功能

    Vue 实现一个命令式弹窗组件功能

    这篇文章主要介绍了vue实现命令式弹窗组件功能,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • 五分钟搞懂Vuex实用知识(小结)

    五分钟搞懂Vuex实用知识(小结)

    本篇文章主要介绍了五分钟搞懂Vuex实用知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 深入理解Vue.js3中Reactive的实现

    深入理解Vue.js3中Reactive的实现

    reactive是Vue 3的Composition API中的一个函数,它允许你创建一个响应式的数据对象,本文主要介绍了深入理解Vue.js3中Reactive的实现,感兴趣的可以了解一下
    2024-01-01
  • vuex中commit和dispatch的区别解析

    vuex中commit和dispatch的区别解析

    commit 和dispatch的区别在于commit是提交mutatious的同步操作,dispatch是分发actions的异步操作,本文重点给大家讲解vuex中commit和dispatch的区别,感兴趣的朋友一起看看吧
    2024-06-06

最新评论