Jus*_*ein 64 javascript reactjs babeljs
我的目标是在页面/父组件上动态添加组件.
我从一些基本的示例模板开始,如下所示:
main.js:
var App = require('./App.js');
var SampleComponent = require('./SampleComponent.js');
ReactDOM.render(<App/>, document.body);
ReactDOM.render(<SampleComponent name="SomeName"/>, document.getElementById('myId'));
Run Code Online (Sandbox Code Playgroud)
App.js:
var App = React.createClass({
render: function() {
return (
<div>
<h1>App main component! </h1>
<div id="myId">myId div</div>
</div>
);
}
});
Run Code Online (Sandbox Code Playgroud)
SampleComponent.js:
var SampleComponent = React.createClass({
render: function() {
return (
<div>
<h1>Sample Component! </h1>
</div>
);
}
});
Run Code Online (Sandbox Code Playgroud)
这里SampleComponent安装到SampleComponent节点,该节点在App.js模板中预先编写.但是如果我需要向App组件添加无限数量的组件呢?显然我不能让所有必需的div坐在那里.
在阅读了一些教程后,我仍然不了解如何创建组件并动态添加到父组件.这样做的方法是什么?
Nik*_*kov 54
您需要将组件作为子项传递,如下所示:
var App = require('./App.js');
var SampleComponent = require('./SampleComponent.js');
ReactDOM.render(
<App>
<SampleComponent name="SomeName"/>
<App>,
document.body
);
Run Code Online (Sandbox Code Playgroud)
然后将它们附加到组件的主体中:
var App = React.createClass({
render: function() {
return (
<div>
<h1>App main component! </h1>
{
this.props.children
}
</div>
);
}
});
Run Code Online (Sandbox Code Playgroud)
您不需要手动操作HTML代码,React会为您执行此操作.如果你想添加一些子组件,你只需要更改道具或根据它来说明.例如:
var App = React.createClass({
getInitialState: function(){
return [
{id:1,name:"Some Name"}
]
},
addChild: function() {
// State change will cause component re-render
this.setState(this.state.concat([
{id:2,name:"Another Name"}
]))
}
render: function() {
return (
<div>
<h1>App main component! </h1>
<button onClick={this.addChild}>Add component</button>
{
this.state.map((item) => (
<SampleComponent key={item.id} name={item.name}/>
))
}
</div>
);
}
});
Run Code Online (Sandbox Code Playgroud)
首先,我不会使用document.body.而是添加一个空容器:
index.html:
<html>
<head></head>
<body>
<div id="app"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
然后选择仅渲染<App />元素:
main.js:
var App = require('./App.js');
ReactDOM.render(<App />, document.getElementById('app'));
Run Code Online (Sandbox Code Playgroud)
App.js您可以在其中导入其他组件并完全忽略您的DOM呈现代码:
App.js:
var SampleComponent = require('./SampleComponent.js');
var App = React.createClass({
render: function() {
return (
<div>
<h1>App main component!</h1>
<SampleComponent name="SomeName" />
</div>
);
}
});
Run Code Online (Sandbox Code Playgroud)
SampleComponent.js:
var SampleComponent = React.createClass({
render: function() {
return (
<div>
<h1>Sample Component!</h1>
</div>
);
}
});
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过使用将其导入必要的组件文件,以编程方式与任意数量的组件进行交互require.
首先警告:你永远不应该修改由 React 管理的 DOM,你可以通过调用ReactDOM.render(<SampleComponent ... />);
使用 React,您应该直接在主应用程序中使用 SampleComponent。
var App = require('./App.js');
var SampleComponent = require('./SampleComponent.js');
ReactDOM.render(<App/>, document.body);
Run Code Online (Sandbox Code Playgroud)
组件的内容无关紧要,但应该像这样使用:
var App = React.createClass({
render: function() {
return (
<div>
<h1>App main component! </h1>
<SampleComponent name="SomeName"/>
</div>
);
}
});
Run Code Online (Sandbox Code Playgroud)
然后,您可以扩展应用程序组件以使用列表。
var App = React.createClass({
render: function() {
var componentList = [
<SampleComponent name="SomeName1"/>,
<SampleComponent name="SomeName2"/>
]; // Change this to get the list from props or state
return (
<div>
<h1>App main component! </h1>
{componentList}
</div>
);
}
});
Run Code Online (Sandbox Code Playgroud)
我真的建议您查看 React 文档,然后按照“入门”说明进行操作。你花在这上面的时间将会在以后得到回报。
https://facebook.github.io/react/index.html
小智 6
根据克里斯的回答,在这里分享我的解决方案。希望它可以帮助其他人。
我需要动态地将子元素附加到我的 JSX 中,但比我的 return 语句中的条件检查更简单。我想在子元素还没有准备好的情况下显示一个加载器。这里是:
export class Settings extends React.PureComponent {
render() {
const loading = (<div>I'm Loading</div>);
let content = [];
let pushMessages = null;
let emailMessages = null;
if (this.props.pushPreferences) {
pushMessages = (<div>Push Content Here</div>);
}
if (this.props.emailPreferences) {
emailMessages = (<div>Email Content Here</div>);
}
// Push the components in the order I want
if (emailMessages) content.push(emailMessages);
if (pushMessages) content.push(pushMessages);
return (
<div>
{content.length ? content : loading}
</div>
)
}
Run Code Online (Sandbox Code Playgroud)
现在,我确实意识到我也可以直接把{pushMessages}和{emailMessages}放在我的return()下面,但假设我有更多的条件内容,我的return()看起来会很混乱。