React/redux - прохождение actionCreators на много уровней

Мне интересно, как другие люди обрабатывают создателей action с уменьшающим эффектом от интеллектуального компонента верхнего уровня до многих немых компонентов более низкого уровня без раздувания их определений реквизитов.

Например, после этого превосходного учебника по сокращению, если я передам список создателей действий в реквизиты, подобные этому

import Voting from './Voting';
import * as actionCreators from '../action_creators';

...

export const VotingContainer = connect(
    mapStateToProps,
    actionCreators
)(Voting);

то в моем компоненте Voting у меня есть доступ к actionCreators, который действительно крут.

Но если я скажу 20 actionCreators, которые используются в Voting и всех его дочерних компонентах, например.

Voting -> VotingContainer -> VotingDetail -> VotingFoo -> VotingBar

тогда я получаю функции рендеринга, которые выглядят как

class Voting extends React.Component {
    render(){
        <VotingContainer
            actionCreator1={this.props.actionCreator1}
            .
            .
            .
            actionCreator15={this.props.actionCreator15} />
    }
}

class VotingContainer extends React.Component {
    render(){
        <VotingDetail
            actionCreator1={this.props.actionCreator1}
            .
            .
            .
            actionCreator12={this.props.actionCreator12} />
    }
}

.
.
.

class VotingFoo extends React.Component {
    render(){
        <VotingBar
            actionCreator1={this.props.actionCreator1}
            .
            .
            .
            actionCreator6={this.props.actionCreator6} />
    }
}

Есть ли наилучшая практика для этой ситуации, способ группировать actionCreators вместе так или иначе без большого количества шаблонов на каждом шагу? Я ничего не видел ни в одном из уроков/примеров...

Ответ 1

Просто подключите компоненты под деревом к Redux тоже.
Мы чрезмерно подчеркиваем "один контейнер наверху" в примерах.
Это имеет смысл, когда речь идет о очень простых приложениях.

Для любого сложного приложения , как только прохождение реквизита становится утомительным, connect() ниже. Я рассказываю об этом в своих бесплатных видео: см. Извлечение компонентов контейнера и следующие несколько видеороликов.

Ответ 2

Я обнаружил, что в большинстве случаев, когда у меня много немых оберток вокруг основного компонента ui, большинство реквизитов из верхнего контейнера необходимо в самом вложенном компоненте. Из-за этого синтаксис ES6... помогает много.

Вы можете сделать это:

<VotingBar {...this.props} />

Что эквивалентно этому:

<VotingBar
    actionCreator1={this.props.actionCreator1}
    .
    .
    .
    actionCreator6={this.props.actionCreator6} />

Ответ 3

Конечно, существует множество способов решения этой проблемы.

В последнее время я начал пропускать все действия создателя действия по цепочке в пользу , просто требуя, чтобы хранилище и мои создатели действия были там, где они нужны и отправлялись туда, например

var store = require('../store');
var actions = require('../actions');

// Somewhere inside your component...
store.dispatch(actions.someAction(data));

Просто убедитесь, что результат ваших создателей действия (т.е. новое состояние) передается через компоненты верхнего уровня. Это позволяет потоку данных быть однонаправленными и понятными.