javascript - react -使用方法进行样式设置是一种很好的做法

标签 javascript reactjs

我有一个简单的 React 应用程序,这个应用程序的一些组件需要动态样式。是否允许使用方法,因为还有一些其他推荐的方法可以做到这一点?一切正常,但我不想使用一些反模式。

例如

class MyComponent extends React.Component {
  // ...
  block_style() {
   if (!!this.state.folder.image) {
     return {"backgroundImage": "url(" + this.state.folder.image + ")";
   } else {
     return {"backgroundColor": "orange"};
   }
  }

  render() {
    return (
      <div style={this.block_style.bind(this)()}>
        // ...
      </div>
    )
  }
}

最佳答案

这种方法存在三个问题,使其不是一个好的选择。

首先是您在 render() 函数中绑定(bind)函数。问题是当您 bind() 时,它实际上返回了一个新函数。由于您是在 render() 函数中创建的,因此每次渲染时,它都会看到新函数并始终重新渲染,从而创建许多不必要的渲染。您应该始终在 constructor() 或其他只会发生一次的地方进行绑定(bind)。

第二个很简单,就是在使用它的地方不需要bind()。您只需要在上下文可能丢失的情况下不立即调用它(例如将其传递给事件处理程序)时进行绑定(bind)。如果您立即调用它,那么您就有了上下文,无需绑定(bind)。

第三个与第一个类似。即使修复了 bind 问题,因为该函数返回一个新对象,您也会遇到与第一个问题类似的问题。由于它总是一个新对象(即使它包含相同的数据),它每次都会触发 React 重新渲染,从而创建很多不必要的渲染。

相反,更好的方法是在更新 state.folder 并创建和存储样式的同时更新 state:

someFuncWhereYouUpdateFolder() {
  const folder = getFolder();
  this.setState({
    folder,
    style: folder.image 
      ? { backgroundImage: `url(${folder.image})` } 
      : { backgroundColor: 'orange' }
  });
}

然后,您只需在渲染中使用该样式即可:

render() {
  return (
    <div style={ this.state.style }>
     { /* stuff */ }
    </div>
  );
}

有关不在 render() 中创建对象的更多信息,请参阅 this 等文章(特别是#6)和this .

关于javascript - react -使用方法进行样式设置是一种很好的做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50839263/

相关文章:

node.js - React + Material-UI |如何创建横向滚动卡片?

reactjs - React - FETCH 方法不读取我的 .json 文件

javascript - 使用 typescript 渲染 react 组件而不传递强类型 Prop

javascript - onmouseenter 事件不适用于 div 元素

javascript - 字符串计算的小数

javascript - 克隆javascript对象属性?

java - Unity 2d实例化鼠标位置问题,请指教

javascript - react 开发工具未在 Chrome 浏览器中加载

javascript - node.js 未正确将 JSON 写入文件

javascript - 传递 React Redux 意外键以创建商店