【发布时间】:2021-10-24 06:03:33
【问题描述】:
我正在尝试通过过滤来呈现书签卡。我有一个调用 filterByCategory 的事件处理程序。在那里,我调用我的道具来遍历书签集合并仅返回其 category_id 与 e.target 的值匹配的 BookmarkCard;其中“e.target”是下拉菜单的选定选项。
这是我的代码:
//containers/Bookmarks.js
import React from 'react'
import BookmarkCard from './BookmarkCard'
import BookmarkForm from '../components/BookmarkForm'
import CategoryForm from '../components/CategoryForm'
import Select from '@material-ui/core/Select'
import MenuItem from '@material-ui/core/MenuItem'
import { connect } from 'react-redux'
import { filterByCategory } from '../actions'
const Bookmarks = (props) => {
const renderBookmarkCollection = () => {
return props.bookmarks.map(bookmark => {
return <BookmarkCard key={bookmark.id} {...bookmark}/>
})
}
const filterByCategory = (e) => {
debugger
props.bookmarks.map((bookmark) => {
if (bookmark.category_id == e.target.value) {
return <BookmarkCard key={bookmark.id} category_id={bookmark.category_id} {...bookmark}/>
} else {
return null
}
})
}
return (
<div className="bookmarks-container">
<br></br>
<BookmarkForm />
<CategoryForm/>
<form className="filter-category">
<p>FILTER BY CATEGORY</p>
<Select id="category-input" value={props.categories} onChange={(e) => filterByCategory(e)}>
{props.categories.map(category => {
return (
<MenuItem key={category.id} name={category.name} value={category.id} >{category.name}</MenuItem>
)
})}
</Select>
</form>
<br></br>
{renderBookmarkCollection()}
</div>
)
}
const mapStateToProps = (currentState) => {
return {
bookmarks: currentState.bookmarks.bookmarks,
categories: currentState.categories.categories
}
}
const mapDispatchToProps = (dispatch) => {
return {
filterByCategory: (id) => dispatch(filterByCategory(id))
}
}
export default connect(mapStateToProps, mapDispatchToProps)(Bookmarks)
有了这个,我不会返回任何“书签卡”。
//containers/BookmarkCard.js
import React from 'react'
import Button from "@material-ui/core/Button"
import DeleteIcon from "@material-ui/icons/Delete"
import FavoriteIcon from "@material-ui/icons/Favorite"
import { useHistory } from 'react-router-dom'
import { connect } from 'react-redux'
import { deleteBookmark, favoriteBookmark } from '../actions/index'
const BookmarkCard = (props) => {
const history = useHistory()
const handleFavorite = () => {
favoriteBookmark()
history.push('/bookmarks')
}
const handleDelete = () => {
deleteBookmark()
history.push('/bookmarks')
}
return (
<div className="bookmark-card" id={`bookmark-${props.id}`}>
<h2 className="bookmark-headline">{props.headline}</h2>
<p className="bookmark-description">{props.description}</p>
<p className="bookmark-web-url" >{props.web_url}</p>
<Button
id={props.id}
onClick={handleFavorite}
className="favorite-button"
startIcon={<FavoriteIcon/>}>
</Button><br></br>
<Button
id={props.id}
size="small"
startIcon={<DeleteIcon />}
onClick={handleDelete}
className="delete-button">
</Button><br></br>
</div>
)
}
const mapDispatchToProps = (dispatch) => {
return {
deleteBookmark: (id) => dispatch(deleteBookmark(id)),
favoriteBookmark: (id) => dispatch(favoriteBookmark(id))
}
}
export default connect(null, mapDispatchToProps)(BookmarkCard)
【问题讨论】:
-
在第一次渲染时您已经看不到类别了吗?或者只有过滤器不工作
-
@iunfixit 在第一次渲染时我看到了所有的书签卡;我没有看到过滤后的结果。
标签: javascript reactjs components react-component