问题描述
我有一个地图功能,可将书籍列表输出到我的“书籍”组件。在由map函数返回的每个li上,我都有一个onClick事件处理函数,该函数调用了openBook函数,此函数只是将所单击的书的信息显示到屏幕上的div上。 我的问题是,由于某种原因,当我将参数传递给openBook函数时,它仅传递了最后一个li元素的标题和作者,而且似乎甚至没有我单击书就可以运行该函数。
当我单击特定的书时,如何将标题和作者参数传递给创建的div?
Books.js
function Books() {
const {books} = useContext(BookContext) //{books} here is the array (API) with all books inside but as a state in the BookContext file
function openBook(title,author) {
const bookview = document.createElement('DIV')
if(document.body.contains(document.querySelector('.bookview'))) {
document.body.removeChild(document.querySelector('.bookview'))
}
bookview.innerHTML = '<i class="fas fa-times close"></i> <h4>'+info+'</h4>'
bookview.classList.add('bookview')
document.body.appendChild(bookview)
document.querySelector('.close').addEventListener('click',function() {
document.body.removeChild(document.querySelector('.bookview'))
})
}
return (
<>
<div className="bookshelf">
<ul>
{
books.map(book => {
return <li onClick={openBook(book.title,book.author)}>{book.title} <span>{book.author}</span><i class="fas fa-bookmark"></i></li>
})
}
</ul>
</div>
</>
)
}
BookContext(只包含一些书籍信息)
const [books,setBooks] = useState([
{
id: 1,title: "Digital Fortress",author: "Dan brown"
},{
id: 2,title: "Origin",{
id: 3,title: "The Lord Of The Rings",author: "J.R Tolkien"
},{
id: 4,title: "The Bourne Identity",author: "Robert Ludlum"
}
])
解决方法
您必须像这样修改onClick
<li onClick={() => openBook(book.title,book.author)}><span>{book.author}</span><i class="fas fa-bookmark"></i></li>
因为返回的函数将在onLoad自身上执行,并且返回值将分配给onClick。
但是您真正需要的是需要在li的Click上执行的功能