【问题标题】:Dynamic imports: importing a css module depending动态导入:根据情况导入 css 模块
【发布时间】:2020-03-31 07:49:15
【问题描述】:

我想根据通过组件传递的道具动态导入 css 模块

我的js文件是这样的

import css from './MenuItem.module.styl'
/* .... */
const MenuItem = ({ node, isTitle, isHeader, pathname, hoveredItem }) => {      

  const linkClasses =
    classNames(css.someClass, {[css.someOtherClass]: isHeader})

  const subItemsContainerClasses = classNames(css.someClass, {[css.someOtherClass]: isHeader})

  const itemsContainerClasses = classNames(css.someClass, {[css.someOtherClass]: isHeader})



  return (
    <div className={itemsContainerClasses}>
      /* etc */
    </div>
  )
}

它变得非常混乱,所以我想根据 isHeader 属性导入不同的 css 模块

我将如何以及在哪里这样做?它应该在组件内部,但如果我使用Effect,我将如何引用css 部分

编辑:

我试过了

useEffect(() => {
    if (isheader) {
      import css from './MenuItemHeader.module.styl'
    } else {
      import css from './MenuItemFooter.module.styl'
    }
  });

但我得到一个错误,导入语句应该在文件的请求中

我试过了

const [css, setCss] = useState({});

useEffect(() => {
    if (isHeader) {
      import('./MenuItemHeader.module.styl')
        .then((response) => {                    
          setCss(response) 
        })
    } else {    
      import('./MenuItemFooter.module.styl')
        .then((response) => {                    
          setCss(response) 
        })
    }
  });

我没有收到任何错误,但没有应用样式

【问题讨论】:

  • 您是否真的要动态加载 css 文件,即使这会影响性能和用户体验?想象一下,您的用户通过单击按钮必须等到所有 css 文件加载并应用(阅读主题“关键渲染路径”)。
  • 但是你可以同时导入,然后按条件使用。是的,它增加了首次加载,但不影响用户使用站点时的加载。

标签: reactjs css-modules dynamic-import


【解决方案1】:

你可以试试这个

import  firstCssModule from './MenuItem.firstModule.styles';
import  secondCssModule from './MenuItem.secondModule.styles';

/* ... */

isHeader ? firstCssModule.someClass secondCssModule.someClass

类名

const firstClasses =
    classNames(firstCssModule.someClass, {[firstCssModule.someOtherClass]: isHeader})

const secondClasses = classNames(secondCssModule.someClass, {[secondCssModule.someOtherClass]: isHeader})

const mixedClasses = classNames(firstCssModule.someClass, {[secondCssModule.someOtherClass]: isHeader})

字典和计算属性

const styles = {
  first: firstCssModule,
  second: secondCssModule
}

const currentModule = 'first';

styles[currentModule].someClass
styles[currentModule].someOtherClass

有了类名,你可以像这样,没关系。

{ [styles[currentModule].someOtherClass]: isHeader }

验证

const getStyles = moduleName => {
  if (moduleName in styles) {
    return styles[moduleName];
  } else {
    /* moduleName doesn't exist, do something
(for example, return default or throw an error) */
    return styles.first; // default
  }

/* ... */

getStyles(currentModule).someClass;

classnames 在这种情况下:

{ [getStyles(currentModule).someOtherClass]: isHeader }

【讨论】:

  • 如果只有几个类我会,但有很多,所以我必须将这个条件添加到所有这些类中。也许如果没有其他方法我会。谢谢
  • @user3808307 我更新了我的答案。我希望它现在会有所帮助
  • 添加验证
  • 所有这些解决方案都不是动态导入的。您仍在导入这两个文件。我目前正在研究像 loadable 这样的库,它可以进行动态组件导入,并且可能对将 css 模块作为组件导入有用。
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 2011-04-17
  • 2023-02-01
  • 1970-01-01
  • 2021-05-21
  • 2020-03-11
相关资源
最近更新 更多