Обычно я строил свои компоненты по следующей схеме:
import selectors from '../store/selectors'
import someAction1 from '../actions/someAction1'
import someAction2 from '../actions/someAction2'
import someAction3 from '../actions/someAction3'
class MyComponent extends React.Component {
render() => {
return <Fragment>
<div>{this.props.someReduxProperty1}</div>
<div>{this.props.someReduxProperty2}</div>
<div>{this.props.someReduxProperty3}</div>
<a onClick={this.props.someAction1}>Action1</a>
<a onClick={this.props.someAction2}>Action2</a>
<a onClick={this.props.someAction3}>Action3</a>
</Fragment>
}
}
export default connect(
(state, ownProps) => {
return {
someReduxProperty1: selectors.getSomeReduxProperty1(state),
someReduxProperty2: selectors.getSomeReduxProperty2(state),
someReduxProperty3: selectors.getSomeReduxProperty3(state)
}
},
(dispatch) => {
return {
someAction1: () => {
dispatch(someAction1())
},
someAction2: () => {
dispatch(someAction2())
},
someAction3: () => {
dispatch(someAction3())
}
}
}
)(MyComponent)
Это действительно делает работу, но мне кажется, что я печатаю одни и те же вещи неоднократно, даже в этом тривиально коротком примере. Мои компоненты контейнера кажутся достаточно многословными к тому времени, когда они функционируют. Кроме того, я нахожу, что я часто изменяю список свойств и действий, используемых в компоненте, что делает его более расстраивающим из-за постоянной повторной перепечатки всего этого. Хотя большинство примеров, которые я читал о реакции + избыточности, похоже, отражает эту настройку кода.
Это действительно необходимо? Я обдумываю игнорирование того, что кажется лучшими практиками React + Redux, и просто прохожу через state
и dispatch
в качестве поддержки моих компонентов:
import selectors from '../store/selectors'
import someAction1 from '../actions/someAction1'
import someAction2 from '../actions/someAction2'
import someAction3 from '../actions/someAction3'
class MyComponent extends React.Component {
render() => {
const { state, dispatch } = this.props
return <Fragment>
<div>{selectors.getSomeReduxProperty1(state)}</div>
<div>{selectors.getSomeReduxProperty2(state)}</div>
<div>{selectors.getSomeReduxProperty3(state)}</div>
<a onClick={() => { dispatch(someAction1()) }}>Action1</a>
<a onClick={() => { dispatch(someAction2()) }}>Action2</a>
<a onClick={() => { dispatch(someAction3()) }}>Action3</a>
</Fragment>
}
}
export default connect(
(state, ownProps) => {
return { state: state }
}
/* dispatch gets added by default */
)(MyComponent)
Код имеет минимальное повторение имен переменных. Дополнительный бонус: поскольку вызов connect будет одинаковым для каждого компонента, я могу просто подключить помощника и еще больше сократить свои компоненты:
export default connectHelper = (componentClass) => {
return connect((state) => {
return { state: state }
})(componentClass)
}
class MyComponent extends React.Component {
...
}
export default connectHelper(MyComponent)
Я теряю способность сразу увидеть, какие свойства используются в моем магазине Redux, просто скиммируя вызов connect
. Я в порядке с этим.
Итак, мои вопросы:
Есть ли другие соображения, которыми я бы пожертвовал, по сути, обходя mapStatetoProps? Я обеспокоен тем, что, поскольку существует только одно свойство state
, React может чрезмерно рендерить каждый компонент каждый раз, когда изменяется любое свойство в хранилище Redux. Вот почему необходимо отображать свойства вручную в mapStateToProps?
Что я теряю, пропуская mapDispatchToProps и используя введенную по умолчанию this.props.dispatch
? Я должен сделать «дополнительную» работу, чтобы отобразить состояния непосредственно в mapDispatchToProps; что я получу за это усилие?
Существуют ли другие организации / шаблоны кода, помогающие уменьшить беспорядок в свойствах компонентов в настройке React + Redux?
Спасибо! Просто обхватить мою голову этими инструментами. Это было забавное упражнение, но некоторые вещи казались немного странными!