动态导入:导入 css 模块取决于

Dynamic imports: importing a css module depending

我想根据通过组件传递的道具动态导入 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) 
        })
    }
  });

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

你可以试试这个

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 }