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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

React.js

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

Q&A

解決済

1回答

5179閲覧

ReactでTodoリスト作成。検索やソートで苦戦しています。

ysk_m

総合スコア17

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

React.js

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

0グッド

1クリップ

投稿2020/01/11 08:26

####ReactでTodoリスト作成しています。表示まではできましたが、ソートや絞り込み検索機能で苦戦しています。
###●したいこと1:絞り込み検索(input)入力wordでローカルストレージより該当リストを取得、表示。
###●したいこと2:新着順、期限順、重要度順(deadlineやtag)でローカルストレージより該当リストを並び替え、表示。
イメージ説明

javascript

1 2import './App.css'; 3 4import React from 'react'; 5 6const App = () => (<Todo></Todo>) 7 8const todos = []; 9 10function TodoHeader(props) { 11 const remaining = props.todos.filter(todo => { 12 return !todo.isDone; 13 }); 14 15 return ( 16 <div> 17 <h1> 18 Todoリスト 19 </h1 > 20 <div> 未完了 / リスト数({remaining.length}/{props.todos.length})</div> 21 <button onClick={props.purge}>チェックしたリストを消去</button> 22 </div> 23 ) 24} 25 26function TodoItem(props) { 27 return ( 28 <li key={props.todo.id}> 29 <label> 30 <input type="checkbox" 31 checked={props.todo.isDone} 32 onChange={() => props.checkTodo(props.todo)} 33 /> 34 <span className={props.todo.isDone ? 'done' : ''}> 35 {props.todo.title}36 {props.todo.deadline}37 {props.todo.task}38 {props.todo.tag1}39 {props.todo.tag2} 40 </span> 41 </label> 42 <button onClick={() => props.deleteTodo(props.todo)}>消去</button> 43 </li> 44 ); 45} 46 47 48function TodoList(props) { //入力された内容を表示する時 49 const todos = props.todos.map(todo => { 50 return ( 51 <TodoItem 52 key={todo.id} 53 todo={todo}//属性 54 checkTodo={props.checkTodo} 55 deleteTodo={props.deleteTodo} 56 /> 57 ); 58 }); 59 return ( 60 <ul> 61 {props.todos.length ? todos : <li>Todoリストがありません</li>} 62 </ul> 63 ); 64} 65 66function TodoForm(props) { //入力する箇所 67 68 return ( 69 <React.Fragment > 70 <form onSubmit={props.addTodo} className="container"> 71 <h3>[ 入力欄 ]</h3> 72 <p>タイトル</p> 73 <input type='text' name="title" value={props.title} onChange={props.updateItem} placeholder="タイトルを記載"></input> 74 <p>期日</p> 75 <input type='date' name="deadline" value={props.deadline} onChange={props.updateItem}></input> 76 <p>やること内容</p> 77 <textarea type='text' name="task" value={props.task} onChange={props.updateItem} placeholder="具体的な内容を記載"></textarea> 78 <p>タグ1:</p> 79 <select name="tag1" value={props.tag1} onChange={props.updateItem}> 80 <option></option> 81 <option value="数学">数学</option> 82 <option value="英語">英語</option> 83 <option value="国語">国語</option> 84 <option value="理科">理科</option> 85 </select> 86 <p>タグ2:</p> 87 <select name="tag2" value={props.tag2} onChange={props.updateItem}> 88 <option></option> 89 <option value="すぐやる">すぐやる</option> 90 <option value="まぁやる">まぁやる</option> 91 <option value="どちらでも">どちらでも</option> 92 <option value="健忘録">健忘録</option> 93 </select> 94 <input type='submit' value="リストを追加" ></input> 95 </form> 96 <div></div> 97 <input placeholder="絞り込み検索"></input> 98 <button>新着順</button> 99 <button>期限順</button> 100 <button>重要度順</button> 101 </React.Fragment > 102 ); 103} 104 105 106function getUniqueId() { 107 return new Date().getTime().toString(36) + "-" + Math.random().toString(36); 108} 109 110class Todo extends React.Component { 111 112 constructor() { 113 super() 114 this.state = { 115 todos: todos, 116 title: "", 117 deadline: "", 118 task: "", 119 tag1: "", 120 tag2: "" 121 122 123 }; 124 this.checkTodo = this.checkTodo.bind(this); 125 this.deleteTodo = this.deleteTodo.bind(this); 126 this.updateItem = this.updateItem.bind(this); 127 this.addTodo = this.addTodo.bind(this); 128 this.purge = this.purge.bind(this); 129 } 130 131 purge() { 132 133 const todos = this.state.todos.filter(todo => { 134 return !todo.isDone; 135 }); 136 this.setState({ 137 todos: todos 138 }); 139 } 140 141 //Todoを [ 追加する ] 場合の関数 142 addTodo = (e) => { 143 e.preventDefault(); 144 145 const item = { 146 id: getUniqueId(), 147 title: this.state.title, 148 deadline: this.state.deadline, 149 task: this.state.task, 150 tag1: this.state.tag1, 151 tag2: this.state.tag2, 152 isDone: false 153 } 154 console.log(item); 155 156 const todos = this.state.todos.slice(); 157 158 todos.unshift(item); 159 this.setState({ 160 todos: todos, 161 item: "", 162 title: "", 163 deadline: "", 164 task: "", 165 tag1: "", 166 tag2: "" 167 }); 168 } 169 170 //Todoを [ 消去する ] 場合の関数 171 deleteTodo(todo) { 172 const todos = this.state.todos.slice(); 173 const pos = this.state.todos.indexOf(todo); 174 175 todos.splice(pos, 1); 176 this.setState({ 177 todos: todos 178 }); 179 } 180 181 182 //Todoを [ チェックする ] 場合の関数 183 checkTodo(todo) { 184 const todos = this.state.todos.map(todo => { 185 return { 186 id: todo.id, 187 title: todo.title, 188 deadline: todo.deadline, 189 task: todo.task, 190 tag1: todo.tag1, 191 tag2: todo.tag2, 192 isDone: todo.isDone 193 }; 194 }); 195 196 const pos = this.state.todos.map(todo => { 197 return todo.id; 198 }).indexOf(todo.id); 199 200 todos[pos].isDone = !todos[pos].isDone; 201 this.setState({ 202 todos: todos 203 }); 204 } 205 206 updateItem = (e) => 207 this.setState({ [e.target.name]: e.target.value }); 208 209 componentDidUpdate() {//JSONにtodosを追加する 210 localStorage.setItem('todos', JSON.stringify(this.state.todos)) 211 } 212 componentDidMount() {//JSONから取ってくる 213 this.setState({ 214 todos: JSON.parse(localStorage.getItem('todos')) || [] 215 }); 216 console.log(JSON.parse(localStorage.getItem('todos'))[0].id.length); 217 } 218 219 220 render() { 221 return (//関数コンポーネント3つ(TodoHeader,TodoForm,TodoList) 222 <div className="container"> 223 <TodoHeader 224 todos={this.state.todos} 225 purge={this.purge} 226 /> 227 228 <TodoForm 229 item={this.state.item} 230 title={this.state.title} 231 task={this.state.task} 232 tag1={this.state.tag1} 233 tag2={this.state.tag2} 234 updateItem={this.updateItem} 235 addTodo={this.addTodo} 236 237 /> 238 239 <TodoList 240 todos={this.state.todos} 241 checkTodo={this.checkTodo} 242 deleteTodo={this.deleteTodo} 243 /> 244 </div> 245 ) 246 } 247} 248export default App;

####どこで何をしていいのか。色々試しすぎて反応なくて逆にわからなくなりました。簡単な流れなどアドバイスを頂けると嬉しいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

したいこと1、したいこと2について共通して言えることは、ローカルストレージから取得のタイミングで絞り込みや順序変更をするのではなく、表示するタイミングで行うという考え方が必要だということです。
手順と考え方を以下に記載します。

  • TodoList で todos というものを filter() 関数を使って絞りこみを行います。
const todos = this.state.todos.filter((todo)=>{ // ここで、条件を記載するために、絞り込み用のワードが必要なことに気づく })
  • TodoList の props に絞り込み用ワードを適用させます。そのためには、その絞り込み用ワードの状態を Todo クラスの state で持つ必要があります。

  • 検索ワードは TodoForm で入力するため、ここにも props で落として、値を更新するようにします。

上記までで、絞り込みは行えます。
並び変えについては以下で可能です。

  • TodoList の todos(絞り込み完了後)に対して sort() 関数を適用します。
  • そのまま適用しても何でソートすればいいのか判断できないので、比較関数を作成します。
  • 今回は新着順、期限順、重要度順の三つの比較項目があるため、比較関数も3つ必要だと思います。

以下は sort() 関数についてのリファレンスです。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

投稿2020/01/30 02:28

nerianighthawk

総合スコア544

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

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

ysk_m

2020/01/30 13:00

ありがとうございます! なるほど。表示するタイミングでの絞り込みですね。 流れがわかりやすく記載してあるため出来そうです! ちょっと行き詰まっていましたが助かりました。やってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問