JSX

2016-03-03 27 views
7

Sorun yanıt verin. Örneğin. JSX

import React from 'react' 
import _ from 'lodash' 

let { Component } = React 

export default class DataList extends Component { 
    render() { 
    let array = [ 
     {def: 'item1', term: 'term1', obj1: 'rand'}, 
     {def: 'item2', term: 'term2'} 
    ] 
    return (
     <dl> 
     {_.map(array, (item) => { 
      return (
      <dt>{item.def}</dt> 
      <dd>{item.term}</dd> 
     ) 
     })} 
     </dl> 
    ) 
    } 
} 

burada DOM yapısını kıracak bir kap elemanı, onları sarma olmadan kardeşlerin hale izin vermez yanıt verin.

cevap

10

Böyle reduce ile daha basit bir şey yapabilirsiniz:

import React, { Component } from 'react'; 

export default class DataList extends Component { 
    render() { 
    const array = [ 
     {def: 'item1', term: 'term1', obj1: 'rand'}, 
     {def: 'item2', term: 'term2'} 
    ]; 

    return (
     <dl> 
     {array.reduce((acc, item, idx) => { 
      return acc.concat([ 
       <dt key={`def-${idx}`}>{item.def}</dt>, 
       <dd key={`term-${idx}`}>{item.term}</dd> 
      ]); 
     }, [])} 
     </dl> 
    ); 
    } 
} 

DEMO :: https://jsfiddle.net/rifat/caray95v/

+2

ha, çok güzel ... nasıl çalıştığını anlamaya birkaç saniye sürdü, bu sadece olumsuz (kod okunabilirliği POV'sinden biraz daha az anlaşılır), ama çok fazla daha zarif bir çözüm ve bundan sonra kullanacağım bir tane. – stukennedy

+0

Bir şey daha: genellikle dizinden dizinin anahtar olarak kullanılmasını önermez. İşte harika bir yazı: https://medium.com/@robinpokorny/index-as-a-key-is-an-anti-pattern-e0349aece318 – Kiril

0

Bunu gerçekleştirmenin en kolay yolunu, nesnenin her bir öğesi için nesne anahtarlarının (bu özelliği destekler) eşlemesi ve her bir öğe türünü koşullu olarak oluşturmasıdır.

import React from 'react' 
import _ from 'lodash' 

let { Component } = React 

export default class DataList extends Component { 
    render() { 
    let array = [ 
     {def: 'item1', term: 'term1', obj1: 'rand'}, 
     {def: 'item2', term: 'term2'} 
    ] 

    return (
     <dl> 
     {_.map(array, (item) => { 
      return _.map(item, (elem, key) => { 
      if (key === 'def') { 
       return <dt>{elem}</dt> 
      } else if (key === 'term') { 
       return <dd>{elem}</dd> 
      } 
      }) 
     })} 
     </dl> 
    ) 
    } 
} 
0

bu gibi kullanabilirsiniz, 16.2 Fragments desteği eklendi tepki:

return (
    <dl> 
    {_.map(array, (item) => { 
     return (
     <Fragment> 
      <dt>{item.def}</dt> 
      <dd>{item.term}</dd> 
     </Fragment> 
    ) 
    })} 
    </dl> 
) 

Ayrıca, aşağıdaki gibi boş etiketli Fragmenti kullanabilirsiniz:

return (
    <dl> 
    {_.map(array, (item) => { 
     return (
     <> 
      <dt>{item.def}</dt> 
      <dd>{item.term}</dd> 
     </> 
    ) 
    })} 
    </dl> 
) 

Ama Fragment etiketi üzerinde key özellik kullanmak istiyorsanız bunu tam sürümünü kullanmak zorunda olduğunu unutmayın. this react's blogu hakkında daha fazla bilgi