赞
踩
由于网上搜了很多相关资料,都是介绍如何通过 js 修改本地 svg 资源。不过我们要求是要修改在线 svg 资源,因此,在一顿研究之后,封装了如下组件。
<template> <img v-if="url" class="hyl-svg-container" :src="url"/> </template> <script> export default { name: 'hyl-svg-container', props: { src: String, fill: String, options: { type: Object, default: () => ({}) } }, data() { return { content: '', url: '' }; }, watch: { fill: { handler(v) { if (this.content && v) { this.fillColor(); } }, immediate: true } }, created() { this.fetchSvgSource(); }, methods: { async fetchSvgSource() { if (!this.src) return; const response = await fetch(this.src); const contentType = response.headers.get('content-type'); const [fileType] = (contentType || '').split(/ ?; ?/); // 异常状态 if (response.status > 299) { console.error('Not found'); } this.url = ''; // 非有效格式 if (!['image/svg+xml', 'text/plain'].some(d => fileType.includes(d))) { console.error(`Content type isn't valid: ${fileType}`); this.url = this.src; return; } // 获取内容 const content = await response.text(); this.content = content; this.fillColor(); }, fillColor() { if (this.fill) { // 支持自定义填充颜色 this.content = this.content.replace(/#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/g, this.fill); } // 转换base64 const base64Code = btoa(this.content); const base64SVG = `data:image/svg+xml;base64,${base64Code}`; this.url = base64SVG; } } }; </script> <style> .hyl-svg-container { width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; } </style>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。