๐Ÿ’ป๊ฐœ๋ฐœ ๋…ธํŠธ/๋‚˜๋งŒ์˜ ์‹œํ—˜์ง€

[FE]jsonํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ๊ฐ ๋ฌธ์ œ ์ด๋ฏธ์ง€ ๋„์šฐ๊ธฐ(4)/html-react-parser

4:Bee 2024. 3. 3. 14:49
728x90

์•ž์„œ ํฌ์ŠคํŒ…์—์„œ dangerouslySetInnerHTML์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ ๋“ค์„ ํฌ์ŠคํŒ… ํ–ˆ์—ˆ๋‹ค. ๋‹ค์‹œ ์ƒ๊ธฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ์•„๋ž˜ ๋งํฌ๋ฅผ ํ†ตํ•ด์„œ ๋งˆ์ง€๋ง‰ ํ•˜๋‹จ ๋ถ€๋ถ„์„ ์ฝ์–ด ๋ณด๊ธธ ๋ฐ”๋ž€๋‹ค.

 

[FE]jsonํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ๊ฐ ๋ฌธ์ œ ์ด๋ฏธ์ง€ ๋„์šฐ๊ธฐ(1)

ํ˜„์žฌ ๋ฐฑ์—”๋“œ๋กœ ๋ถ€ํ„ฐ ์•„์ง ์™„๋ฒฝํ•œ api๋ฅผ ์ „๋‹ฌ ๋ฐ›์ง€ ์•Š์•˜๋‹ค. ๋ฐฑ์—”๋“œ์—์„œ ์•„์ง ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๊ฒƒ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜๋‹ค. ๋ฟ๋งŒ์•„๋‹ˆ๋ผ css๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ ์ด๋ฏธ์ง€๋“ค์˜ className๋„ api๋กœ ์ œ์ž‘ํ•˜

hi-code.tistory.com

dangerouslySetInnerHTML์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  html์„ ์–ด๋–ป๊ฒŒ ๋žœ๋”๋ง ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณ ๋ฏผํ•˜๋‹ค ์ฐพ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ html-react-parser์ด๋‹ค. parseImageTagํ•จ์ˆ˜๋Š” ๋ณ€ํ•จ์ด ์—†๋‹ค. ๋ณ€ํ™”๊ฐ€ ๋˜์–ด์•ผํ•  ์ฝ”๋“œ๋Š” jsx๋ฌธ๋ฒ• ๋ถ€๋ถ„์—์„œ ๋ณ€ํ•˜๋Š”๋ฐ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

import React, { useState, useEffect } from "react";
import { Link } from "react-router-dom";
import parse from 'html-react-parser'; // html-react-parser ๋ชจ๋“ˆ ์‚ฌ์šฉ
  ...
<ol>
        {data.map((item, index) => (
          <li key={index}>
            {/* ์งˆ๋ฌธ */}
            <p>{parse(parseImageTag(item.question, item.image, "test_image"))}</p>
            {/* <p dangerouslySetInnerHTML={{ __html: parseImageTag(item.question, item.image, "test_image") }} /> */}
            {/* 4์„ ์ง€ */}
            {item.options.map((option, index) => (
              <div key={index}>{option}</div>
            ))}
          </li>
        ))}
</ol>

๊ธฐ์กด๊ณผ ๋‹ฌ๋ฆฌ <p dangerouslySetInnerHTML={{ __html: parseImageTag(item.question, item.image, "test_image") }} />๋ฅผ ์‚ญ์ œํ•˜๊ณ  <p>{parse(parseImageTag(item.question, item.image, "test_image"))}</p> ์ด์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์•ˆ์ „ํ•˜๊ฒŒ html์„ ๋ Œ๋”๋ง ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด์ œ className์„ ํ™œ์šฉํ•ด์„œ css๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

728x90