setState 不更新字体真棒图标

setState not updating font awesome icon

我正在尝试在我自己编写的复选框组件中动态呈现超赞字体图标。当我在单击它后尝试更新带有超赞字体图标的状态时,它没有更新。我试图将渲染移动到单独的函数并尝试使用 react-fontawesome 但没有任何帮助。状态正在更新,但很棒的字体图标与 html.

中的 svg 代码相同
...
state = {
 checked: this.props.checked
}

toggleCheck = () => {
  this.setState({ checked: !this.state.checked });  
};

render () {

  const iconUnchecked = 'far fa-square';
  const iconChecked = 'fas fa-check-square';
  const iconClass = this.state.checked ? iconChecked : iconUnchecked;

  return (
    <span onClick={this.toggleCheck}>
      <i className={iconClass} />
    </span>
  );
}

试试那个 https://jsfiddle.net/n5u2wwjg/30533/

对我来说似乎有效

准确检查 jsfiddle 是否有效,但不是片段。摘录只是为了让编辑满意。

class TodoApp extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      checked: this.props.checked
    }
    this.toggleCheck = this.toggleCheck.bind(this);
  }
  
  toggleCheck() {
    this.setState({ checked: !this.state.checked });  
  }
  
  render() {
    const iconUnchecked = 'far fa-square';
   const iconChecked = 'fas fa-check-square';
   let iconClass = this.state.checked ? iconChecked : iconUnchecked;

    return (
      <span onClick={this.toggleCheck}>
        <i className={iconClass} />
      </span>
    )
  }
}

ReactDOM.render(<TodoApp />, document.querySelector("#app"))
body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

#app {
  background: #fff;
  border-radius: 4px;
  padding: 20px;
  transition: all 0.2s;
}

li {
  margin: 8px 0;
}

h2 {
  font-weight: bold;
  margin-bottom: 15px;
}

.done {
  color: rgba(0, 0, 0, 0.3);
  text-decoration: line-through;
}

input {
  margin-right: 5px;
}
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.10/css/all.css" integrity="sha384-+d0P83n9kaQMCwj8F4RJB66tzIwOKmrdb46+porD/OvrJ+37WqIM7UoBtwHO6Nlg" crossorigin="anonymous">

<div id="app"></div>

据我所知,js 操纵字体 awesome DOM 而 React 操纵虚拟字体 DOM。当 font awesome js 做自己的事情时,React 无法在状态更改后重新渲染它。我仍在使用 React 15,也许这不是 React 16 中的问题。我刚刚找到了一个解决方案,可以将每个字体都放在带有唯一键的 div 中。通过这种方式,React 看到 div 必须更改,因为密钥已更改。

我也遇到了同样的麻烦。正如 200Ok 正确提到的那样,svg--inline-fa 不是虚拟的 DOM,因此它永远不会更新。解决该问题的最佳方法是包装包含决定性 类.

的字体 awesome 元素