React使用本地svg图片

安装依赖

yarn add svg-sprite-loader svgo-loader --dev

全局引入SVG的所有图片,代码如下:

svg目录

	src
	└──assets
	  └──icons
	    ├──svg
		┊  ├──logo.svg #本地svg文件
		┊  └──en.svg
		└──index.js

index.js代码:

const req = require.context('./svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)
//一个 webpack 的 api ,通过该函数可以获取一个上下文,
//从而实现工程自动化(遍历文件夹的文件,从中获取指定文件,自动导入模块)。

//在前端工程中,如果一个文件夹中的模块需要频繁引用时可以使用该中方式一次性引入

在index.tsx中引入(相当于项目主入口文件)

import '@/assets/icons'

webpack配置

生成webpack.config.js配置文件

yarn eject
#npm run eject

修改webpack.config.js配置文件

//替换配置
{
  test: /\.svg$/,
  use: [
    {
      loader: require.resolve('@svgr/webpack'),
      options: {
        prettier: false,
        svgo: false,
        svgoConfig: {
          plugins: [{ removeViewBox: false }],
        },
        titleProp: true,
        ref: true,
      },
    },
    {
      loader: require.resolve('file-loader'),
      options: {
        name: 'static/media/[name].[hash].[ext]',
      },
    },
  ],
  issuer: {
    and: [/\.(ts|tsx|js|jsx|md|mdx)$/],
  },
}

//替换为
{
  test: /\.svg$/,
  include: path.resolve(__dirname, '../src/assets/icons'), 
  use:  [
    { loader: 'svg-sprite-loader', options: {} },
    // { loader: 'svgo-loader', options: {symbolId: "icon-[name]"} },
  ]
},

封装组件,添加参数与事件

import React, {useMemo, useEffect } from "react";
interface SvgProps {
  name: string;  // 图片名称
  className?: string; //class 名称
  rotate?: number; 
  size?: string | number;
  onclick?: any; // onClick事件
}
/** 自定义SVG图片组件 */
const SvgIcon= (props: SvgProps) => {
  let {
    name,
    className,
    rotate,
    size,
    onclick,
  } = props;
  const setData = () => {
    name = "";
    className = "";
    rotate = 0;
    size = 24;
    onclick = new Function
  }
  useEffect(() => { setData(), [] }) // 初始化数据,在渲染的时候初始化一次数据,那么第二个参数必须传空数组
  const svgclass = useMemo(() => {
    if (className) {
      return 'svg-icon '+ className.trim()
    }
    return "svg-icon"
  }, [className])
  const svgStyle = useMemo(() => {
    return {
      transform: 'rotate(' + rotate  + 'deg)',
      fontSize: size  + 'px'
    }
  }, [rotate])
  return (
    <div className="b-k flex-display flex-ai-center ">
      <svg className={svgclass}
        aria-hidden="true"
        style={svgStyle}
        onClick={ onclick }
        >
      <use xlinkHref={'#'+ name}></use>
    </svg>
    </div>
  )
}
export default SvgIcon

使用

import SvgIcon from "../../components/SvgIcon"
export default ()=>{
  return (
    <div>
      <SvgIcon name="logo"></SvgIcon>
    </div>
  )
}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用 `react-native-svg` 和 `react-native-svg-transformer` 加载本地 SVG 图像,你可以按照以下步骤进行操作: 1. 首先,确保你已经在项目中安装了 `react-native-svg` 和 `react-native-svg-transformer` 依赖。你可以通过运行以下命令来安装它们: ``` npm install react-native-svg react-native-svg-transformer ``` 2. 在项目的根目录下创建一个名为 `metro.config.js` 的文件(如果已存在,请跳过此步骤)。 3. 在 `metro.config.js` 文件中添加以下内容: ```javascript module.exports = { transformer: { assetPlugins: ['react-native-svg-transformer'], }, }; ``` 4. 接下来,在你的组件中,使用 `react-native-svg` 中的 `<SvgUri>` 组件来加载本地 SVG 图像。首先,确保你的 SVG 图像位于项目的 `assets` 文件夹中。 ```javascript import React from 'react'; import { View } from 'react-native'; import SvgUri from 'react-native-svg-uri'; const MyComponent = () => { return ( <View> <SvgUri width={200} height={200} source={require('./assets/myImage.svg')} /> </View> ); }; export default MyComponent; ``` 在上面的示例中,我们使用 `require` 方法加载位于 `assets` 文件夹中的 `myImage.svg` 图像,并将其作为 `source` 属性传递给 `<SvgUri>` 组件。你可以根据自己的需要调整宽度和高度。 5. 确保你在重新启动 Metro Bundler 之前完成了以上步骤。你可以通过运行以下命令重新启动 Metro Bundler: ``` npx react-native start --reset-cache ``` 这样,你就可以使用 `react-native-svg` 和 `react-native-svg-transformer` 成功加载和显示本地 SVG 图像了。 希望对你有所帮助!如有任何疑问,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

哚啦A孟

谢谢鼓励

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

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

打赏作者

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

抵扣说明:

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

余额充值