javascript - 使用 CSS 类或渲染状态更改来提高效率?

标签 javascript css reactjs performance

这更像是一个 React 性能问题。

我的问题是,通过DOM 操作状态更改 向元素添加/删除 CSS 类名(即添加“显示”类名)更好?我确实发现当目标 DOM 元素已知时,直接 DOM 操作“classList”肯定更快。

一个片段是:

const menuRef= React.createRef();

constructor(props) {
   super(props);
   /*if I am to use state*/
   //this.state = {isMenuShown: false}
}

_toggleShow = () => {
   //Changing states?
   /* this.setState({isMenuShown: !this.state.isMenuShown}); */
   if(this.menuRef.current) {
     if(!this.menuRef.current.classList.contains("show")) {
       this.menuRef.current.classList.add("show");
     }
     else {
       this.menuRef.current.classList.remove("show");
     }
   }  
}

render() {
  let ulClassName = "";
  /* If I am to use state*/
  //ulClassName = this.state.isMenuShown ? "show":"";
  return (
    <React.Fragment>
      <nav onClick={this._toggleShow)>
        <ul ref={this.menuRef} className={ulClassName}>
          <li>Sample 1</li>
          <li>Sample 2</li>
        </ul>
      </nav>
      <style jsx>{`
       ul {
          display: none;
       }
       ul.show {
          display: block;
          //I can add CSS @keyframes to display
          //Inner child elements relies on ".show" too for responsive design.
       }
     `}</style>
  </React.Fragment>
);

我知道状态是建议的方式,但上面的场景证明(至少对我而言)当严重依赖 CSS 时,DOM 操作更好。以 CSS 用法为例:

  • 内在 child 响应设计。
  • 使用 CSS @keyframes 制作动画

您真正会用到什么,或者如何解决这个问题?将来 DOM 操作真的会给任何人带来问题吗?

最佳答案

我认为在 React 中直接操作 DOM 元素是一种反模式。这是可行的,但不推荐。

作为旁注,我使用名为 classnames 的节点模块来帮助切换在 className 属性上使用的渲染元素。它通过根据您提供的逻辑处理类的添加或删除来实现这一点。

关于javascript - 使用 CSS 类或渲染状态更改来提高效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53347642/

相关文章:

javascript - 为什么 Google Maps API 无法从 HTML 文件中的 JS 访问自定义 CSS 文件?

javascript - 如何通过短信获取 sibling ?

reactjs - 为什么在 IE 11 中,Selenium WebDriver 的 SendKeys 上没有触发 React 的 onChange 事件?

javascript - 如何防止 Firestore 索引出现多种组合

javascript - 如何使用 React refs、回调模式来更新状态

javascript - Hammer.js 在点击叠加层并将其移除时将焦点设置在叠加层下方的输入上

javascript - QUnit 测试返回 "TypeError: undefined is not a function"

css - 让 HTML5 背景视频填满视网膜显示器的高度有什么诀窍?

css - 如何在 slider 旋转上分层下拉菜单?

html - 占据所有剩余空间的 div 中的绝对定位 div