记录一下工作遇到的bug

1、在跨域的情况下没有办法拿到 response 的 headers X-AUTH-TOKEN

在后台设置允许跨域之后 response 的 headers 里边有很多东西已经拿不到了

2、jsplumb 的label 冲突

在做jsPlumb 项目的时候,我在某个页面中设置了 ConnectionOverlays 这个属性,导致代码冲突,想了很多办法,

分析原因:我是把ConnectionOverlays放在了实例上,导致全局也都有这个覆盖物,把ConnectionOverlays 换成 overlays 之后 全局是没有问题了,但是 makeSource 的连线覆盖物没有了,最后得知 makeSource 不能使用 overlays属性。

最后结果是 全局使用 overlays 属性, makeSource 使用 把ConnectionOverlays 解决了问题

this.instance = jsPlumb.getInstance({
      overlays: [
        [
          "Custom",
          {
            create: function(component) {
              return $("");
            },
            location: 0.5,
            id: "customOverlay"
          }
        ],
      ]
      
// 所有节点创建 source
      this.instance.makeSource(nodeId, {
        filter: ":not(span)",   // 除了这个标签以外的设置连线
        filterExclude: true,
        connectorOverlays: [], // 在这里写入要覆盖的内容
        extract: {
          action: "the-action"
        }
      }, this.common);
});
复制代码

3、事件优化小知识点

场景: 点击按钮查找 某个ul 下 li 列表个数,然后添加点击事件,点击 li 列表处理自己的逻辑,每点击一次都会给 li 累加一次事件,会造成冗余。所以需要在 点击完 li 之后需要把 事件卸载掉。

这里给的是 jsPlumb 的时间处理,但是在JavaScript中所有的事件都是一样的

this.flowId = jsPlumb.getSelector(".flowId");
if (this.flowId.length === 0) {
  return;
}
for (let i = 0; i < this.flowId.length; i++) {
  // 以下使用 箭头函数 防止 this 的指向改变
  this.flowId[i].onclick = () => {
    this.datasetInstance.bind("click", c => {
      console.log(this.flowId)
      // 给每个 flowId 添加完事件之后,需要移除事件,否则给当前元素添加多个事件
      this.datasetInstance.unbind("click");
    });
  };
}
复制代码

3、constructor 一个值 .constructor 的时候 console.log() 竟然没起作用

场景:在做一个容错处理的函数, 参数是一个 undefined 的值

export const checkfiled = (value, array) => {
  console.error(array.__proto__.constructor == Array)
}
// 原因是 array 传进来的是 undefined
复制代码

4、jsplumb 在 dom 位置发生变化 jsplumb 监听不到,所以连线位置不对。

场景:点击做按钮查找parent 的关系,展示parent,相反查找 children, 但是按钮盒子的位置变化了,连线位置没有变化。

因为jsplumb 连线的时候 是记录的source 和 target 分别是 nodeId,当你在传入相同的 source 和 target jsplumb 认为是同一条线,不会重新绘制。这个问题困绕我一整天的时间,在同事的帮忙下才解决的,因为国内关于这个介绍的很少,没有看到类似的问题,但是我相信肯定有这样的API,于是让我同事用英文的方式进行搜索。

instance.reset() 清除jsplumb的所有连线关系,相当于清楚 jsPlumb 的连线缓存

this.$nextTick(() => {
    
    this.datasetInstance.reset()
    jsPlumb.batch(() => {
      this.datasetEdges.forEach(item => {
      this.datasetInstance.connect({
          source: item.source,
          target: item.target,
          overlays: [
          ], 
        }, this.datasetCommon);
      });
    },true)
});
复制代码

5、Vue params 和 query 的 区别

首先 params 和 query 都是路由跳转时 传递参数使用使用的,但是他们也有不同之处

1、params 不会再地址栏显示, 而 query 会在地址栏显示

2、params 在刷新页面的时候路由内容消失, query 则可以刷新页面

6、v-model 监听 对象属性, 但是默认 对象属性又不存在的现象, 不会有双向数据绑定

    "tableProfile[value.name].partitionKey" placeholder="请选择">
    // 但是对象刚开始是空的
    data () {
        return {
            tableProfile: {},
        }
    },
    // 我们在 created 的时候 给 tableProfile赋值
    created () {
         for (let value of this.options) {
         // 这样 在 v-model 的时候 是不能实现双向数据绑定的
            this.tableProfile[value.name] = {
                tableName: "",
                partitionKey: "",
                timeColumn: ""
            }
        }
    }
    // 正确做法
    created () {
         for (let value of this.options) {
            // 这样 在 v-model 的时候 是不能实现双向数据绑定的
            this.$set(this.tableProfile, value.name, {
                tableName: "",
                partitionKey: "",
                timeColumn: ""
            })
        }
    }

复制代码

6、使用 import() 函数需要的配置

1、安装cnpm install babel-plugin-syntax-dynamic-import -D

2、配置 .babelrc 文件

{
  "presets": [
    [
      "babel-preset-env", {
        "targets": {
          "browsers": [">1%"]
        }
      }]
    ],
    "plugins": [
      "transform-runtime",
      // 需要 在这里加上 异步的配置
      "syntax-dynamic-import"
    ]
}
复制代码

转载于:https://juejin.im/post/5bead0056fb9a049e82b0f3c

你可能感兴趣的:(记录一下工作遇到的bug)