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

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/30 13:00