为了账号安全,请及时绑定邮箱和手机立即绑定

如何创建一个数组并对其进行映射以简化我的代码?

如何创建一个数组并对其进行映射以简化我的代码?

拉丁的传说 2022-01-07 18:39:32
我正在尝试根据我正在学习的课程的审阅者的一些反馈来改进我的代码。所以,我有这部分代码:function Home(props) {  const [, setShowSearchPage] = useState(false);  return (    <div className="list-books">      <div className="list-books-title">        <h1>MyReads</h1>      </div>      <div className="list-books-content">        <div>          <div className="bookshelf">            <h2 className="bookshelf-title">Currently Reading</h2>            <div className="bookshelf-books">              <ol className="books-grid">                {props.books                  .filter(book => book.shelf === 'currentlyReading')                  .map(book => (                    <li key={book.id}>                      <Book                        book={book}                        changeShelf={props.changeShelf}                        actualShelf="currentlyReading"                      />                    </li>                  ))}              </ol>            </div>          </div>          <div className="bookshelf">            <h2 className="bookshelf-title">Want to Read</h2>            <div className="bookshelf-books">              <ol className="books-grid">                {props.books                  .filter(book => book.shelf === 'wantToRead')                  .map(book => (                    <li key={book.id}>                      <Book                        book={book}                        changeShelf={props.changeShelf}                        actualShelf="wantToRead"                      />                    </li>                  ))}              </ol>            </div>          </div>  );}我的问题是:是否有一种时尚的形式让我创建一系列书架信息(书架是“当前阅读”、“想阅读”和“阅读”),例如我可以映射它并为每个书架生成代码块,为了避免重复相同的代码?
查看完整描述

3 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

有很多方法可以重构你所拥有的,但这是我认为你正在寻找的:


function Home({books, changeShelf}) {

  const [, setShowSearchPage] = useState(false)

  const shelves = {

    currentlyReading: 'Currently Reading',

    wantToRead: 'Want to Read',

    read: 'Read',

  }


  return (

    <div className="list-books">

      <div className="list-books-title">

        <h1>MyReads</h1>

      </div>

      <div className="list-books-content">

        <div>

          {Object.keys(shelves).map(shelf => (

            <div className="bookshelf">

              <h2 className="bookshelf-title">{shelves[shelf]}</h2>

              <div className="bookshelf-books">

                <ol className="books-grid">

                  {books

                    .filter(book => book.shelf === shelf)

                    .map(book => (

                      <li key={book.id}>

                        <Book

                          book={book}

                          changeShelf={changeShelf}

                          actualShelf={shelf}

                        />

                      </li>

                    ))}

                </ol>

              </div>

            </div>

          ))}

        </div>

      </div>

    </div>

  )

}


查看完整回答
反对 回复 2022-01-07
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

您可以定义渲染函数以不多次重复相同的代码,并且更易于阅读


import React, { useState } from 'react';

import PropTypes from 'prop-types';


const propTypes = {};

const defaultProps = {};


function Component(props) {

  const [, setShowSearchPage] = useState(false);


  const renderBook = (book) => (

    <li key={book.id}>

      <Book book={book} changeShelf={props.changeShelf}     actualShelf="currentlyReading" />

    </li>

  );

  const renderBookShelf = (books, title) => (

      <div className="bookshelf">

        <h2 className="bookshelf-title">{title}</h2>


        <div className="bookshelf-books">

          <ol className="books-grid">{books.map(renderBook)}</ol>

        </div>

      </div>

    );

  return (

    <div className="list-books">

      <div className="list-books-title">

        <h1>MyReads</h1>

      </div>


      <div className="list-books-content">

        <div>

           {renderBookShelf(props.books.filter((book) => book.shelf === 'currentlyReading'), 'Currently Reading')}

           {renderBookShelf(props.books.filter((book) => book.shelf === 'wantToRead'), 'Want to Read')}

           {renderBookShelf(props.books.filter((book) => book.shelf === 'read'), 'Read')}

        </div>

      </div>

    </div>

  );

}

Component.propTypes = propTypes;

Component.defaultProps = defaultProps;

export default Component;


查看完整回答
反对 回复 2022-01-07
?
达令说

TA贡献1821条经验 获得超6个赞

去年我在研究 NodeJS 和 Express 时遇到了类似的问题。您可以使用HTML 表格而不是列表。要填充表格,请参阅此答案。


查看完整回答
反对 回复 2022-01-07
  • 3 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号