element-ui遇到的相关问题

608 阅读1分钟

1. 移动端用了elementUI的el-select的组件,苹果手机下拉框选项需要点击两次才能选中切换

问题一:移动端用了elementUI的el-select的组件,苹果手机下拉框选项需要点击两次才能选中切换。

在app.vue里面,(特备注意:注意是在app.vue里,不是在页面或者组件里!!!!),加上一段css代码。

.el-scrollbar {
    > .el-scrollbar__bar {
        opacity: 1 !important;
    }
}

2. el-select 多选 ,选择下拉内容后自动关闭

 <el-select 
    ref="multiSelect" 
    v-model="selectName" 
    filterable 
    multiple 
    value-key="userid" 
    @change="chooseCustom">
                   
        <el-option v-for="(item, index) in customList" 
            :key="index" 
            :label="item.username" 
            :value="item" 
        />
 
 </el-select>
chooseCustom(){
//调用element-ui select组件blur方法
//要包再timeout里面,直接调用不会关闭下拉框option
    setTimeout(() => {
        this.$refs.multiSelect.blur()
    }, 50)
}

3.vue-解决弹出蒙层滑动穿透问题

<!-- 列表 -->
    <div :class="{noScroll: isShowPopup}">
      <div class="item" v-for="num in 50" @click="itemClick(num)">
        <div style="width:100%">点击item{{num}}</div>
      </div>
    </div>

   <!-- 蒙层 -->
    <div v-if="isShowPopup" class="popup" @click="popUpEmptyClick()">
      <div class="message">
        <p class="message-title" v-for="num in 30" @click.stop="messageTitleClick(num)">
          消息提示 ,确认
        </p>
      </div>
    </div> 

解决办法: 给列表整个div动态绑定 .noScroll 后,底部列表照样可以滑动,所以考虑继续向上追溯。利用watch监听蒙层是否显示,当显示时,设置body相应样式;但蒙层消失时,body样式恢复。但是在vue里怎么操作body里,虽然vue是数据驱动的,不提倡直接操作Dom。但此刻我也是没什么好办法了,就直接操作Dom了。如下:

watch: {
    isShowPopup(newVal, oldVal) {
      if (newVal == true) {
        let cssStr = "overflow-y: hidden; height: 100%;";
        document.getElementsByTagName('html')[0].style.cssText = cssStr;
        document.body.style.cssText = cssStr;
      } else {
        let cssStr = "overflow-y: auto; height: auto;";
        document.getElementsByTagName('html')[0].style.cssText = cssStr;
        document.body.style.cssText = cssStr;
      }

      // 下面需要这两行代码,兼容不同浏览器
      document.body.scrollTop = this.pageScrollYoffset;
      window.scroll(0, this.pageScrollYoffset);
    }
  }

另一种方式是直接在method里面用addEventListen进行监听,采用方式如下

 。。。
 <template>
	 <div id="actPage"> 
		 <div v-if=rulesShow ></div>
	 </div>
</template>
 
 。。。
methods:{
//蒙层展示
    swiperStop() {
      this.rulesShow = true
      this.$nextTick(() => {
        this.disabledSrcoll()
      })
    },
	//置灰层停止穿透滑动
    disabledSrcoll() {
      document.getElementById('actPage').addEventListener('touchmove', this.lockBody)
    },
    //置灰层停止滑动
    lockBody(e) {
      // e.preventDefault && e.preventDefault();【这种方式会连着子元素的滚动一起滑动,如果无子元素滚动要求可以使用】
      document.body.style.overflow = 'hidden';
      document.getElementById('app').style.overflow = 'hidden';
      document.html.style.overflow = 'hidden';
    },
}

4. vue如何根据返回的值对元素进行样式渲染

在这里插入图片描述 在vue中的 export default 中的methods中进addclassStatus以及addclassPriority方法的计算和赋值 在这里插入图片描述

在css文件中定义css样式

在这里插入图片描述

5. el-input-number 没有值的情况下,默认值为0

解决办法:需要将默认值改为undefied,此刻输入框显示的值为空

<template>
  <el-input-number :value="num" @change="updateNum"></el-input-number>
</template>
 
<script>
export default {
  data() {
    return {
      num: undefined // 初始值设为null或undefined,表示默认值为空
    }
  },
  methods: {
  
    /** 处理修改时,数字框null 展示为0的问题 */
    numberToEmpty(data) {
      for (var index in data) {
        if (data[index] === null) {
          data[index] = undefined;
        }
      }
      return data;
    },
    updateNum(val) {
      this.num = val
    },
    getData () {
        getRecord(id).then(response => {
          this.form = this.numberToEmpty(response.data);
          this.open = true;
          this.title = "xx";
        });
    },
  }
}
</script>