javascript - 如果该文件存在,则动态导入 React 组件,否则显示默认消息

标签 javascript reactjs webpack jsx eslint

如果文件存在,我想有条件地导入 React 组件,如果不存在,则执行其他操作。例如显示默认 View 或消息。

我试过这个:

let Recipe;
try {
  Recipe = require(`docs/app/Recipes/${props.componentName}`);
} catch (e) {
  Recipe = () => <div>Not found</div>;
}

但是 linter 提示我不应该尝试动态要求一个文件,而是使用字符串文字。

对于我想要实现的目标,是否有更简洁的方法?

最佳答案

问题是这种方法会破坏捆绑优化并包含来自 docs/app/Recipes/ 的所有文件打包成一个包,即使它们没有被使用。

更好的写法是使用 <React.Suspense>React.lazy :

const Recipe = React.lazy(() =>
  import(`docs/app/Recipes/${props.componentName}`)
  .catch(() => ({ default: () => <div>Not found</div> }))
);

用作:

<React.Suspense fallback={'loading...'}><Recipe/></React.Suspense>

执行此操作并避免 linter 错误的更简洁方法是拥有可能组件的映射:

import Foo from 'docs/app/Recipes/Foo';
import Bar from 'docs/app/Recipes/Bar';
...

const componentsMap = { Foo, Bar };

...

const Recipe = componentsMap[props.componentName] || () => <div>Not found</div>;

在这种情况下 props.componentName如果需要,可以进行验证。

关于javascript - 如果该文件存在,则动态导入 React 组件,否则显示默认消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53326353/

相关文章:

javascript - 更新循环内对象内的变量

将键映射到值并允许对键进行迭代的 Javascript 对象

javascript - React.js 组件生命周期、状态行为和 JavaScript 的异步特性

reactjs - Laravel 中的 react 路由器

javascript - 无法使用 webpack 将 LESS 加载到页面中

javascript - 如何设置 webpack 以支持 Node 中的 ES6 模块

javascript - 多个选择器不起作用

JavaScript 函数调用

javascript - react 和 Redux : 401 Unauthorized Error POST API Request

jquery - 如何使用 webpack 添加 jquery-ui css/图像