瀏覽代碼

工具函数深拷贝算法bug fix,不再拷贝引入WeakMap导致的匿名探针函数,以避免新增分组时报错。

(cherry picked from commit 94682dd2e9ac85f0ab326e8ebbd977004de4e00d)
任一存 3 年之前
父節點
當前提交
45e6e41919
共有 2 個文件被更改,包括 12 次插入7 次删除
  1. 1 1
      packages/qjkankan-editor/src/Store/index.js
  2. 11 6
      packages/qjkankan-editor/src/utils/other.js

+ 1 - 1
packages/qjkankan-editor/src/Store/index.js

@@ -45,7 +45,7 @@ const store = new Vuex.Store({
     isEditing: state => state.isEditing,
     info: state => state.info,
     catalogTopology: (state) => {
-      if (!state.info) {
+      if (!state.info || !state.info.catalogRoot || !state.info.catalogs) {
         return
       }
       //四层:root,level1(一级分类),level2(二级分类或直属于一级分类的场景), level3(场景)

+ 11 - 6
packages/qjkankan-editor/src/utils/other.js

@@ -79,7 +79,7 @@ export function isValidPhoneNumber(value) {
   return reg.test(value)
 }
 
-// 深拷贝
+// 深拷贝,为了解决循环引用和共同引用的问题,引入了WeakMap,又因为引入WeakMap可能会导致被拷贝对象被挂上【作为WeakMap的探针的】匿名函数(是pollyfill的行为吧?),所以不会拷贝非根元素的匿名函数。
 export function deepClone(target, hash = new WeakMap()) {
   // 定义一个变量
   let result = null
@@ -91,8 +91,10 @@ export function deepClone(target, hash = new WeakMap()) {
       result = [] // 将result赋值为一个数组,并且执行遍历
       hash.set(target, result)
       for (let i in target) {
-        // 递归克隆数组中的每一项
-        result.push(deepClone(target[i], hash))
+        if (!(typeof(target[i]) === 'function' && !target.name)) {
+          // 递归克隆数组中的每一项
+          result.push(deepClone(target[i], hash))
+        }
       }
       // 判断如果当前的值是null的话;直接赋值为null
     } else if (target === null) {
@@ -105,11 +107,14 @@ export function deepClone(target, hash = new WeakMap()) {
       result = {}
       hash.set(target, result)
       for (let i in target) {
-        result[i] = deepClone(target[i], hash)
+        if (!(typeof(target[i]) === 'function' && !target.name)) {
+          result[i] = deepClone(target[i], hash)
+        }
       }
     }
-    // 如果不是对象的话,就是基本数据类型,那么直接赋值
-  } else {
+  } else if (typeof target === 'function') {
+    result = target
+  } else { // 如果不是对象也不是函数,直接赋值
     result = target
   }
   // 返回最终结果