前提
ここに質問の内容を詳しく書いてください。
React Hooksでブログを作ろうとしています。
データベースからブログのリストを取得する関数があるのですが、手を加えて「検索ワード」「タグ」をそれぞれ使いブログのリストをフィルタリングしようとしています。
リストの中にはデータベースから取得した、タイトル、本文、タグなどの情報が含まれており、検索ワードをinputタグに入力したらonChangeイベントでタイトルまたは本文に該当するワードが含まれる記事をフィルタリングできました。
ですが、同時にタグが書かれたAタグを押すとonChangeイベントが何度か押さないと反応されません。
実現したいこと
最終的なゴールは、ブログリストのデータを様々な条件でフィルタリングしたいです。
ですが複数のフィルタリング条件を複数のonChangeイベントで扱う時にどのように書くのが最適解なのかわかりません。
エラーの内容
ブラウザのConsoleではエラーはでなかったのですがonChangeイベントが不発して動かない時があります。
該当のソースコード
今は手元に開発環境がなくスマホから質問を投稿させていただいておりますため、まずは上記の情報だけでワークアラウンドもしくは、例的な複数イベント処理の書き方が思い当たる方がいらっしゃれば回答いただきたいです。
react.js
試したこと
検索ワードを保持するuseState
押されたタグを保持するuseState
2つのuseStateがあり、それぞれのonChangeイベントでフィルタリングされる文字がsetされるようになっています。
ブログリストを表示する関数の中で、検索ワードまたはタグが入力されたらor条件でフィルタリングするように書きました。
補足情報(FW/ツールのバージョンなど)
必要があればライブラリ等のバージョンも調べます。よろしくお願いします。
コード抜粋(追記)
<Child.js(一部抜粋)>
const getTagMenu = props.tags.map((data, index) => { return ( <React.Fragment key={index}> <li className="list-inline-item"> <Link to="#" onClick={e => props.setTag(e.target.textContent)} className="badge bg-light font-size-12 mt-2"> {data} </Link> </li> </React.Fragment> ) }); return ( <React.Fragment> <input type="text" id="search" className="form-control rounded bg-light border-light" placeholder="キーワードを入力" onChange={e => props.setKeyword(e.target.value)} /> <div> <p className="text-muted mb-1"><strong>タグ</strong></p> <ul className="list-inline widget-tag"> {getTagMenu} </ul> </div> </React.Fragment> )
<Parent.js(一部抜粋)>
const [keyword, setKeyword] = useState(""); const [tag, setTag] = useState(""); const filterSearchWord = (blog) => { return (blog.text.toLowerCase().indexOf(keyword.toLowerCase()) > -1) || (blog.title.toLowerCase().indexOf(keyword.toLowerCase()) > -1); }; const filterTag = (blog) => { return (blog.tags.indexOf(tag) > -1); }; const filterMulti = (blog) => { return filterTag(blog) || filterSearchWord(blog); }; const getBlog = (data) => { data = data.filter( (blog) => { return filterMulti(blog); }); data.sort(); const prefix = '../../'; return data.map((blog, index) => { return ( <React.Fragment key={index}> <div> <h5> <Link to="blog-details" className="text-dark"> {blog.title} </Link> </h5> <p className="text-muted">{blog.shortInsertTime}</p> <div className="position-relative mb-3"> <img src={prefix + blog.image} alt="" className="img-thumbnail" /> </div> <ul className="list-inline"> <li className="list-inline-item mr-3"> <Link to="#" className="text-muted"> <i className="bx bx-comment-dots align-middle text-muted me-1"></i>{" "} {blog.comment} Comments </Link> </li> {getTags((blog.tags).split("&"))} </ul> <p> {blog.text} </p> <div> <Link to="#" className="text-primary"> Read more <i className="mdi mdi-arrow-right"></i> </Link> </div> </div> <hr className="my-5" /> </React.Fragment> ) }) } return ( <React.Fragment> <FrontMenu /> <div className="page-content"> <MetaTags> <title>タイトル(仮)</title> </MetaTags> <Container fluid> <Row> <BlogList blog = {getBlog({activitylog}.activitylog)} btnprimary = {btnprimary} page = {page} step = {step} activeTab = {activeTab} setPage = {setPage} setStep = {setStep} setBtnprimary = {setBtnprimary} /> <RightBar setKeyword = {setKeyword} setTag = {setTag} tags = {getAllTags} /> </Row> </Container> </div> </React.Fragment> )
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/11/20 02:23 編集
退会済みユーザー
2022/11/20 03:31
2022/11/20 04:39
退会済みユーザー
2022/11/20 04:59 編集
退会済みユーザー
2022/11/20 05:12
2022/11/20 05:20
2022/11/20 14:41 編集
2022/11/20 15:27
退会済みユーザー
2022/11/20 21:27