簡體   English   中英

React:如何使用 fetch API 顯示 react-icons 元素?

[英]React: How to display react-icons element using fetch API?

我將我的社交鏈接數據存儲在 firebase 上,現在我想制作一個<li>我的社交鏈接列表,但我這里的icon object 沒有向我顯示圖標,而是向我顯示如下元素: <BsBehance /> . 它應該顯示為圖標,我該怎么做?

Firebase 數據:-

在此處輸入圖像描述

代碼:-

import { useEffect, useState } from "react";
import * as ReactIcons from "react-icons/fa";
import MainWrapper from "./MainWrapper";
import classes from "./pages.module.css";

export default function Footer() {
    const [socialLinks, setSocialLinks] = useState([]);

    useEffect(() => {
        const fetchSocilLinks = async () => {
            const res = await fetch(
                "https://mohitdevelops-d64e5-default-rtdb.asia-southeast1.firebasedatabase.app/accounts.json"
            );
            const data = await res.json();
            let loadedData = [];
            for (const keys in data) {
                loadedData.push({
                    url: data[keys].url,
                    icon: data[keys].icon,
                    id: data[keys].id,
                });
            }
            setSocialLinks(loadedData);
        };
        fetchSocilLinks().catch((err) => {
            console.log(err.message);
        });
    }, [socialLinks]);

    console.log(socialLinks);

    return (
        <footer className={classes.footer__wrap}>
            <MainWrapper>
                <p>Connect with me:</p>
                <ul className={classes.social_links}>
                    {socialLinks?.map(({ icon, id, url }) => {
                        const iconLink = icon.split(/\<|\/>/).filter((e) => e)[0];
                        const IconsComponent = ReactIcons[iconLink];
                        return (
                            <li key={id}>
                                <a href={url} target="_blank">
                                    <IconsComponent />
                                </a>
                            </li>
                        );
                    })}
                </ul>                   
            </MainWrapper>
        </footer>
    );
}

它像這樣向我展示:-

在此處輸入圖像描述

一切數據都很好,只需要知道如何顯示一個像圖標一樣工作的元素。

由於 el.icon 是一個字符串,因此它被顯示為一個字符串。 如果要根據該動態字符串呈現組件,則需要有一個 object,其中鍵名是您將從服務器獲取的字符串。 而價值,可以是組件本身。

當您在 {} 中插入一個字符串時,React 會將其呈現為一個字符串,即使它們是 < /> 格式。

而且,盡量不要使用 dangerouslySetInnerHTML,因為它有很高的安全性問題。

對於您的上述情況,這是一個codesanbox 請檢查這個:

你需要像這樣使用 dangerouslySetInnerHTML

<ul className={classes.social_links}>       
       {socialLinks.map((el) => {
            return (
                <li key={el.id}>
                    <a href={el.url} target="_blank">
    <span dangerouslySetInnerHTML={{__html: el.icon}} />
                    </a>
                </li>
            );
        })}
</ul>

需要顯示的圖標應該是從react-icon/bs導入的,圖標名稱來自firebase數據,所以可以在react.js中使用動態導入導入,但是對於動態導入,你需要單獨處理加載,但我提供了簡單的方法。

需要安裝react-icon

npm install react-icons --save

然后導入所有的圖標

import * as ReactIcons from "react-icons/bs";

並添加這行代碼

  <ul>
    {socialLinks?.map(({ icon, id, url }) => {
      const iconLink = icon.split(/\<|\/>/).filter((e) => e)[0];
      const Compoenent = ReactIcons[iconLink];
      return (
        <li key={id}>
          <a href={url}>
            <Compoenent />
          </a>
        </li>
      );
    })}
  </ul>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM