我试图让我的"智能"弹出组件,它可以在其自身内部打开一些组件,但我的意识并不好,因为它不起作用。
我使用redux方法创建弹出窗口,打开弹出窗口的操作能够在弹出窗口打开之前获取任何组件的名称;
但是我遇到了一些问题,在获取参数后,在我们的情况下它是 nameOfComponent ,我需要选择并呈现名称为 nameOfComponent 的组件
现在我的问题是,它如何从数组中呈现组件?
// He's my components
import Login from '../Login/login.js';
import Logout from '../Logout/logout.js';
const popupContent = {
Login : Login,
logout: Logout
};
// My component
class Popup extends Component {
componentDidUpdate () {
// for example
const nameOfComponent = "Login";
this.body = this.setBodyPopup(nameOfComponent);
return true;
}
setBodyPopup(property){
return popupContent[property];
}
render() {
// I want to render some element from popupContent here
<div>
// <this.body /> // it's jsx format
{this.body}
</div>
}
}
答案 0 :(得分:4)
我在这里添加了工作示例JSfiddle ReactJS
你不必使用JSX。如果你这样做,正确的方法是使用工厂。您还可以在render方法中呈现常规HTML,以及使用大括号在代码中使用vanilla javascript。
另外,我建议映射并迭代数组中的所有项目,并在render方法中逐个渲染它们
见下面的例子:
var Login = React.createClass({
render: function() {
return <div>{this.props.name}, logged in</div>;
}
});
// React with JSX
ReactDOM.render(<Login name="John" />,
document.getElementById('containerJSX'));
// React without JSX
var Login = React.createFactory(Login);
ReactDOM.render(Login({ name: 'Tim' }),
document.getElementById('containerNoJSX'));
答案 1 :(得分:0)
正如评论员所建议的那样,您可能希望在构造函数中或在render方法本身中指定this.body
。
但是,如果我理解您的意图正确,您可以使用this.props.children
代替。
例如。
<Popup><MyInnerComponent></Popup>
并在Popup render
方法
render() {
<div>
{this.props.children}
</div>
}
答案 2 :(得分:0)
React实际上允许您使用带有JSX语法的变量来实例化组件。你实际上应该能够打电话给<this.body />
并让它发挥作用; 然而你的不会因为你没有在this.body
方法之前定义componentDidUpdate
,这意味着它将在第一次渲染时未定义并且会破坏所有内容。我建议使用本地组件状态代替this.body
,并确保从一开始就定义它。
至少,在构造函数中将this.body
实例化为某个值:
constructor(props) {
super(props);
this.body = 'Login';
}
答案 3 :(得分:0)
只要<this.body />
具有实际值,您就可以使用this.body
呈现组件。也许你只需要:
render() {
return <div>
{this.body ? <this.body /> : null}
</div>
}
但是,根据您提供的示例,您可以将componentDidMount
的内容放在constructor
中,因为构造函数是在第一次渲染过程之前调用的。
答案 4 :(得分:0)
我认为你正在寻找像dangerouslySetInnerHtml这样的东西。
<div dangerouslySetInnerHTML={this.body} />