我试图在React JSX中使用switch case有条件地渲染组件。我正在尝试构建从特定json结构读取并呈现数据的内容。由于可以有许多不同的组件和数据,我试图动态呈现它。请参阅下面的代码,我没有收到任何错误,但组件没有得到渲染。在我的HTML中,我只能看到。这意味着循环不起作用。我尝试在vanilla JS中使用相同的循环,它的工作原理。
- var myPackage = [{
- sectionInfo:[{
- elementType: 1,text: "This is text from element type 1"
- }]
- },{
- sectionInfo:[{
- elementType: 2,text: "This is text from element type 2"
- }]
- }];
- var App = React.createClass({
- render: function(){
- var elements = [];
- elements = myPackage.map(function(myObj){
- myObj.sectionInfo.map(function(myObj1){
- switch(myObj1.elementType){
- case 1: return(
- <Component1 text = {myObj1.text}/>
- );
- break;
- case 2: return(
- <Component2 text = {myObj1.text}/>
- )
- break;
- }
- })
- });
- return(
- <div className="App">
- {elements}
- </div>
- )
- }
- });
- var Component1 = React.createClass({
- render:function(){
- return(
- <div className = "element1">
- {this.props.text}
- </div>
- )
- }
- });
- var Component2 = React.createClass({
- render:function(){
- return(
- <div className = "element2">
- {this.props.text}
- </div>
- )
- }
- });
- ReactDOM.render(<App/>,document.getElementById('container'));
编辑:对代码添加了一些内容,现在我遇到了一个新问题。这是新代码:
- var App = React.createClass({
- render: function(){
- var elements = [];
- elements = myPackage.map(function(myObj){
- return(
- <div>
- myObj.sectionInfo.map(function(myObj1){
- switch(myObj1.elementType){
- case 1: return(
- <Component1 text = {myObj1.text}/>
- );
- break;
- case 2: return(
- <Component2 text = {myObj1.text}/>
- )
- break;
- }
- }
- </div>
- )
- });
- return(
- <div className="App">
- {elements}
- </div>
- )
- }
- });
我希望每次都在div中渲染。因此,如果一个部分有超过3个元素,则所有3个必须在div内。
您应该从第一个.map返回值,在您的情况下,它是来自内部.map的结果
- var elements = myPackage.map(function(myObj){
- return myObj.sectionInfo.map(function(myObj1) {
- // ...
- });
- });
更新:
根据您的新更新,您可以像这样更改代码
- var App = React.createClass({
- section: function(myObj,parentIndex) {
- return myObj.sectionInfo.map(function(myObj1,index) {
- const key = parentIndex + '.' + index;
- switch(myObj1.elementType) {
- case 1:
- return <Component1 text = {myObj1.text} key={ key } />
- case 2:
- return <Component2 text = {myObj1.text} key={ key } />
- }
- });
- },render: function() {
- var elements = myPackage.map(function(myObj) {
- return <div>
- { this.section(myObj,index) }
- </div>
- },this);
- return <div className="App">
- { elements }
- </div>;
- }
- });