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>
)
}

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;
添加回答
举报