Most efficient way of rendering JSX elements when iterating on array of data in React

后端 未结 8 1202
無奈伤痛
無奈伤痛 2020-12-09 17:42

I have an array which contains objects. I am creating a map of this array to renders the names with a span component.

let data = [{\"id\": \"01\         


        
相关标签:
8条回答
  • 2020-12-09 18:30

    You may use this for best understanding

     const data = [{id: 1, name: 'a'}, {id: 2, name: 'b'}];
    
    export default class App extends React.Component {
      render() {
        return (
          <div>
            {data.map((data, dataIndex ) => <span key={dataIndex}>{data.name}</span>)}
          </div>
        );
      }
    }
    

    Here you can understand that the name belongs to with attribute.

    0 讨论(0)
  • 2020-12-09 18:33

    Mostly, I follow this rule:

    Create a component which renders the items

    // in some file
    export const RenderItems = ({data}) => {
      return data && data.map((d, i) => <span key={d.id}>{d.name}</span>) || null
    }
    

    Hook the RenderItems

    import { RenderItems } from 'some-file'
    
    class App extends Component {
      render() {
        // you may also define data here instead of getting data from props
        const { data } = this.props
        return (
          <div>
            <RenderItems data={data} />
          </div>
        )
      }
    }
    

    Attach the data in the component

    const data = [{"id": "01", "name": "Hi"}, {"id": "02", "name": "Hello"}]
    <App data={data} />
    

    Following this rule will not impact on performance even with your second example of code ie. pushing items in an array and rendering the items. Because, you're not directly working inside the render hook. Always take care that render hook wouldn't implement any logic inside it directly.


    Further, I wouldn't create id just for using key:

    const data = [{"name": "Hi"}, {"name": "Hello"}]
    //... and when using index as key
    .map((d, i) => <span key={'item-'+i}>
    // or,
    .map((d, i) => <span key={'item-'+i+'-'+d.name}>
    

    See this post why I follow this syntax while using index as key.


    Update:

    If you want to avoid unnecessary html tags being used, you can use React.Fragment

    export const RenderItems = ({data}) => {
      return data && 
        data.map(
          (d, i) => <React.Fragment key={d.id}>{d.name}</React.Fragment>
        ) || null
    }
    // and when rendering, you just return the component
    return <RenderItems data={data} />
    

    Note:

    1. You can use <></> as an alias for <React.Fragment></React.Fragment> only if you don't have any additional property. Since we're using key property on it, not using it.
    2. Take a look at this to make support for short notation of React.Fragment.

    Example using <></>:

    <>{d.name}</>
    

    This will be rendered d.name's value in html without any tag. This is considered best when we specifically transform our existing design to react application. Or, there might be other cases. Like, we are going to display a definition list:

    <dl>
      <dt></dt>
      <dd></dd>
      <dt></dt>
      <dd></dd>
      <dt></dd>
    </dl>
    

    And we don't want to attach unnecessary html tag, then using Fragment will make our life easier:

    Example:

    <>
      <dt>{d.term}</dt>
      <dd>{d.definition}</dd>
    </>
    

    The most important case will be for rendering td element in tr (a TR component). If we don't, then we're breaking the rule of HTML. The component will not be rendered properly. In react, it will throw you an error.

    Update2:

    Also, if you have long list of props like below:

    const {
      items,
      id,
      imdbID,
      title,
      poster,
      getMovieInfo,
      addToFavorites,
      isOpen,
      toggleModal,
      closeModal,
      modalData,
    } = props
    

    You may consider destructuring like:

    const { items, ...other } = props
    // and in your component you can use like:
    <div modalData={other.modalData}>
    

    But, personally I prefer using first example code. It's because while developing I won't need to look back to other component or look for the console each and every time. In the given example there's key like modalData={} so we easily maintain modalData={other.modalData}. But what if it is needed to code like <div>{modalData}</div>? Then, you may also agree with my preference.

    0 讨论(0)
提交回复
热议问题