私はReactを学んでいて、いくつかのチュートリアルに従って、このコードに出くわしました:
import React from 'react';
import TodosView from 'components/TodosView';
import TodosForm from 'components/TodosForm';
import { bindActionCreators } from 'redux';
import * as TodoActions from 'actions/TodoActions';
import { connect } from 'react-redux';
@connect(state => ({ todos: state.todos }))
export default class Home extends React.Component {
render() {
const { todos, dispatch } = this.props;
return (
<div id="todo-list">
<TodosView todos={todos}
{...bindActionCreators(TodoActions, dispatch)} />
<TodosForm
{...bindActionCreators(TodoActions, dispatch)} />
</div>
);
}
}
これはtodoアプリケーションであり、これはメインページであり、さらに2つの小さなcomponents
をロードします。私はほとんどすべてを理解しましたが、いくつかのことを得ることができませんでした:
connect
は何をしますか?私はあなたが4つのパラメータを渡さなければならないことを知っています(私はそれらの4つの変数が何であるかを正確に得ることができませんでしたが)。@connect
デコレータの実装はどうですか?トランスパイル後のコードはどのようになりますか?前もって感謝します :)
Reduxは、アプリケーションの状態をストアと呼ばれる単一のオブジェクトに保持します。 connect
を使用すると、Reactコンポーネントをストアの状態に接続できます。つまり、ストアの状態をprops
としてそれらに渡すことができます。
デコレータ構文がないと、コンポーネントのエクスポートは次のようになります。
_export default connect(state => ({todos: state.todos}))(Home);
_
これは、コンポーネント(ここではHome
)を受け取り、ストアに適切に接続されている新しいコンポーネントを返します。
ここで接続されているとは、ストアの状態をprops
として受け取り、この状態が更新されると、この新しい接続されたコンポーネントが新しい小道具を受け取ることを意味します。接続されているということは、ストアのdispatch
関数にアクセスできることも意味します。これにより、ストアの状態を変更できます。
4つの引数は次のとおりです。
mapStateToProps接続されているすべてのコンポーネントにストアのすべての状態を挿入したくない場合があります。この関数を使用すると、関心のある状態スライスを定義したり、ストアの状態から派生した新しいデータをprops
として渡すことができます。 state => ({todosCount: state.todos.length})
のようなことを行うと、Home
コンポーネントはtodosCount
propを受け取ります。
mapDispatchToPropsディスパッチ関数に対して同じことを行います。 dispatch => ({markTodoAsCompleted: todoId => dispatch(markTodoAsCompleted(todoId))})
のようなことをすることができます
mergePropsコンポーネントが受け取る小道具、mapStateToProps
からの小道具とmapDispatchToProps
からの小道具をマージするカスタム関数を定義できます。
オプションまあ、いくつかのオプション…