项目问题汇总 bugs

关于 sass-loader 版本不同vue.config.js中css loaderOptions配置问题

sass-loader 版本不同, loaderOptions 中属性值不同:

sass-loader V8- data sass-loader V8 prependData sass-loader V10- additionalData

  css: {
    loaderOptions: {
      sass: {
        additionalData: "@import \"@/assets/styles/element-variables.scss\";"
      }
    }
  },

样式冲突

如下方式 import 引入的 index 样式会污染全局

/* 冲突 */
<style scoped> @import "./index.css"; </style>
/* 解决 */
<style src="./index.css"> </style>

| 返回上一页

$router.back(-1)

问题:当在portal中打开两个页签,在页签一操作列表到详情,从页签二操作另一列表到详情,再从页签一详情使用上述回退方法并不会返回页签一列表,而是会返回页签二列表

| 静态资源

public 里的静态图片替换不生效->修改文件名

| placeholder 垂直居中

当设置 input 的 placeholder 字体大小与 input 字体大小不一致的时候,placeholder 不能垂直居中。 解决:通过设置 placeholder 的 top

 input {
    &::placeholder {
      position: relative;
      top: -0.01rem;
    }
  }

| past 监听

document.getElementById("myInput").addEventListener("paste", function (e) {
  if (!(e.clipboardData && e.clipboardData.items)) {
    return;
  }
  for (var i = 0, len = e.clipboardData.items.length; i < len; i++) {
    var item = e.clipboardData.items[i];
    if (item.kind === "string") {
      // 复制字符串
      item.getAsString(function (str) {
        console.log(str);
      });
    } else if (item.kind === "file") {
      // 系统截图
      var f = item.getAsFile();
      console.log(f);
      var reader = new FileReader();
      reader.readAsDataURL(f);
      reader.onload = (result) => {
        console.log("reader.onload -> result", result);
        this.clipImgUrl = result.target.result; //获取到base64格式图片
        var image = new Image();
        image.src = this.clipImgUrl;
        image.onload = () => {
          console.log("image.onload -> e", image.width, image.height);
        };
      };
    }
  }
});

| $set

// 事例一:数组赋值
this.inList.map(item=>{
  item["outs"] = false
})
// 数据变化,视图不变
click(index){
  this.$set(this.inList[index],"outs", !this.inList[index].outs)
}
// 事例二:数组赋值
this.inList.map(item=>{
  this.$set(item,"outs", false)
})
// 数据变化,视图改变
click(index){
  this.$set(this.inList[index],"outs", !this.inList[index].outs)
}


// 事例三:数组赋值
list.map((ele, index) => {
  ele.outs = false;
})
this.inList = list; // 触发click,视图不变
this.inList = JSON.parse(JSON.stringify(list)); // 触发click,视图改变
click(index){
  this.$set(this.inList[index],"outs", !this.inList[index].outs)
}

| iview 表单校验

表单校验默认 String 类型,若未设置 type,获取数字、数组等类型,校验不通过 详见:表单校验

| v-for key 值引起的问题

注意:两层循环遍历时,要保持 key 值唯一。

| 禁止 IOS 长按弹出复制

input,
textarea {
  -webkit-user-select: auto;
  /*webkit浏览器*/
  -webkit-user-select: auto;
  /*webkit浏览器*/
  -webkit-touch-callout: none;
  /*系统默认菜单被禁用*/
  -webkit-user-select: none;
  /*webkit浏览器*/
  -khtml-user-select: none;
  /*早期浏览器*/
  -moz-user-select: none;
  /*火狐*/
  -ms-user-select: none;
  /*IE10*/
  user-select: none;
}

| 图片实现动画进度条

div.active {
  animation: loadingMove 2s linear infinite both;
}
/* 1.62rem 图片宽度 */
@keyframes loadingMove {
  0% {
    background-position: 0 0;
  }
  100% {
    background-position: 1.62rem 0;
  }
}

| 解决项目中图片路径不同,名称相同时,线上图片引用错误问题

{
    test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
    loader: 'url-loader',
    options: {
        limit: 10000,
        // name: utils.assetsPath('img/[name].[ext]')   修改前
        name: utils.assetsPath('img/[name].[hash:7].[ext]') // 修改后
    }
}

| JS 引入

在一个 js 文件引入另一个 js 文件 document.write("<script language=javascript src='http://pv.sohu.com/cityjson?ie=utf-8'></script>");

| 机型兼容

https 路径请求 http 接口,导致页面空白 IOS 弹性-滑倒底部,导致列表无法滑动 IOS 高版本-history.back() 返回不刷新页面

| 节流防抖

节流(throttle):指定时间内不允许再次触发(函数在一段时间内的多次调用,仅第一次有效)

防抖(debounce):函数在一段时间内的多次调用,仅使得最后一次调用有效。

// 节流时间戳版
function throttle(func, delay) {
    var last = 0;
    return function () {
        var now = Date.now();
        if (now >= delay + last) {
            func.apply(this, arguments);
            last = now;
        } else {
            console.log("距离上次调用的时间差不满足要求哦");
        }
    }
}
// 节流定时器版
function throttle(func, delay) {
    var timer = null;
    return function () {
        if (!timer) {
            func.apply(this, arguments);
            timer = setTimeout(() => {
                timer = null;
            }, delay);
        } else {
            console.log("上一个定时器尚未完成");
        }
    }
}

// 防抖
function debounce(func, delay) {
    var timeout;
    return function() {
        clearTimeout(timeout);
        timeout = setTimeout(()=>{
            func.apply(this, arguments);
        }, delay);
    }
}