84 lines
2.5 KiB
JavaScript
84 lines
2.5 KiB
JavaScript
// components/icon/icon.js
|
||
Component({
|
||
properties: {
|
||
// 图标名称
|
||
name: {
|
||
type: String,
|
||
value: 'share',
|
||
observer: 'updateIcon'
|
||
},
|
||
// 图标大小(rpx)
|
||
size: {
|
||
type: Number,
|
||
value: 48
|
||
},
|
||
// 图标颜色
|
||
color: {
|
||
type: String,
|
||
value: '#ffffff',
|
||
observer: 'updateIcon'
|
||
},
|
||
// 自定义类名
|
||
customClass: {
|
||
type: String,
|
||
value: ''
|
||
},
|
||
// 自定义样式
|
||
customStyle: {
|
||
type: String,
|
||
value: ''
|
||
}
|
||
},
|
||
|
||
data: {
|
||
svgData: ''
|
||
},
|
||
|
||
lifetimes: {
|
||
attached() {
|
||
this.updateIcon()
|
||
}
|
||
},
|
||
|
||
methods: {
|
||
// SVG 图标数据映射
|
||
getSvgPath(name) {
|
||
const svgMap = {
|
||
'share': '<svg viewBox="0 0 24 24" fill="none" stroke="COLOR" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="18" cy="5" r="3"/><circle cx="6" cy="12" r="3"/><circle cx="18" cy="19" r="3"/><line x1="8.59" y1="13.51" x2="15.42" y2="17.49"/><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"/></svg>',
|
||
|
||
'arrow-up-right': '<svg viewBox="0 0 24 24" fill="none" stroke="COLOR" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="7" y1="17" x2="17" y2="7"/><polyline points="7 7 17 7 17 17"/></svg>',
|
||
|
||
'chevron-left': '<svg viewBox="0 0 24 24" fill="none" stroke="COLOR" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="15 18 9 12 15 6"/></svg>',
|
||
|
||
'search': '<svg viewBox="0 0 24 24" fill="none" stroke="COLOR" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>',
|
||
|
||
'heart': '<svg viewBox="0 0 24 24" fill="none" stroke="COLOR" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/></svg>'
|
||
}
|
||
|
||
return svgMap[name] || ''
|
||
},
|
||
|
||
// 更新图标
|
||
updateIcon() {
|
||
const { name, color } = this.data
|
||
let svgString = this.getSvgPath(name)
|
||
|
||
if (svgString) {
|
||
// 替换颜色占位符
|
||
svgString = svgString.replace(/COLOR/g, color)
|
||
|
||
// 转换为 Base64 Data URL
|
||
const svgData = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svgString)}`
|
||
|
||
this.setData({
|
||
svgData: svgData
|
||
})
|
||
} else {
|
||
this.setData({
|
||
svgData: ''
|
||
})
|
||
}
|
||
}
|
||
}
|
||
})
|