【发布时间】:2020-03-25 22:35:54
【问题描述】:
TL;DR 我正在制作一个可重用的Button 功能组件。我的按钮标签的useState() 钩子正在更新每个Button 实例。我怎样才能防止这种情况发生?
我对 React 非常陌生,并且为了学习而构建了一个 Book Finder 应用程序。到目前为止,我的应用程序有一个 BookList 和一个 ReadingList。任一列表中的每个BookDetail 都有一个Button,用于在ReadingList 中添加/删除该书。添加/删除功能有效(呸),但使用useState 更新Button 的标签会更新Button 组件的每个实例,而不仅仅是被点击的那个。
Buttons 在BookList 中的书籍上以标签“添加到阅读列表”开头,但如果我点击其中的任何,它们中的所有都会更新为'从阅读列表中删除'。
我尝试将逻辑移动到 Button 组件或 List 组件中,但我最终破坏了该功能。
App.js
function App() {
const books = useState([])
const [booksToRead, setBooksToRead] = useState([])
const [addRemove, setAddRemove] = useState(true)
const [label, setLabel] = useState('Add to Reading List')
function handleAddBook(book) {
const newID = book.title_id
if( (typeof booksToRead.find(x => x.title_id === newID)) == 'undefined' ) {
setBooksToRead([...booksToRead, book])
}
}
function handleRemoveBook(book) {
console.log(book)
const array = booksToRead
const index = array.indexOf(book)
const newArray = [...array.slice(0, index), ...array.slice(index +1)]
setBooksToRead(newArray)
}
function addOrRemove(book) {
if( addRemove ) {
handleAddBook(book)
setLabel('Remove from Reading List')
setAddRemove(false)
} else {
handleRemoveBook(book)
setLabel('Add to Reading List')
setAddRemove(true)
}
}
return (
<main>
<BookList books={books} handleAddBook={handleAddBook} addOrRemove={addOrRemove} label={label} />
<ReadingList booksToRead={booksToRead} handleRemoveBook={handleRemoveBook} />
</main>
);
}
export default App;
BookList.js
function BookList ({ book, label, handleAddBook, addOrRemove }) {
return (
<div className="booklist">
{BookData.map((book, index) => {
const onAddBook = () => addOrRemove(book)
return (
<div key={index} className="card">
<BookDetail key={book.title_id} book={book} />
<Button key={index + 'btn'} label={label} onClick={onAddBook} />
</div>
)
})}
</div>
)
}
export default BookList
最后是 Button.js
export default function Button({ styleClass, label, onClick }) {
return (
<button className='btn' onClick={(event) => onClick(event)}>
{label}
</button>
)
}
codesandbox 中的无样式示例:https://codesandbox.io/s/cool-rgb-fksrp
【问题讨论】:
标签: javascript reactjs react-hooks instance react-component