214 lines
4.6 KiB
JavaScript
214 lines
4.6 KiB
JavaScript
// #ifdef H5
|
|
// import { sortChildren } from '../../common/dom/vnodes-h5';
|
|
// #endif
|
|
// #ifndef H5
|
|
// import { sortMPChildren } from '../../common/dom/vnodes-mp';
|
|
// #endif
|
|
|
|
function findNearListParent(children = [], name) {
|
|
let temp;
|
|
for (const item of children) {
|
|
// console.log('__nodeId__', item, item.$options.name, parentRelationKey, thisRelationKey);
|
|
const parentRelationKey = item.$props && item.$props.relationKey;
|
|
const thisRelationKey = this.$props && this.$props.relationKey;
|
|
if (item.$options.name === name && parentRelationKey === thisRelationKey) {
|
|
temp = item;
|
|
}
|
|
if (item === this && temp) {
|
|
// console.log('item === this', item);
|
|
return temp;
|
|
}
|
|
const foundInChildren = findNearListParent.call(this, item.$children, name);
|
|
if (foundInChildren) {
|
|
return foundInChildren;
|
|
}
|
|
}
|
|
|
|
return temp;
|
|
}
|
|
|
|
|
|
function getParentInToutiao(name) {
|
|
let parent = this.$parent;
|
|
if (!parent) {
|
|
const pages = getCurrentPages();
|
|
parent = pages[pages.length - 1]?.$vm;
|
|
}
|
|
|
|
if (parent && !parent.$parent) {
|
|
const children = parent.$children;
|
|
if (!children || !children.length) return;
|
|
const result = findNearListParent.call(this, children, name);
|
|
// const result2 = children.find(item => item.$options.name === name);
|
|
// console.log('result2', result2, result2.__nodeId__);
|
|
// console.log('result', result, result.__nodeId__);
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
function getParent(name = '') {
|
|
const found = getParentInToutiao.call(this, name);
|
|
if (found) {
|
|
return found;
|
|
}
|
|
|
|
let parent = this.$parent;
|
|
|
|
if (!parent) {
|
|
return;
|
|
}
|
|
|
|
let parentName = parent.$options.name;
|
|
while (parentName !== name) {
|
|
parent = parent.$parent;
|
|
if (!parent) return false;
|
|
parentName = parent.$options.name;
|
|
}
|
|
return parent;
|
|
}
|
|
|
|
|
|
export function ChildrenMixin(parent, options = {}) {
|
|
const indexKey = options.indexKey || 'index';
|
|
|
|
return {
|
|
inject: {
|
|
// #ifndef MP-TOUTIAO
|
|
[parent]: {
|
|
default: null,
|
|
},
|
|
// #endif
|
|
},
|
|
data() {
|
|
return {
|
|
// #ifdef MP-TOUTIAO
|
|
[parent]: null,
|
|
// #endif
|
|
};
|
|
},
|
|
computed: {
|
|
// 会造成循环引用
|
|
// parent() {
|
|
// if (this.disableBindRelation) {
|
|
// return null;
|
|
// }
|
|
|
|
// return this[parent];
|
|
// },
|
|
|
|
[indexKey]() {
|
|
const that = this;
|
|
|
|
that.bindRelation();
|
|
|
|
if (that[parent]) {
|
|
return that[parent].children.indexOf(this);
|
|
}
|
|
|
|
return null;
|
|
},
|
|
},
|
|
|
|
watch: {
|
|
disableBindRelation(val) {
|
|
const that = this;
|
|
if (!val) {
|
|
that.bindRelation();
|
|
}
|
|
},
|
|
},
|
|
|
|
created() {
|
|
// 循环引用调试代码
|
|
// this[parent].children.push(this);
|
|
// #ifndef H5
|
|
const that = this;
|
|
that.bindRelation();
|
|
// #endif
|
|
},
|
|
|
|
|
|
mounted() {
|
|
// #ifdef H5
|
|
const that = this;
|
|
that.bindRelation();
|
|
// #endif
|
|
},
|
|
|
|
// #ifdef VUE2
|
|
beforeDestroy() {
|
|
const that = this;
|
|
that.onBeforeMount();
|
|
},
|
|
// #endif
|
|
|
|
// #ifdef VUE3
|
|
beforeUnmount() {
|
|
const that = this;
|
|
that.onBeforeMount();
|
|
},
|
|
// #endif
|
|
|
|
methods: {
|
|
bindRelation() {
|
|
// #ifdef MP-TOUTIAO
|
|
const parentComponentName = `T${parent}`;
|
|
this[parent] = getParent.call(this, parentComponentName);
|
|
// #endif
|
|
if (!this[parent] || (this[parent].children && this[parent].children.indexOf(this) !== -1)) {
|
|
return;
|
|
}
|
|
|
|
const children = [...(this[parent].children || []), this];
|
|
|
|
|
|
// #ifdef H5
|
|
try {
|
|
// sortChildren(children, this[parent]);
|
|
} catch (err) {
|
|
console.log('err', err);
|
|
}
|
|
// #endif
|
|
|
|
// #ifndef H5
|
|
// sortMPChildren(children);
|
|
// #endif
|
|
|
|
this[parent].children = children;
|
|
this.innerAfterLinked?.(this);
|
|
this[parent].innerAfterLinked?.(this);
|
|
|
|
// console.log('bindRelation.children', children);
|
|
},
|
|
onBeforeMount() {
|
|
const that = this;
|
|
if (that[parent]) {
|
|
that[parent].children = that[parent].children.filter(item => item !== that);
|
|
this[parent].innerAfterUnLinked?.(this);
|
|
this.innerAfterUnLinked?.(this);
|
|
|
|
that?.destroyCallback?.();
|
|
}
|
|
},
|
|
},
|
|
};
|
|
}
|
|
|
|
export function ParentMixin(parent) {
|
|
return {
|
|
provide() {
|
|
return {
|
|
[parent]: this,
|
|
};
|
|
},
|
|
|
|
data() {
|
|
return {
|
|
// 会造成循环引用
|
|
// children: [],
|
|
};
|
|
},
|
|
};
|
|
}
|