質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

2回答

1468閲覧

reactで動的な検索をしたい

alpha95

総合スコア10

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/10/07 09:04

検索フォームにワードを入力するごとに入力ワードと一致するデータを表示させるようにしたいです。

コードは以下の通りです。

import React, { useState } from 'react'; const App = () => { const [array, setArray] = useState([ { name: 'aaaaa' }, { name: 'abbbb' }, { name: 'ccccc' }, ]); const filterArray = (e: any) => { const updatedArray = array.filter((data) => { return data.name.includes(e.target.value); }); setArray(updatedArray); }; return ( <div> <input type="text" onChange={filterArray} /> {array.map((data) => { return <p>{data.name}</p>; })} </div> ); }; export default App;

イメージ説明

本当は上記画像の検索フォームに"a"入力した場合は、”aaaaa”と”abbbb”が表示→入力フォームを空にすると全てのデータを表示させたいのですが検索フォームにaと入れた後に空にするとcccccが表示されません。
setArray(updatedArray);と書いてしまっているためarrayが上書きされてしまっているためだとは思うのですがどのようにすれば入力フォームの値と連動して表示をさせることができるでしょうか?

わかる方いましたら教えていただきたいです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こないな感じかのう。

jsx

1import { useState } from "react"; 2 3const RAW_DATA = [{ name: "aaaaa" }, { name: "abbbb" }, { name: "ccccc" }]; 4 5const App = () => { 6 const [array, setArray] = useState(RAW_DATA); 7 8 const filterArray = ({ target: { value } }) => { 9 setArray( 10 value 11 ? RAW_DATA.filter(({ name }) => name.match(new RegExp(`^${value}`))) 12 : RAW_DATA 13 ); 14 }; 15 16 return ( 17 <div> 18 <input type="text" onChange={filterArray} /> 19 {array.map(({ name }) => ( 20 <p key={name}>{name}</p> 21 ))} 22 </div> 23 ); 24}; 25 26export default App; 27

➡ サンプル (※以下の追記の件、修正ずみ)

追記

おっと間違うてた。入力された文字列から始まるゆうフィルターやのうて、入力された文字列を含んでいればええのんか。それやったら正規表現のとこ、^は不要やから

diff

1- new RegExp(`^${value}`) 2+ new RegExp(value)

でええわいね。ちゅうか、質問者さん書いてるように、文字列のincludes使うて、

javascitp

1name.includes(value)

でオッケー牧場やねん。

投稿2021/10/07 10:22

編集2021/10/07 11:10
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

setArray(updatedArray);と書いてしまっているためarrayが上書きされてしまっているためだとは思うのですが

まずは、復元する元の配列をどこかに確保しておく必要があります。上書きで消してしまったデータは復元できません。

投稿2021/10/07 09:17

maisumakun

総合スコア145208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alpha95

2021/10/10 00:44

やはり上書きされてしまうので別で配列を確保しておく必要があるのですね。 ありがとうございます。 こちらの質問に対して、追加でわからない部分が出てきているため、別で質問をあげました。 https://teratail.com/questions/363669?modal=q-comp もし、よろしければこちらも見ていただけませんでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問