【问题标题】:How can I get Font Awesome 5 to work with React?如何让 Font Awesome 5 与 React 一起使用?
【发布时间】:2018-06-05 20:36:57
【问题描述】:

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

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>

【问题讨论】:

    标签: javascript reactjs font-awesome font-awesome-5


    【解决方案1】:

    我假设您需要重新触发 font awesome javascript 来呈现新图标。如果您使用带有标签的真实图像,它会像您预期的那样工作

    【讨论】:

    • 您能举个例子吗?
    • 对不起。但我只使用了css版本。您必须查看 js 源代码,看看是否有一种方法可以重新渲染所有内容。否则,除了重新加载页面之外,我认为您没有机会。 (也许只为图标放置一个 iframe 并重新加载它)
    【解决方案2】:

    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

    【讨论】:

    【解决方案3】:

    您可以配置 fontawesome 将 svg 嵌套在 &lt;i&gt; 标记内。这样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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      • 2018-05-22
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      相关资源
      最近更新 更多