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 = `${shape.svg}`; // 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 = `${shape.svg}`; 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 = `${shape.svg}`; 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 }); }, }, });