next.js 中iconfont Symbol 加载svg优化

24 篇文章 0 订阅
11 篇文章 0 订阅

next.js 中iconfont Symbol 加载svg优化。

按照常规方法加载iconfont Symbol (例如:https://blog.csdn.net/qq_41211900/article/details/108443521

页面会生成这样:

<svg class="icon " aria-hidden="true"><use xlink:href="#icon-mobile">
<svg id="icon-mobile" viewBox="0 0 1024 1024"><path d="M768 64a64 64 0 0 1 64 64v768a64 64 0 0 1-64 64H256a64 64 0 0 1-64-64V128a64 64 0 0 1 64-64h512z m-32 64H288a32 32 0 0 0-32 32v704a32 32 0 0 0 32 32h448a32 32 0 0 0 32-32V160a32 32 0 0 0-32-32z m-223.488 608a48 48 0 1 1 0 96 48 48 0 0 1 0-96z" "#000000"=""></path></svg>
</use></svg>

(图1的代码插入在页面内容最前面,使用icon位置代码如图2)

  经过调试将svg代码进行整改成如下,svg能正常在web端展示,并且可以通过class选个器更换颜色和字号:

<svg class="icon" id="icon-mobile" viewBox="0 0 1024 1024">
<path d="M768 64a64 64 0 0 1 64 64v768a64 64 0 0 1-64 64H256a64 64 0 0 1-64-64V128a64 64 0 0 1 64-64h512z m-32 64H288a32 32 0 0 0-32 32v704a32 32 0 0 0 32 32h448a32 32 0 0 0 32-32V160a32 32 0 0 0-32-32z m-223.488 608a48 48 0 1 1 0 96 48 48 0 0 1 0-96z" "#000000"=""></path>
</svg>

制作next.js组件如下:

1.下载iconfont字体图标包,找到iconfont.js

2.iconfont.js中只要<svg>...</svg>中间的内容,其他都不要,进行导出即可,如下图:

3.icon.js组件:

import React, { useState, useEffect, useRef, memo, useCallback } from 'react'
function Getsvg({ className, addclass, style }) {
    const svgXML = useRef(null)
    console.log(className, addclass, style)
    useEffect(() => {
        const iconfont = require('../public/js/iconfont');
        console.log("iconfont", iconfont)
        if (iconfont) {
            var parser = new DOMParser();
            var resXML = parser.parseFromString(iconfont, 'text/xml');
            var zeroXML = resXML.querySelector("#" + className);
            if (zeroXML && svgXML.current) {
                svgXML.current.innerHTML = zeroXML.innerHTML
                svgXML.current.setAttribute("id", zeroXML.getAttribute("id"))
                svgXML.current.setAttribute("viewBox", zeroXML.getAttribute("viewBox"))
            }
        }
    }, [])

    return (
        <svg className={`icon ${addclass && addclass != undefined ? addclass : ''}`} ref={svgXML}>
        </svg>
    )
}

export default Getsvg

4.页面引用:

//page
import Icon from '../components/icon'
function home(){
    return (
       <Icon className="icon-Settings"></Icon>
    )
}

export default home

效果如下:

如此就改完了,这样可以解决常规方法等页面生成后再处理svg延时加载慢的问题,并且去掉很多冗余代码。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web16888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值