javascript - 为什么该函数没有在组件中返回数据,尽管它正确显示在控制台上?
问题描述
我必须显示用户之前添加的书籍,当用户单击按钮但我没有得到结果时会发生这种情况,这是什么问题?
//这里是函数
displayBooks = () => {
const { users, books } = this.state
const user = users.find(user => user.email === currentUser.email)
const arrayHaveFavBooksId = user.favBooks
let arrayHaveObjOfuserFavBooks = [];
for (let book of books) {
for (let bookId of arrayHaveFavBooksId)
if (bookId === book.id) {
arrayHaveObjOfuserFavBooks.push(book)
}
}
//
console.log(arrayHaveObjOfuserFavBooks);
const showBooks = arrayHaveObjOfuserFavBooks.map((book, id) => {
return (
<figure key={id}>
<img src={book.photoURL} alt={book.title} />
</figure>
)
})
return showBooks
}
这是组件上的渲染
render() {
return (
<section className="profile">
<button onClick={this.displayBooks}> show my Books</button>
</section>
);
}
解决方案
您将onClick
回调与组件的渲染阶段混淆了。您不应该在onClick
回调中返回 itens,而是通过调用setState
(或其他重新渲染操作,例如 Redux 上的更新)触发重新渲染。
解决这个问题的一种方法是在组件状态上创建一个标志并从onClick
回调中更新它。像这样:
class Comp extends React.Component {
state = {
books: ...,
users: ...,
booksVisible: false,
}
// displayBooks implementation here
toggleVisibility = () => {
const { booksVisible } = this.state
// Toggles it so you can open and close
this.setState({ booksVisible: !booksVisible })
}
render() {
return (
<section className="profile">
<button onClick={this.toggleVisibility}> Show my books</button>
{ booksVisible ? this.displayBooks() : null }
</section>
);
}
}
这样,onClick
回调只管理组件的状态,而渲染完全在render
函数内部进行。
推荐阅读
- python - Pyinstaller 离线 pip 安装不起作用
- azure - 使用 azure webapp 作为反向代理
- java - 使用 XMLUnit 比较 xml 文件时忽略特定节点的特定属性
- entity-framework - 通用存储库模式,还有其他选择吗?
- html - CSS:在响应视图中居中背景图像
- sql - PostgreSQL - 如何在竞争激烈的插槽竞赛中防止重复插入
- c# - C# MySql 在 where 子句中的未知列
- linux - Team City“最小构建代理”Docker 映像 - “npm:未找到”Linux 问题?
- python - 在 Tensorflow 中设计深度 Q 网络损失函数
- python - Python/Kivy AttributeError:“超级”对象没有属性“__getattr__”