如何让 Font Awesome 5 与 React 一起使用?

IT技术 javascript reactjs font-awesome font-awesome-5
2021-04-14 06:50:26

在下面的示例中,初始图标呈现但在类更改时不会更改。

const Circle = ({ filled, onClick }) => {
  const className = filled ? 'fas fa-circle' : 'far fa-circle';
  
  return (
    <div onClick={onClick} >
      <i className={className} />
      <p>(class is {className})</p>
    </div>
  );
};

class App extends React.Component {
  state = { filled: false };

  handleClick = () => {
    this.setState({ filled: !this.state.filled });
  };
  
  render() {
    return <Circle filled={this.state.filled} onClick={this.handleClick} />;
  }
}

ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://use.fontawesome.com/releases/v5.0.2/js/all.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="root"></div>

3个回答

BO41 是对的,它是不会重新渲染的字体很棒的 javascript。如果您可以不使用新的 font-awesome svg/javascript 图标,您可以使用 font-awesome 作为带有 css 的 webfont。

在你的 index.html 中,删除 fontawesome 脚本,并添加 font-awesome css 样式表:

<link href="https://use.fontawesome.com/releases/v5.0.2/css/all.css" rel="stylesheet">

您的代码现在应该可以工作了。


另一种可能性是使用官方的 font-awesome react 包(有点麻烦,但它使用了新的 svg 图标)

将必要的包添加到项目中:

yarn add @fortawesome/fontawesome @fortawesome/react-fontawesome
yarn add @fortawesome/fontawesome-free-regular @fortawesome/fontawesome-free-solid

和更新的代码:

import fontawesome from '@fortawesome/fontawesome'
import FontAwesomeIcon from '@fortawesome/react-fontawesome'
import { faCircle as fasCircle } from '@fortawesome/fontawesome-free-solid'
import { faCircle as farCircle } from '@fortawesome/fontawesome-free-regular'

const Circle = ({ filled, onClick }) => {

  return (
    <div onClick={onClick} >
      <FontAwesomeIcon icon={filled ? farCircle : fasCircle}/>
    </div>
  );
};

class App extends React.Component {
  state = { filled: false };

  handleClick = () => {
    this.setState({ filled: !this.state.filled });
  };

  render() {
    return <Circle filled={this.state.filled} onClick={this.handleClick} />;
  }
}

有关更多信息,请参阅 github 存储库:https : //github.com/FortAwesome/react-fontawesome

您可能还想回答stackoverflow.com/questions/47707306 /... 问题 - 问题是相似的(我会让其他人决定是否应该关闭一个副本)。
2021-05-26 06:50:26
我也在那里提交了我的答案,感谢您的提醒!
2021-06-21 06:50:26

您可以配置 fontawesome 将 svg 嵌套在<i>标签中。这种方式react可以重新渲染它。

https://fontawesome.com/how-to-use/svg-with-js

嵌套标签而不是替换 在某些情况下,标签的替换可能无法按照您的需要进行。

您可以配置 Font Awesome 将 嵌套在标签内。

我们从一个 i 标签开始

<script>
  FontAwesomeConfig = { autoReplaceSvg: 'nest' }
</script>
<i class="my-icon fas fa-coffee" data-fa-mask="fas fa-circle"></i>

最后在原来的 i 里面有一个 svg 标签

<i class="my-icon" data-fa-mask="fas fa-circle" data-fa-i2svg="">
  <svg class="svg-inline--fa fa-coffee fa-w-16" data-fa-mask="fas fa-circle" aria-hidden="true" data-fa-i2svg="" data-prefix="fas" data-icon="coffee" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">...</svg>
</i>

我假设您需要重新触发字体真棒 javascript 来呈现新图标。如果您使用带有标签的真实图像,它将按您的预期工作

对不起。但我只使用了 css 版本。您必须查看 js 源代码,看看是否有一种方法可以重新呈现所有内容。否则我认为除了重新加载页面之外你没有机会。(也许只为图标放置一个 iframe 并重新加载它)
2021-05-30 06:50:26
你能提供一个例子吗?
2021-06-20 06:50:26