Language/React
nextjs에서 svg 컴포넌트로 사용하는 방법
건담아빠
2024. 4. 4. 09:34
컴포넌트 형태로 svg를 사용하려면?
설치
$ yarn add url-loader
$ yarn add @svgr/webpack
custom.d.ts
declare module '*.mdx';
declare module '*.svg' {
const ReactComponent: React.FC<React.SVGProps<SVGSVGElement>>;
const content: string;
export { ReactComponent };
export default content;
}
next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: false,
eslint: {
// Warning: This allows production builds to successfully complete even if
// your project has ESLint errors.
ignoreDuringBuilds: true,
},
webpack: (config, { buildId, dev, isServer, defaultLoaders, webpack }) => {
config.module.rules.push({
test: /\.svg$/,
use: ['@svgr/webpack', 'url-loader'],
})
return config
},
};
module.exports = nextConfig;
Sample
import React, { useEffect, useState } from 'react';
import { ReactComponent as CheckedIcon } from './assets/images/checkbox_icon_off.svg';
import { ReactComponent as UncheckedIcon } from './assets/images/checkbox_icon_on.svg';
interface CheckboxProps {
className?: string;
children?: React.ReactNode;
checked: boolean;
onChange: (checked: boolean) => void;
}
export const Checkbox: React.FC<CheckboxProps> = ({ ...props }) => {
const [isChecked, setIsChecked] = useState(props.checked);
const toggleCheckbox = () => {
const theChecked = !isChecked;
setIsChecked(theChecked);
props.onChange(theChecked);
};
useEffect(() => {
setIsChecked(props.checked);
}, [props.checked]);
return (
<div onClick={toggleCheckbox} className={props.className}>
{isChecked ? <CheckedIcon /> : <UncheckedIcon />}
{/*{isChecked ? <img src="./assets/images/checkbox_icon_on.svg" /> : <img src="./assets/images/checkbox_icon_off.svg" />} */}
{props.children}
</div>
);
};
...