el-select选择器或date-picker,time-picker日期选择的下拉选项框点开时,点击浏览器返回上一步后,显示在上一个网页左上角【ElementUI】

环境:ElementUI+vue3+setup语法+ts(typescript,js的超集)

(一)、bug重现:

自己搭了个简单的页面,如下:【源码在本文最下方

 点开弹窗:

 第一步:点击下拉框

第二步:点击左上角返回一步 

可以看到bug出现 :

仅适用于返回一步之后路由会出现变化的情况!!

(二)、分析bug出现原因

打开F12调试,会发现元素中出现了不该出现的东西:

 同时发现,这里的下拉框的div定位为absolute,没有写top,left之类的属性,那它的默认值就是0,absolute为绝对定位,是按照最近父元素边框border最内侧定位的,在没有给定非static祖先元素定位的时候,定位是按照html边框border最外侧定位。

所以,此时的下拉框div位置才会在左上角。

所以,撸一下完整的逻辑是这样的:打开弹窗->点开下拉框->下拉框的div元素插入到当前网页中->返回上一步->下拉框的元素并未销毁,留在了上一个网页中,并由于定位问题,出现在了左上角

(如果路由不变化,不会出现这种问题)

(三)、如何解决

我们的需求是:关闭弹窗时 弹窗中已打开的东西也一并关闭销毁。

这时候就需要用到el-select的一个属性popper-append-to-body 或 teleported

 顺便贴一下官网地址:一个 Vue 3 UI 框架 | Element Plus

此时只需要在el-select中添加一句: :teleported="false" 即可

<el-select v-model="value" class="m-2" placeholder="Select" size="large" :teleported="false">
          <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-select>

再做同样操作,发现元素已被销毁,网页正常显示,bug解决 :

TIP:以下为源码

//router/index.ts

import { createRouter, createWebHistory } from 'vue-router'
import Home from '@/views//HomePage.vue'
import Dialog from '@/views/dialog.vue'

const routes = [
  {
    path: '/',
    name: 'home',
    component:()=>Home
  },{
    path: '/dialog',
    name: 'dialog',
    component:()=>Dialog
  }
]

const router = createRouter({
  history: createWebHistory(),
  routes
})

export default router
<!-- views/HomePage.vue --> 

<template>
  <div>
    <el-button @click="next">下一界面</el-button>

  </div>
</template>
  
<script lang="ts" setup>
import router from '@/router';


const next = () => {
  router.push('dialog')
}
</script>
 
<style lang="less" scoped></style>
<!-- views/dialog.vue -->
<template>
  <div>
    <el-dialog title="新界面" width="30%" destroy-on-close center v-model="dialogVisible">

      <div style="height:300px;width:600px">
        <strong>返回上一步,多选框/单选框的下拉选项信息,浮窗显示在系统左上角</strong>
        <el-select v-model="value" class="m-2" placeholder="Select" size="large" :teleported="false">
          <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
        </el-select>
      </div>
      <template #footer>
        <span class="dialog-footer">
          <el-button @click="close">Cancel</el-button>
          <el-button type="primary">
            Confirm
          </el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
  
<script lang="ts" setup>
import router from '@/router';


const value = ref('')
const dialogVisible = ref(true)

const options = [
  {
    value: 'Option1',
    label: 'Option1',
  },
  {
    value: 'Option2',
    label: 'Option2',
  },
  {
    value: 'Option3',
    label: 'Option3',
  },
  {
    value: 'Option4',
    label: 'Option4',
  },
  {
    value: 'Option5',
    label: 'Option5',
  },
]

const close = () => {
  router.push('/')
  dialogVisible.value = false
}
</script>
 
<style lang="less" scoped></style>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
el-select选择器Vue2.0 Element-UI中的一个组件,用于创建下拉选择框。当选择的内容发生改变后,会触发selectMethod事件。 在element-ui V2.2.3中,有时候el-select选择器无法正确显示选中的内容。为了解决这个问题,可以尝试以下方法: 1. 确保options选项中的数据格式正确,每个选项都有label和value属性。如果数据格式不正确,选择器就无法正常显示选中的内容。 2. 可以更新element-ui的版本到最新的稳定版本,以确保解决了可能存在的bug。 3. 如果以上方法都无效,可以尝试使用其它类似的组件或自定义一个下拉选择框来替代el-select选择器。 以下是一个示例代码,用于创建一个el-select选择器,并显示选中的内容: ```html <template> <div> <el-select v-model="selectedValue" placeholder="请选择" @change="selectMethod"> <el-option v-for="(item, index) in options" :key="index" :label="item.label" :value="item.value"></el-option> </el-select> <div>选中的内容: {{selectedValue}}</div> </div> </template> <script> export default { data() { return { options: [ { label: '选项1', value: 'option1' }, { label: '选项2', value: 'option2' }, { label: '选项3', value: 'option3' } ], selectedValue: '' }; }, methods: { selectMethod() { // 处理选中内容改变后的逻辑 } } }; </script> ``` 在这个示例代码中,我们使用了el-select选择器el-option组件来创建一个下拉选择框,并在选项改变时触发了selectMethod方法。选中的内容会通过v-model绑定到selectedValue属性上,然后显示在页面上。你可以根据自己的需求修改选项的label和value属性,并在selectMethod方法中处理选中内容改变后的逻辑。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [vue中使用el-select选择器组件,基础组件用法和多选组件搭配使用](https://blog.csdn.net/weixin_56818823/article/details/125506475)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)](https://download.csdn.net/download/weixin_38685694/12953562)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值