Pull to refresh

React-redux, connect по-новому, разделение отвественности в компонентах

При написании SPA с помощью связки react-redux, для работы с redux используют функцию connect в файле react компонента для проброски стейта и «диспатча». Вся боль в том, что «коннекторы» и «диспатчеры» многие описывают там же, в компоненте. В этой статье я опишу connect по новому, и покажу простой способ разделения кода. Базовое использование connect выглядит так:

import React,{Component} from 'react';
import {connect} from 'react-redux';

class Table extends Component{
    constructor(props){ /* some code */ }
    componentWillReceiveProps(props){ /* update local state */ }
    render(){ /* some JSX */}
}

export default connect(
    function stateToProps(){},
    function dispatchToProps(){})
(Table);

Как в hello world, мы оборачиваем компонент в connect + stateToProps + dispatchToProps. Юзабельность такого кейса оставляет желать лучшего. Для гибкой манипуляции и повторного использования кода — «разделяем и властвуем».

Отделив stateToProps и dispatchToProps от компонента и немного преобразовав подход у connect, мы сможем независимо друг от друга использовать stateToProps и dispatchToProps и компоненты.
Это будет выглядеть так:

Компонент Table
import React,{Component} from 'react';
import {connect} from 'react-redux';

class Table extends Component{
    constructor(props){ /* some code */ }
    componentWillReceiveProps(props){ /* update local state */ }
    render(){ /* some JSX */}
}

export default Table;

Компонент App

import React,{Component} from 'react';
import {createStore} from 'redux';
import { connect,Provider } from 'react-redux';
import ConnectComponent from './ConnectComponent';

import store from './Store';
import state1 from './states/state1';
import state2 from './states/state2';
import dispatch from './actions/action1';

import Table from './components/Table';

class App extends Component {

    render(){
        return (
            <Provider store={store}>
                <>
                    <ConnectComponent 
                       state={state1} 
                       dispatch={dispatch} 
                       component={Table}/>
                    <ConnectComponent 
                       state={state2} 
                       dispatch={dispatch} 
                       component={Table}/>
                </>
            </Provider>
        );
    }
}

export default App;

Компонент ConnectComponent немного преобразует работу с connect, позволяя по другому использовать HOC connect.

import React from 'react';
import {connect} from 'react-redux';

export default function ConnectComponent(props){
    let C = connect( props.state,props.dispatch)(props.component);
    return (<C/>);
}

На текущий момент минус заключается в том, что мы получаем еще одну обертку в DOM дереве, еще один HOC. Это временно, так как функцию connect можно апдейтнуть )
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.