2017-11-20 7 views
1

私は2つのネストされたmapを持つように達成することはできません。JSXのマップでネストループを使用するにはどうすればよいですか?

render() { 
    return (
     <table className="table"> 
     <tbody> 
      {Object.keys(this.state.templates).map(function(template_name) { 
      return (
       <tr key={template_name}><td><b>Template: {template_name}</b></td></tr> 

       {this.state.templates[template_name].items.map(function(item) { 
       return (
        <tr key={item.id}><td>{item.id}</td></tr> 
       ) 
       })} 
      ) 
      })} 
     </tbody> 
     </table> 
    ) 
    } 

これはSyntaxError: unknown: Unexpected tokenを与えます。

JSXでmapコールをネストするにはどうすればよいですか?

+0

:あなたは、以下のように試みることができますか? –

+0

@MattHolland React 16.1.1 – vmarquet

答えて

3

要素内にラップする必要があります。

このような

何か(私が原因のテーブル要素の規則に余分trを追加しました):

render() { 
    return (
     <table className="table"> 
     <tbody> 
      {Object.keys(templates).map(function (template_name) { 
      return (
       <tr key={template_name}> 
       <tr> 
        <td> 
        <b>Template: {template_name}</b> 
        </td> 
       </tr> 
       {templates[template_name].items.map(function (item) { 
        return (
        <tr key={item.id}> 
         <td>{item}</td> 
        </tr> 
       ); 
       })} 
       </tr> 
      ); 
      })} 
     </tbody> 
     </table> 
    ); 
    } 
} 

(テーブルなし)の例を実行:

const templates = { 
 
    template1: { 
 
    items: [1, 2] 
 
    }, 
 
    template2: { 
 
    items: [2, 3, 4] 
 
    }, 
 
}; 
 

 
const App =() => (
 
    <div> 
 
    { 
 
     Object.keys(templates).map(template_name => { 
 
     return (
 
      <div> 
 
      <div>{template_name}</div> 
 
      { 
 
       templates[template_name].items.map(item => { 
 
       return(<div>{item}</div>) 
 
       }) 
 
      } 
 
      </div> 
 
     ) 
 
     }) 
 
    } 
 
    </div> 
 
); 
 
ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id="root"></div>

+2

はい、要素を使って動作させたものをラップします。しかし、ネストされた ''は無効ですので、私はあなたのソリューションを正確に使用していませんでしたが、http://validator.w3.org/nu/によると、代わりに、私は ''でラップしました。いくつかの ' 'を1つのテーブルに持つことは有効なHTMLです(例:https://stackoverflow.com/a/3076790/3486743)。とにかくありがとうございました。 – vmarquet

0

I戻り値の型はReact16のオブジェクトではなく配列でなければならないという問題があると考えてください。あなたはどちらを使用しているリアクトのバージョン

class App extends React.Component { 
 
    constructor(props) { 
 
    super(props) 
 
    this.state = { 
 
     templates: { 
 
     foo: { 
 
      items: [ 
 
      {id: 0},{id:1} 
 
      ] 
 
     }, 
 
     bar: { 
 
      items: [ 
 
      {id: 2},{id:3} 
 
      ] 
 
     } 
 
     } 
 
    } 
 
    } 
 
    
 
    renderTemplate = (template, name) => { 
 
    let data = [] 
 
    data = template.items 
 
    data.unshift({ name: name }) 
 
    return data.map((item, index) => <tr key={index}><td>{item.name ? item.name : item.id}</td></tr>) 
 
    } 
 
    
 
    render() { 
 
    return (
 
     <table> 
 
     <tbody> 
 
      {Object.keys(this.state.templates).map(name => { 
 
      return this.renderTemplate(this.state.templates[name], name) 
 
      })} 
 
     </tbody> 
 
     </table> 
 
    ) 
 
    } 
 
} 
 

 

 

 
ReactDOM.render(<App />, document.getElementById('root'))
td { 
 
    color: white; 
 
    padding: 0 20px; 
 
    background: grey; 
 
}
<div id="root"></div> 
 

 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.1.1/umd/react.production.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.1.1/umd/react-dom.production.min.js"></script>

関連する問題