import { SHAPES, ShapeCard } from '../../constants/shapes';
Component({
options: {},
/**
* 组件的属性列表
*/
properties: {
show: {
type: Boolean,
value: false,
},
selectedShapeList: { // 已选中的shapeList,用于初始化
type: Array,
value: [],
},
selectedShapeIndex: {
type: Number,
value: -1,
},
},
/**
* 组件的初始数据
*/
data: {
shapes: [] as (ShapeCard & { svgDataUrl: string })[],
singleMode: false,
totalSelected: 0,
},
lifetimes: {
// attached() {
// // 处理 SVG 数据,转换为 data URL
// const shapesWithDataUrl = SHAPES.map(shape => {
// const completeSvg = ``;
// const svgDataUri = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(completeSvg)}`;
// return {
// ...shape,
// svgDataUrl: svgDataUri
// };
// });
// this.setData({
// shapes: shapesWithDataUrl
// });
// }
},
observers: {
// selectedShapeIndex(index: number) {
// const { shapes } = this.data;
// const newShapes = shapes.map((item, i) => ({
// ...item,
// checked: i === index
// }));
// this.setData({
// singleMode: index !== -1,
// totalSelected: index !== -1 ? 1 : 0,
// shapes: newShapes
// });
// },
'selectedShapeList, selectedShapeIndex': function (selectedShapeList: ShapeCard[], index: number) {
let newShapes = [];
let checkedIds: string[] = selectedShapeList.map(item => item.id);
if (index !== -1) { // 单选模式
let singleShapeId = selectedShapeList[index].id;
newShapes = SHAPES.map(shape => {
const completeSvg = ``;
const svgDataUri = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(completeSvg)}`;
return {
...shape,
svgDataUrl: svgDataUri,
checked: singleShapeId === shape.id,
checkedDisabled: singleShapeId !== shape.id && checkedIds.includes(shape.id)
}
});
} else { // 多选模式
newShapes = SHAPES.map(shape => {
const completeSvg = ``;
const svgDataUri = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(completeSvg)}`;
return {
...shape,
svgDataUrl: svgDataUri,
checked: checkedIds.includes(shape.id)
}
});
}
this.setData({
shapes: newShapes,
totalSelected: newShapes.filter(item => item.checked).length,
singleMode: index !== -1,
});
}
},
/**
* 组件的方法列表
*/
methods: {
onClose() {
this.triggerEvent('onClose');
},
onSelectShape(e: WechatMiniprogram.TouchEvent) {
const { index } = e.currentTarget.dataset;
const { singleMode, shapes } = this.data;
let newShapes = [];
const selectedShape = shapes[index];
if (selectedShape.checkedDisabled) {
wx.showToast({
title: '当前形状已选中,请勿重复选中',
icon: 'none',
duration: 1500
});
return;
}
if (singleMode) {
// 单选模式:currentShapeKey 不为空时,只能选中一个形状
newShapes = shapes.map((item, i) => ({
...item,
checked: i === index
}));
} else {
// 多选模式:currentShapeKey 为空时,支持多选,最多可选6个
newShapes = shapes.map(item => ({ ...item }));
const targetIndex = index;
// 统计当前已选中的数量
const checkedCount = newShapes.filter(item => item.checked).length;
if (newShapes[targetIndex].checked) {
// 如果已选中,则取消选中
newShapes[targetIndex].checked = false;
} else {
if (checkedCount >= 6) {
wx.showToast({
title: '最多可选择6个形状',
icon: 'none',
duration: 1500
});
return;
}
// 如果未选中,则添加到选中列表
newShapes[targetIndex].checked = true;
}
}
const totalSelected = newShapes.filter(item => item.checked).length;
this.setData({
shapes: newShapes,
totalSelected,
});
},
onChange() {
const { shapes, selectedShapeIndex, singleMode } = this.data;
const selectedShapes = shapes.filter(item => item.checked);
this.triggerEvent('onChange', {
shapes: selectedShapes,
singleMode,
selectedShapeIndex
});
},
},
});