Component({
|
relations: {
|
'./c-sidebar-item/index': {
|
type: 'descendant',
|
linked(target) {
|
this.children.push(target);
|
this.setActive(this.properties.activeKey, true);
|
},
|
unlinked(target) {
|
this.children = this.children.filter((item) => item !== target);
|
this.setActive(this.properties.activeKey, true);
|
},
|
},
|
},
|
|
externalClasses: ['custom-class'],
|
|
properties: {
|
activeKey: {
|
type: Number,
|
value: 0,
|
},
|
},
|
observers: {
|
activeKey(newVal) {
|
this.setActive(newVal);
|
},
|
},
|
|
created() {
|
this.children = [];
|
this.currentActive = -1;
|
this.topRightRadiusItemIndexs = [];
|
this.bottomRightRadiusItemIndexs = [];
|
},
|
|
methods: {
|
setActive(activeKey, isChildrenChange) {
|
const {
|
children,
|
currentActive,
|
topRightRadiusItemIndexs: preTopRightRadiusItemIndexs,
|
bottomRightRadiusItemIndexs: preBottomRightRadiusItemIndexs,
|
} = this;
|
|
if (!children.length) {
|
return Promise.resolve();
|
}
|
|
if (activeKey === currentActive && !isChildrenChange) {
|
return Promise.resolve();
|
}
|
|
this.currentActive = activeKey;
|
this.topRightRadiusItemIndexs = this.getTopRightRadiusItemIndexs(
|
activeKey,
|
children,
|
);
|
this.bottomRightRadiusItemIndexs = this.getBottomRightRadiusItemIndexs(
|
activeKey,
|
children,
|
);
|
|
const stack = []; // 任务列表,存放调用子组件的setActive后返回的一堆promise
|
|
// 将旧的选中项改为false
|
if (currentActive !== activeKey && children[currentActive]) {
|
stack.push(children[currentActive].setActive(false));
|
}
|
|
// 将新的选中项改为true
|
if (children[activeKey]) {
|
stack.push(children[activeKey].setActive(true));
|
}
|
|
preTopRightRadiusItemIndexs.forEach((item) => {
|
stack.push(children[item].setTopRightRadius(false));
|
});
|
|
preBottomRightRadiusItemIndexs.forEach((item) => {
|
stack.push(children[item].setBottomRightRadius(false));
|
});
|
|
this.topRightRadiusItemIndexs.forEach((item) => {
|
stack.push(children[item].setTopRightRadius(true));
|
});
|
|
this.bottomRightRadiusItemIndexs.forEach((item) => {
|
stack.push(children[item].setBottomRightRadius(true));
|
});
|
|
return Promise.all(stack);
|
},
|
getTopRightRadiusItemIndexs(activeKey, children) {
|
const { length } = children;
|
if (activeKey !== 0 && activeKey < length - 1) return [0, activeKey + 1];
|
if (activeKey !== 0) return [0];
|
if (activeKey < length - 1) return [activeKey + 1];
|
return [];
|
},
|
getBottomRightRadiusItemIndexs(activeKey) {
|
if (activeKey !== 0) return [activeKey - 1];
|
return [];
|
},
|
},
|
});
|