VUE+ElementUI dialog打开时禁止iOS端的body滚动

 

现象:

在原生app中嵌套web页面时,时常会遇到由于系统不同带来的差异。

此次引入ElementUI,使用其中的dialog组件时,明明默认dialog显示时,body不能滚动:

element UI 文档

安卓和pc下没毛病,但在iOS下lock-scroll无效,dialog背后的body依然可以滚动。

 

 

解决方法:

思路:

      主要是在打开dialog时设置html的

      position:fixed;

      scroll:no;

      overflow:hidden;(以防万一,加上)

 

      dialog关闭时:

      position:relative;

      scroll:yes;

      overflow:scroll;

实践:

1.添加lock和unlock方法(这里是加在了公共方法util.js里,以便各个组件都可以使用,也可以直接写在各个component的method里):

function lock() {

  document.documentElement.style.overflow = "hidden";

  document.documentElement.style.position = "fixed";

  document.body.scroll = "no"; 

}



function unLock() {

  document.documentElement.style.overflow = "scroll";

  document.documentElement.style.position = "relative";

  document.body.scroll = "yes";

}

2.在组件中引入js,watch监听dialog显示的参数,当dialog显示时调用lock方法,dialog隐藏时调用unlock方法:

<el-dialog

        title="test dialog"

        :visible.sync="centerDialogVisible"

      >

        <div class="testBox">

          Test

        </div>

      </el-dialog>



import util from "../util";

 watch: {

    centerDialogVisible(val) {

      if (val === true) {

        util.lock();

      } else {

        util.unLock();

      }

    }

}


  

问题发生原因:

主要是overflow:hidden在iOS下会失效,而查看ElementUI源码可以看到,lockscroll参数做的事,主要就是给body的overflow加hidden值。

lock-scroll参数指向的js方法

js添加的class的样式

最后:

如果有更棒的解决方法,欢迎指教!

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VueElementUI中,禁止缓存可以使用以下方法: 1. 使用路由配置 在路由配置中使用“meta”字段来定义一个布尔值,表示是否需要在每次路由切换刷新页面。例如: ```javascript const router = new VueRouter({ routes: [ { path: '/foo', component: Foo, meta: { refresh: true // 禁止缓存 } }, { path: '/bar', component: Bar } ] }) ``` 然后在组件中使用“created”钩子函数来检查路由的“meta”字段,如果需要刷新页面,则使用“location.reload()”方法来刷新页面。例如: ```javascript export default { created() { if (this.$route.meta.refresh) { location.reload(); } } } ``` 2. 使用ElementUI控件 在ElementUI中,可以使用“el-tabs”控件来禁止缓存。使用“v-if”指令来动态地创建和销毁“el-tab-pane”控件。例如: ```html <template> <el-tabs v-model="activeName" type="card"> <el-tab-pane v-for="(item, index) in tabs" :key="index" :label="item.label" :name="item.name" v-if="isActive(item)"> <div>{{ item.content }}</div> </el-tab-pane> </el-tabs> </template> <script> export default { data() { return { activeName: 'tab1', tabs: [ { label: 'Tab 1', name: 'tab1', content: 'Content of Tab 1' }, { label: 'Tab 2', name: 'tab2', content: 'Content of Tab 2' }, { label: 'Tab 3', name: 'tab3', content: 'Content of Tab 3' } ] }; }, methods: { isActive(item) { return this.activeName === item.name; } } }; </script> ``` 在“isActive”方法中,检查当前选中的标签是否与当前的“el-tab-pane”控件匹配。如果匹配,则返回“true”,否则返回“false”。这样,每次切换标签Vue会重新创建和销毁“el-tab-pane”控件,从而禁止缓存。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值