Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 动态导入:根据需要导入css模块_Reactjs_Css Modules_Dynamic Import - Fatal编程技术网

Reactjs 动态导入:根据需要导入css模块

Reactjs 动态导入:根据需要导入css模块,reactjs,css-modules,dynamic-import,Reactjs,Css Modules,Dynamic Import,我想根据通过组件传递的道具动态导入css模块 我的js文件是这样的 import css from './MenuItem.module.styl' /* .... */ const MenuItem = ({ node, isTitle, isHeader, pathname, hoveredItem }) => { const linkClasses = classNames(css.someClass, {[css.someOtherClass]: isHe

我想根据通过组件传递的道具动态导入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>
  )
}
但是我得到一个错误,导入语句应该在文件的请求处

我试过了

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 firstclass=
类名(firstCssModule.someClass,{[firstCssModule.someOtherClass]:isHeader})
const secondClasses=classNames(secondCssModule.someClass,{[secondCssModule.someOtherClass]:isHeader})
const mixedClasses=类名(firstCssModule.someClass,{[secondCssModule.someOtherClass]:isHeader})
字典和计算属性
const styles={
第一个:firstCssModule,
第二个:第二个CSSModule
}
const currentModule='first';
样式[currentModule].someClass
样式[currentModule].someOtherClass
有了类名,你就可以得到类似这样的东西了

{[styles[currentModule].someOtherClass]:isHeader}
验证
const getStyles=moduleName=>{
if(样式中的moduleName){
返回样式[moduleName];
}否则{
/*moduleName不存在,请执行某些操作
(例如,返回默认值或抛出错误)*/
返回styles.first;//默认值
}
/* ... */
getStyles(currentModule).someClass;
classnames
在这种情况下:

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

如果只有几个类,我会这样做,但是有很多类,所以我必须将此条件添加到所有类中。如果没有其他方法,我可能会这样做。谢谢you@user3808307我更新了我的答案。我希望这将有助于现在添加的验证。即使这会影响性能和用户体验,你真的想动态加载css文件吗?想象一下,您的用户通过单击按钮必须等待所有css文件加载并应用(阅读主题“关键渲染路径”)。但您可以导入这两个文件,然后根据条件使用它们。是的,Iit会增加首次加载,但不会影响用户使用站点时的加载。
import  firstCssModule from './MenuItem.firstModule.styles';
import  secondCssModule from './MenuItem.secondModule.styles';

/* ... */

isHeader ? firstCssModule.someClass secondCssModule.someClass