是否可以从外部源获取HTML / JSX内容并在React中动态呈现它?在我们的例子中,我们想从Wordpress
API中获取内容,并在客户端和服务器上都进行渲染(我们正在使用NextJS)
因此,Wordpress API返回一个JSON响应,其中包括一个content属性,该属性是一串HTML / JSX。内容看起来像这样。
{
content: "<div><Slider imageCount="5" galleryID="1"></Slider><span>This is an image gallery</span></div>"
}
因此,如您所见,它将是HTML和React组件/ JSX的混合,表示为字符串
我将使用Axios进行调用以获取内容(使用NextJS的getInitialProps()方法在服务器和客户端上),然后我需要呈现它,但是我是新手,我可以看到几个问题。
1)在React中,JSX是在构建时而不是运行时编译的,我看不出如何解决这个问题(例如,在Angular中使用$ compile服务会很容易)。
2)由于我们不知道Wordpress的内容将使用哪些组件,因此我们必须在页面顶部导入其中的每个组件,其中的内容可能包含组件,也可能包含组件,谁知道?。
现在,我认为这是不可能的,这意味着我们不得不重新考虑使用React,但是我真的希望有人能够回答。
任何帮助将不胜感激。
有趣的问题!
您应该尝试react-jsx-parser。我认为这可以解决您的问题。不确定它如何与Next JS一起使用-我对Next JS没有任何经验。
查看此沙箱:
您对捆绑的所有组件都是正确的。有一个解决方法。:)
查看此沙箱:
我创建了一个dynamicComponent
期望导入承诺并返回一个组件的。
我更改了在中导入A,B和C组件的方式index.js
。这样,每个 动态 导入的组件都会获得一个单独的捆绑包,并且仅在需要时才请求。
这应该可以解决您的第二个问题。
问题内容: 在React JSX中,似乎无法执行以下操作: 我收到一个解析错误:意外令牌{。这不是React可以处理的吗? 我正在设计此组件,以便在内部隐藏的值将包含有效的HTML元素(h1,p等)。有什么办法可以使这项工作吗? 问题答案: 您不应该将组件子弹放在花括号中: 这是一个有效的小提琴:http : //jsfiddle.net/kb3gN/6668/ 此外,您还可以找到JSX编译器,有
问题内容: 我在尝试使用数据数组呈现元素时遇到问题。在的下面的代码中,可以正常工作,但列表项未出现。 我究竟做错了什么?请随时指出并非最佳做法的任何内容。 问题答案: GoshaArinich是正确的,您应该返回您的元素。但是,在这种情况下,您应该在浏览器控制台中收到讨厌的红色警告 数组或迭代器中的每个子代都应具有唯一的“键”道具。 因此,您需要在列表中添加“键”: 或使用es6 箭头功能放下并做
问题内容: 我有一个React组件,其中有许多子组件。我不希望立即渲染子组件,而是要经过一段时间的延迟(对于每个子组件而言,它们是统一的还是不同的)。 我想知道-有没有办法做到这一点? 问题答案: 我认为最直观的方法是给孩子一个“ wait” ,在从父代传递过来的持续时间内隐藏该组件。通过将默认状态设置为隐藏,React仍会立即渲染组件,但是直到状态更改后它才可见。然后,您可以设置为调用一个函数,
我使用的是React Router v4的最新版本,我试图在div中呈现我的页面组件Home/About,但我遇到的问题是,如果我将路由添加到我的头中,它将切换路由,但它们将显示Home/About组件作为头的一部分,而不是我希望它们出现的位置。 如果我将路由放入中,则路由器不工作,但不会在控制台上抛出任何错误。 如何在div中显示和切换组件? 网页链接 app.js Header.js home
问题内容: 我在弄清楚为什么我的应用程序执行无尽渲染时遇到问题。 在内部,我的有状态组件,我正在componentDidMount方法中调用redux动作(调用componentWillMount也可以进行无尽渲染) 在CoinCard中,我实际上不做任何事情(在Flat列表内注意CoinCard) 现在,当我控制台登录我的硬币卡渲染时,我可以 在此处* 看到 Inside rende的 无限日志
问题内容: 这是我的组件代码的片段: 但是,当我运行此代码时,在出现意外的令牌错误。为什么会发生这种情况,我该如何解决? 问题答案: 您必须将方法调用包装在JSX元素中,否则Babel不会将return语句识别为JSX或在这种情况下为内联JSX表达式。它不会将您的代码从JSX转换为纯JavaScript,因此会出现错误。实际上,它被解释为 对象文字 ,而不是您期望的内联JSX表达式: 解决方案是将