typescript-fsaで複数の値を渡したい時
はじめに
typescript-fsaで複数の値を渡す方法で少し考えてしまったので、解法を残します。今回は、Todoリストを追加するactionを例にして、必要な部分のみを記載します。
関連するファイルは以下の通りです。
actions.ts
// typescript-fsa import actionCreatorFactory from 'typescript-fsa'; const actionCreator = actionCreatorFactory(); export const addTodoActions = { addTodoAction: actionCreator<{ name: string, priority: string }>('ADD_PATH'), };
actionCreatorFactory()の型部分で、渡す値の型を記載します。
actionCreator()の型部分は、1つのargumentしか受け付けません。
reducers.ts
// typescript-fsa import { reducerWithInitialState } from 'typescript-fsa-reducers'; // redux import { addTodoActions } from './actions'; export const addTodoReducer = reducerWithInitialState(initialStateAddTodo) .case(addTodoActions.addTodoAction, (state, payload) => ({ ...state, paths: state.todos.concat( // addTodo()は、既存のTodoリストにconcatで新たなTodoをいれるための関数です。 addTodo(payload.name, payload.priority) ), }))
payloadにnameとpriorityが格納されているため、それぞれを既存のTodoリストに追加します。
(今回はaddTodo()がその役割です。)
AddTodoContainer.tsx
// redux import { Dispatch } from "redux"; import { addTodoActions } from '../actions' // react-redux import { connect } from "react-redux"; // components import AddTodo from '../components/AddTodo' export type AddTodoFormHandler = { handleAddTodo(todoName: string, priority: string ): void } const mapDispatchToProps = (dispatch: Dispatch) => { return { handleAddTodo: (name: string, priority: string) => { dispatch(addTodoActions .addTodoAction({ name, priority })) }, } }; export default connect( null, mapDispatchToProps )(AddTodo);
関数のそれぞれの引数を記載します。
(今回はnameとpriority)
AddTodo.tsx
<button onClick={() => { props.handleAddTodo(name, priority ); }} > Add Todo </button>
onClickしたときに、containerのhandleAddTodoに入力したnameとpriorityの値を渡します。