React+Reduxで配列要素をIDで削除したい
React+Reduxを学び始めてまだ、数ヶ月です。
簡単なTodoリストを作成し、
配列に要素を追加していくことはできたのですが、
削除することができません。
削除する際にKeyとして利用したいIDをどこから取ればいいのか、
わからなく困っています。
できれば、配列のKey要素をうまくReducerに渡して、処理したいと思っています。
実際のコード
action
1export const addTodo = (todo) => { 2 return { 3 type: 'ADD_TODO', 4 // id: nextTodoId++, 5 payload: { todo: todo } 6 }; 7} 8 9export const delTodo = (deltodo) => { 10 return { 11 type: 'DEL_TODO', 12 payload: { deltodo: deltodo } 13 }; 14 } 15 16export const changeTodo = (changetodo) => { 17 return { 18 type: 'CHANGE_TODO', 19 payload: { changetodo: changetodo } 20 }; 21 }
components
1import React from 'react'; 2 3export default class Todo extends React.Component { 4 state = { 5 todo: '' 6 } 7 8 render() { 9 console.log(this.props); 10 11 // StoreのTodoからリストを生成 12 const list = this.props.todo.todoList.map((todo, index) => <li key={index}>{todo}</li>) 13 // <button onClick={() => this.props.changeTodo(this.state.todo)}>変更</button></li>) 14 15 return ( 16 <div> 17 <input type="text" onChange={elm => this.setState({ todo: elm.target.value })} /> 18 <button onClick={() => this.props.addTodo(this.state.todo)}>追加</button> 19 <button onClick={() => this.props.delTodo(this.state.deltodo)}>削除</button> 20 <ul> 21 {list} 22 </ul> 23 </div> 24 ); 25 } 26}
containers
1import { connect } from 'react-redux'; 2import * as actions from '../actions/Todo'; 3import Todo from '../components/Todo'; 4 5const mapStateToProps = state => { 6 return { 7 todo: state.todo, 8 deltodo: state.deltodo, 9 changetodo: state.changetodo, 10 } 11} 12 13const mapDispatchToProps = dispatch => { 14 return { 15 addTodo: (todo) => dispatch(actions.addTodo(todo)), 16 delTodo: (deltodo) => dispatch(actions.delTodo(deltodo)), 17 changeTodo: (changetodo) => dispatch(actions.changeTodo(changetodo)), 18 } 19} 20 21export default connect(mapStateToProps, mapDispatchToProps)(Todo)
reducer
1const initialState = { 2 todoList: [], 3 } 4 5 export const todoReducer = (state = initialState, action) => { 6 switch (action.type) { 7 case 'ADD_TODO': 8 return { 9 ...state, 10 todoList: state.todoList.concat([action.payload.todo]) 11 }; 12 case 'DEL_TODO': 13 return { 14 ...state, 15 todoList: state.todoList.concat([action.payload.todo]) 16 }; 17 case 'CHANGE_TODO' : 18 const changetodo = action.payload.changetodo; 19 const changeState = Object.assign({}, state); 20 changeState.todoList.pop(action.id, changetodo); 21 return changeState; 22 default: 23 return state; 24 } 25 };
試したこと
Reducer内で、TodoをAddする際に、action.idを付与したりしましたが、
配列として、下記のような感じとなり、うまく取得できませんでした。
todoList: Array(3) 0: "0" 1: "dscsd" 2: "1" 3: "dscsd"
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/05 07:40
2019/05/05 09:20
2019/05/05 10:08
2019/05/05 11:12
2019/05/05 11:49
2019/05/05 12:45
2019/05/05 12:53
2019/05/07 15:51
2019/05/08 05:58
2019/05/08 15:59