React-Redux: добавить пользовательский третий параметр в mapStateToProps - возможно, connectAdvanced?

У меня есть приложение, использующее React и Redux.

Некоторые части моей модели данных потенциально ленивы, поэтому общий шаблон при чтении данных из состояния redux: поиск, если ленивые данные уже загружены, если нет, отправьте действие ReduxThunk, которое извлекает данные.

Чтобы иметь возможность запускать этот процесс в mapStateToProps, я хочу реализовать собственную функцию подключения, которая передает функцию разрешения в качестве третьего параметра в mapStateToProps. Эта функция разрешения должна иметь доступ к отправке, чтобы я мог инициировать загрузку ленивых данных ReduxThunk-действием. Моя функция mapStateToProps должна выглядеть так:

const mapStateToProps = (state, ownProps, resolve) => {

    var myData;

    if (state.potentiallyLazy instanceof LazyLink) {
        resolve(state.potentiallyLazy);
    }
    else {
        myData = state.potentiallyLazy;
    }

    return {
        myData
    }
}

Любая помощь, как этого добиться, или подсказка для другого подхода? Я посмотрел на connectAdvanced (), но на самом деле не нашел решения.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
318
2

Ответы 2

Вы можете расширить HOC подключения, чтобы добавить функцию разрешения, например

export connectAdvanced = (...args) => {
    const resolve = () => {} // your resolve function here
    const [mapStateToProps] = args;
    const overridenMapStateToProps  = (state, ownProps) => {
        mapStateToProps(state, ownProps, resolve)
    }  
    const restParams = [overridenMapStateToProps, ...args.slice(1)];
    return (Component) => connect.apply(null, restParms)(Component);
}

и используйте это как

const mapStateToProps = (state, ownProps, resolve) => {

    var myData;

    if (state.potentiallyLazy instanceof LazyLink) {
        resolve(state.potentiallyLazy);
    }
    else {
        myData = state.potentiallyLazy;
    }

    return {
        myData
    }
}

export default connectAdvanced(mapStateToProps)(App);

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

Это плохая идея на нескольких уровнях.

Во-первых, ваши функции долженmapState должны быть чистыми, синхронными и не иметь побочных эффектов, как и ваши редукторы.

Во-вторых, похоже, что вы храните экземпляры классов в состоянии вашего хранилища, что не рекомендуется, потому что это нарушит отладку путешествий во времени.

Если вам нужно инициировать поведение загрузки, я бы предложил поместить его внутри компонент в методы жизненного цикла.

Другие вопросы по теме