在 React 中单击时获取元素的书籍属性
Get book properties of element on click in React
我有一个地图函数,可以将图书列表输出到我的 Books 组件。在 map 函数返回的每个 li 上,我都有一个调用函数 openBook 的 onClick 事件处理程序,此函数只是将被单击的书的信息显示到屏幕上的 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",
author: "Dan Brown"
},
{
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>
因为按照您 returned 的方式,函数将在 onLoad 本身执行,并且 return 值将分配给 onClick。
但是你实际需要的是li的onClick需要执行的函数
我有一个地图函数,可以将图书列表输出到我的 Books 组件。在 map 函数返回的每个 li 上,我都有一个调用函数 openBook 的 onClick 事件处理程序,此函数只是将被单击的书的信息显示到屏幕上的 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",
author: "Dan Brown"
},
{
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>
因为按照您 returned 的方式,函数将在 onLoad 本身执行,并且 return 值将分配给 onClick。
但是你实际需要的是li的onClick需要执行的函数