【问题标题】:How to use an array containing some component names to render those predefined components如何使用包含一些组件名称的数组来呈现那些预定义的组件
【发布时间】:2020-05-13 09:55:07
【问题描述】:

好的,所以我有这个问题,它并不像听起来那么简单。我正在设计一个可以添加我的文章的网络项目。现在的问题是一篇文章将是一个很大的页面,需要大量的格式和其他东西。因此,我想在我写的每一篇文章中添加一个组件。

例如,假设它的 ArticleX.js

export const ArticleX = () => {
return (
    <div>
        //My article X goes here
    </div>
)}

同样假设我也有很多其他文章。比方说,还有2个。文章A,文章B。

到目前为止一切顺利。现在我有一个名为 ShowArticles.js 的页面,它只不过是另一个 React 组件,它需要渲染我们刚才谈到的所有这些文章。

一个简单的方法是在 ShowArticles 中做这样的事情:

import {Article X} from './Articles/ArticleX';
import {Article A} from './Articles/ArticleA';
import {Article B} from './Articles/ArticleB';

export const ShowArticles = () => {
    return (
        <div>
            <Article X />
            <Article A />
            <Article B />
        </div>
    )
}

现在的问题是文章会继续增加,每次我都必须修改 ShowArticles.js 文件以适应新的变化。相反,我想制作这些组件的数组,如果不可能,则使用组件名称,然后使用它来动态呈现它们。 想象一个数组,就像从 json 文件中提取一些 json 数据一样。

所以假设我创建了一个组件名称数组。

let travelArticles = [
    {id: 1, articleName: 'ArticleX', source:'./Articles/ArticleX'},
    {id: 2, articleName: 'ArticleA', source:'./Articles/ArticleA'},
    {id: 3, articleName: 'ArticleB', source:'./Articles/ArticleB'}
];

现在的问题是,我如何使用这个数组来重新构建我的 ShowArticles.js 文件,以便获取这些组件名称和源中的每一个,然后将这些信息用于: 1. 从源中导入该组件 2。在 ShowArticles.js 中渲染该组件

export const ShowArticles = ({travelArticles}) => {
    return (
        <div>
            // How to import components using source and name in travelArticles and then use that information to render them ?
        </div>
    )
}

现在,如果我能做这样的事情,我需要做的就是创建新文章,然后在数组中添加它的名称和来源。剩下的一切都将由代码本身处理,而且我可以使用这个数组在其他页面上显示一些特色内容,而不仅仅是 ShowArticles.js

提前致谢!

【问题讨论】:

  • 您是否有理由不只是拥有一个 Article 组件,然后将特定于文章的详细信息作为道具传递给它?
  • 我建议使用包含样式和布局的模板“文章”组件,并将您的内容导入为 markdown 或 html 并为每个页面设置文章组件的内部 html。
  • 嗯,是的,因为一篇文章可以包含任何信息(包括不同样式的字体、段落、容器到几乎任何地方嵌入的图像。如果我制作一个组件并将所有这些值作为道具传递,我就会松动那个功能。我的意思是我不会放弃它,但是当我想在两个段落之间显示图像时呢?我不能使用道具做类似的事情,除非并且直到我已经知道该特定项目必须放在何时何地在该组件内部,这件事也会因一篇文章而异。

标签: javascript arrays reactjs react-component


【解决方案1】:

您可以使用动态导入

let travelArticles = [
    {id: 1, articleName: 'ArticleX', source:'./Articles/ArticleX'},
    {id: 2, articleName: 'ArticleA', source:'./Articles/ArticleA'},
    {id: 3, articleName: 'ArticleB', source:'./Articles/ArticleB'}
];

export const ShowArticles = ({travelArticles}) => {
    const [components, setComponents] = useState([]); 
    useEffect(() => {
      const promises = travelArticles.map(art => import(art.source).then(mod => mod.default));
      Promise.all(promises).then(comps => setComponents(comps));
    }, []);
    return (
        <div>
            {components.map((Article, index) => <Article {...travelArticles[index]} />)}
        </div>
    )
}

【讨论】:

  • 你可能需要稍微调整一下,因为这不是我在真实场景中测试过的东西
  • 它说找不到模块'./Articles/ArticleX'。
  • @DivyamDhadwal 谷歌一下动态导入是如何工作的,也许你的路径无效
  • 好吧,我检查了动态导入是如何工作的。我尝试重新构建我的代码,但我得到一个或另一个错误。我的意思是,即使我做了与其他一些 stackoverflow 线程中描述的相同的事情,我仍然会遇到问题。我什至使用了一个名为 react-loadable 的第三方文件。即使那样也不适合我。我不明白发生了什么,但这个问题真的让我很生气。我已经卡了2天多了,不知道该怎么办。
猜你喜欢
  • 1970-01-01
  • 2019-10-22
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 2016-12-31
  • 2019-03-20
相关资源
最近更新 更多