【问题标题】:Change react component css based on props with css-modules使用 css-modules 根据 props 更改 react 组件 css
【发布时间】:2020-05-01 07:43:33
【问题描述】:

我有以下几点:

className={`${this.props.match.params.id}.alert`}

/* desired output = `className="style_alert__3TLGs"` */
/* instead output = `className="style.alert"` */

如果我硬编码类名(例如{style.alert}),我会得到所需的输出。似乎结果是一个字符串,并且没有由 css-module 包处理(可能是因为它是在之后渲染的?),我该如何更改它以便 className 由 css-module 处理并按我的意图捆绑?

参考文档:css-modules

【问题讨论】:

  • 我不明白你想做什么。为什么要向班级发送 id ? ${this.props.match.params.id}.alert 会变成 className="48.alert"
  • 当您使用字符串插值时,结果将是一个字符串,这并不意外。 this.props.match.params.id 的值是多少?
  • @ValentinDuboscq - 非常简单,id 代表一个 css 模块,我想调用一个可重用的组件,样式会根据使用的 id 而变化。然后由 css-modules 包处理。这是一个非常简单的例子:create-react-app.dev/docs/adding-a-css-modules-stylesheet
  • @DrewReese 上面示例中的值是“风格”,我知道这并不意外,但我的问题是如何使用可能每次都不同的道具来达到我想要的结果并拥有它由 css-modules 包正确处理?
  • @DrewReese 我认为他想根据 id 动态导入不同的 css 模块。也许我不太明白,但我认为这不是做你想做的事的权利。

标签: reactjs css-modules react-css-modules


【解决方案1】:

选项 1: 导入您知道会使用的所有样式模块

创建一个导入的“样式”对象的映射,以通过 prop 中传递的ids 进行键控。只需要确保所有“样式”对象都具有所有相同的 CSS 属性,例如“警报”,当然,还要在 id 参数的对象路径上使用保护模式,这样就不会出现“未定义的”访问。

import styles1 from "....";
import styles2 from "....";
...

const stylesMap = {
  style1Id: styles1,
  style2Id: styles2,
  ...
};

...

className={stylesMap[this.props.match.params.id].alert}

优点:前端加载您需要的所有 CSS 模块,并且可能更容易推理和调试

缺点:使用更多资源

选项 2:使用动态导入

创建一个异步函数来“获取”所需的 CSS 模块,并使用组件生命周期函数或效果挂钩来更新样式对象引用。

const loadStyle = async (...params) => {
  try {
    const styleObject = await import(...path and module name from params);
    // setState or useState setter to set style object
  } catch {
    // set a fallback style object
  }
}
...

componentDidMount() {
  // check props.match.params.id
  // gather up other CSS module path details
  // trigger dynamic CSS module load
  loadStyle(... CSS module path detials);
}
**OR**
useEffect(() => {
  // check props.match.params.id
  // gather up other CSS module path details
  // trigger dynamic CSS module load
  loadStyle(... CSS module path detials);
}, [props.match.params.id, ...any other dependencies]);

...

className={stylesMap[<this.>state.styleObject].alert}

优点:体积更小/资源使用更少。

缺点:由于未提前获取资源,因此渲染时可能会有更多延迟。

注意:还取决于您的应用使用情况、需求和要求。例如,如果它是一个捆绑应用程序(想想 cordova/phonegap、electron 等),那么包含您需要的所有资源会更明智。

【讨论】:

  • 太棒了!不知道这是可能的 - 感谢您分享您的智慧!
  • 也许使用dynamic import 是最好的方法,因为您不需要导入所有文件。
  • @ValentinDuboscq 我包含了使用动态导入的想法,谢谢。随时指出任何缺陷/错误。
猜你喜欢
  • 2017-10-10
  • 1970-01-01
  • 2021-12-21
  • 2021-04-30
  • 2018-04-04
  • 2017-02-11
  • 2016-12-16
  • 2020-11-02
  • 2018-05-17
相关资源
最近更新 更多