javascript - 通过 OnClick 功能过滤帖子
问题描述
如果单击按钮,我正在尝试根据其类别过滤一些帖子。例如,我有一个按钮,当单击该按钮时,显示的唯一帖子与软件项目相关。
我已经设置了一个名为 searchHandler 的函数,该函数已传递给我的 SidebarOptions 组件,该组件具有 onclick 事件。但是当我通过它时,什么也没有发生。
以下是 searchHandler 所在的(父)Home 组件中的代码:
function Home() {
const [posts, setPosts] = useState([]);
const [filteredPosts, setFilteredPosts] = useState(null);
const searchHandler = (event) => {
const { value } = event.target;
setFilteredPosts(
value
? posts.filter(
(post) =>
post.question.question.includes(value)
)
: null
);
};
useEffect(() => {
db.collection("questions")
.orderBy("timestamp", "desc")
.onSnapshot((snapshot) =>
setPosts(
snapshot.docs.map((doc) => ({
id: doc.id,
question: doc.data(),
}))
)
);
}, []);
return (
<div className="home">
<div></div>
<Header searchHandler={searchHandler} />
<div className="home__content">
<Sidebar searchHandler={searchHandler} />
<Feed posts={filteredPosts || posts} />
<Widget />
</div>
</div>
);
}
这是接收它的(子)侧边栏组件:
import React from "react";
import "../Style/Sidebar.css";
import SidebarOptions from "./SidebarOptions";
function Sidebar({ searchHandler }) {
return (
<div className="sidebar">
<SidebarOptions searchHandler={searchHandler} />
</div>
);
}
export default Sidebar;
这是函数最终发送到的(孙子)SidebarOptions:
function SidebarOptions({ searchHandler }) {
return (
<div className="sidebarOptions">
<div className="sidebarOption" onChange={() => searchHandler}>
<img
src="https://c.pxhere.com/photos/7b/1a/code_coding_computer_developer_developing_development_macbook_notebook-913320.jpg!d"
srcset="https://c.pxhere.com/photos/7b/1a/code_coding_computer_developer_developing_development_macbook_notebook-913320.jpg!d"
alt="Software Projects"
/>
<p>Software Projects</p>
</div>
);
};
解决方案
我认为你需要重新审视你的SideBarOptions
组件。我想知道onChange
处理程序在div
. 如果您希望用户键入,我认为应该是input
而不是。div
此外,您需要使用键入的值调用您的处理程序,这里您没有调用处理程序(请注意代码中缺少()
after )。此外,最好添加类似 a 的内容,以便不会为用户键入的每个字符触发过滤器。理想情况下,一旦用户停止输入,它就应该被触发,就是这样。searchHandler
SideBarOptions
debounce
debounce
根据我对它可能如何工作的猜测,在下面放置一些代码片段。
const SideBarOptions = ({ searchHandler }) => {
const [filterText, setFilterText] = useState("");
const handleFilter = () => {
searchHandler(filterText);
}
return (
<div className="sidebarOptions">
<input name="filterText" value={filterText} onChange={(e) => setFilterText(e.target.value)} />
<div className="sidebarOption" onChange={() => searchHandler}>
<img src="https://c.pxhere.com/photos/7b/1a/code_coding_computer_developer_developing_development_macbook_notebook-913320.jpg!d" srcset="https://c.pxhere.com/photos/7b/1a/code_coding_computer_developer_developing_development_macbook_notebook-913320.jpg!d"
alt="Software Projects"
/>
<p>Software Projects</p>
<button onClick={handleFilter}>Filter</button>
</div>
</div>
);
}
推荐阅读
- elasticsearch - 使用 Elasticsearch 逐页索引 PDF 与使用摄取插件
- php - wamp服务器如何通过点点斜杠阻止对根文件夹的访问
- c - C 缓冲区和混乱,初学者
- react-native - 反应本机 bundleReleaseJsandAssets 失败
- c++ - c++中向量中的元素除法
- javascript - 为什么div隐藏但不显示?
- ios - segue 与协议/委托数据传递调用两次
- css - body:before 设置背景图片的目的是什么?
- java - Android Studio Mac Gradle 问题
- sql - 无法连接到 .net core 2.1 应用程序中的 SQL Server 实例