[英]React render components from string
是否可以从字符串动态渲染React组件?
基本上,我的页面内容来自数据库,并且我希望内容中包含React组件。 我正在尝试实现的示例:
var html_string = '<i>React Component Rendered</i>: <Hello name="World" />';
var Hello = React.createClass({
render: function() {
return <strong>Hello {this.props.name}</strong>;
}
});
function createMarkup() { return {__html: html_string}; };
var App = React.createClass({
render: function() {
return <div dangerouslySetInnerHTML={createMarkup()} />;
}
});
ReactDOM.render(
<App/>,
document.getElementById('container')
);
但是它只是呈现HTML而没有评估<Hello/>
:
<div><i>React Component Rendered</i>: <hello name="World"></hello></div>
我试图得到:
<div><i>React Component Rendered</i>: <strong>Hello World</strong></div>
JSfiddle上的此示例: https ://jsfiddle.net/26czprne/
正如thangngoc89所说,没有办法做到这一点。 至少没有简单的方法。
JSX被编译为javascript,语法上仅看起来像xml。
这个:
var x = <div> <i>React Component Rendered</i>: <Hello name="World" /> </div>;
映射到:
var x = React.createElement(
"div",
null,
" ",
React.createElement(
"i",
null,
"React Component Rendered"
),
": ",
React.createElement(Hello, { name: "World" }),
);
更好的策略可能是解析数据库元素,然后使用react动态呈现db查询的结果(这也会促进松散耦合)。
可能要晚一点参加这个聚会,但是发现自己需要做些类似的事情,并且在网上搜索后,我发现这实际上在技术上是可行的(除了安全问题)-除了一个不错的反应包:
https://github.com/TroyAlford/react-jsx-parser
import React, { Component } from 'react'
import JsxParser from 'react-jsx-parser'
class InjectableComponent extends Component {
// ... inner workings of InjectableComponent
}
class MyComponent extends Component {
render() {
/* Pull out parent props which shouldn't be bound,
then pass the rest as `bindings` to all children */
const { prop1, prop2, ...bindings } = this.props
return (
<JsxParser
bindings={bindings}
components={{ InjectableComponent }}
jsx={'\
<h1>Header</h1>\
<InjectableComponent />\
'}
/>
)
}
}
全部归功于TroyAlford!
你问的是不可能的。 React会转储您通过dangerouslySetInnerHTML
提供的字符串。 它不会评估其中的任何内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.