Могу ли я использовать HOC "connect-redux" "connect" для предоставления пользовательских селекторов "родовым" компонентам React через mapStateToProps?

Я пытаюсь создать повторно используемые компоненты React для большого проекта React, над которым работает моя команда. Например, у меня есть панель, которая состоит из двух подкомпонентов, каждый из которых состоит из дополнительных подкомпонентов.

Лучшее место для меня, чтобы подключиться к хранилищу Redux - это на верхнем уровне и передать реквизиты компонентам sub и sub-sub (я знаю, что это несколько противоречит цели Redux, но в остальном все становится слишком сложным).

Моя проблема заключалась в том, чтобы предоставить разные селекторы для каждого из "экземпляров" этого общего компонента верхнего уровня, чтобы они могли получать разные данные. Решение, которое я придумал, заключалось в том, чтобы обернуть каждый "экземпляр" в другой компонент, который в действительности состоял бы только из обертки "универсального" компонента в функции "подключения" HOC и передачи пользовательских селекторов через mapStateToProps,

То есть, я бы имел "общий компонент

// GenericPanelComponent.js
class GenericPanelComponent extends React.Component {
...
// component code
}
export default GenericPanelComponent

тогда каждый "экземпляр" будет предоставлять отличные данные через "соединение"

// SpecificInstance1.js 
import { connect } from 'react-redux';
import GenericPanelComponent from './GenericPanelComponent';


class SpecificInstance1 extends React.component {
// no code
}
const mapStateToProps = (state) => ({ specificInstanceData: specificInstance1Selector(state) });
export default connect(mapStateToProps)(GenericPanelComponent);

а также

 // SpecificInstance2.js 
    import { connect } from 'react-redux';
    import GenericPanelComponent from './GenericPanelComponent';

 // SpecificInstance2.js 
    class SpecificInstance2 extends React.component {
    // no code
    }
    const mapStateToProps = (state) => ({ specificInstanceData: specificInstance2Selector(state) });
    export default connect(mapStateToProps)(GenericPanelComponent);

Есть ли что-то концептуально или архитектурно не так с этим подходом? Если да, то как подавать пользовательские селекторы Redux и данные в повторно используемые компоненты React? Спасибо за любые идеи!

1 ответ

В этом подходе нет ничего плохого, HOC, например, connect, разработан таким образом, чтобы иметь такую ​​выгоду.

Чтобы использовать это эффективно, вы должны решить, какие реквизиты понадобятся вашему GenericPanelComponent, и предоставить их с помощью функции подключения. Единственное, что я хотел бы отметить в вашей текущей реализации, это то, что GenericPanelComponent не должен знать, какой это тип Panel, поэтому у него не должно быть разных реквизитов, как вы это сделали.

const mapStateToProps = (state) => ({ specificInstance1Data: specificInstance1Selector(state) });
const mapStateToProps = (state) => ({ specificInstance2Data: specificInstance2Selector(state) });

И вместо этого данные должны прийти на одной опоре

const mapStateToProps = (state) => ({ specificInstanceData: specificInstance1Selector(state) });
const mapStateToProps = (state) => ({ specificInstanceData: specificInstance2Selector(state) });
Другие вопросы по тегам