Здравствуйте, я независимый веб-разработчик из Украины. И я хочу рассказать вам в этой статье, как я изучал Redux.js (в следующем «редуксе»).

Я сделал для себя такой вывод, изучая программирование: если вы чего-то не понимаете — сделайте паузу. Сделайте что-нибудь еще. Если эти знания вам понадобятся, попробуйте еще раз выучить. Тогда будет еще больше шансов понять эту технологию.

В моем случае с редуксом, когда я впервые попытался изучить его, я изучал javascript, react.js, node.js. Но при первой попытке понять избыточность это было напрасно. Я сделал паузу и начал изучать Python (и немного Laravel и GO).

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

Итак, когда я пытался выучить со второй попытки, редукс стал более понятным для понимания.

Приступим, сначала заглянем в официальную документацию редукс.

Состояние всего вашего приложения хранится в дереве объектов в одном (хранилище). Магазин содержит все дерево состояний вашего приложения. Единственный способ изменить состояние внутри него — отправить на него (действие) — объект, описывающий, что произошло. (Reducers) указывает, как изменяется состояние приложения в ответ.

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

Сначала напишите действия

actions/index.js
// write constant and do export her
export const TOGGLE_MODAL = ‘TOGGLE_MODAL’
// when this action is active, for reducer, action function do 
// return: action type and action data.
export function showModal(flag){
    return {
        type: TOGGLE_MODAL,
        flag
    }
}

Потом наши редукторы. Если в вашем приложении много компонентов, для которых требуется избыточность, создайте для каждого компонента действия и редукторы, а затем объедините их в index.js. В этом примере только один редюсер, поэтому мы пишем его в index.js

reducers/index.js
import { combineReducers } from 'redux'
// from actions we import our const which we wrote past
import TOGGLE_MODAL from '../actions'

// the switch checked action type, who came from actions. In this case, reducer just return data from action
function toggleModal(state = false, action){
    switch (action.type) {
        case TOGGLE_MODAL:
            return action.flag
        default:
            return state
    }
}
// Combine many reducers and export this
const rootReducer = combineReducers({
    toggleModal
})
export default rootReducer

Теперь очередь компонента, в котором мы будем использовать приведенный выше редукс.

// this our main run file
containers/mainContainer.js

import React, { Component } from 'react'
import { connect } from 'react-redux'
import PropTypes from 'prop-types'
import { showModal } from '../actions'
class Example extends Component{
    // handler for  dispatch showModal (call action => 
    // active reducer => update store)
    handleActionModal = () => {
        this.dispatch(showModal(!this.props.toggleModal))
    }
    // event handler function close and open modal for background
    // modal and close button
    handleToggleModal = (e) => {
        if(e.target === document.querySelector(".modal-custom") ||
        e.target === document.querySelector(".modal-close")){
            this.dispatch(showModal(!this.props.toggleModal))
        }
    }
    //  custom modal for show detailed info
    modalCustom(data){
        return(
            <div className="custom-modal"
            style={{display: this.props.toggleModal? "flex":"none"}}
            // if click on outside of main info, modal will be closed
            onClick={(e) => this.handleToggleModal(e)}>
            // and add close action to close_button
                <img src="/close_circle.svg" alt="close" className="close-modal" onClick={this.handleToggleModal}/>
                {data.url&&
                <img className="image-content" src={data.url}
                alt={data.title}
                />
                }
                {!data.url&&
                <h1>Loading ...</h1>
                }
            </div>
        )
    }
    render () {
        // get data from props
        const { data } = this.props
        return (
            <div>
                {this.props.toggleModal&&
                 this.modalCustom(data)
                 }
                 // hendler event connect to button
                 <button onClick={ this.handleActionModal }>Active Modal</button>
// for send data with arrow functions
// <button onClick={ () => this.handleActionModal(data) }>Active Modal</button>
            </div>
        )
    }
}
Records.propTypes = {
    data: PropTypes.array.isRequired,
    toggleModal: PropTypes.bool.isRequired
}
// write props from state
function mapStateToProps(state) {
    const { data, toggleModal } = state
    return {
        data,
        toggleModal
    }
}
export default connect(mapStateToProps)(Example)

P.S: Вы также можете посмотреть видео, рекомендованное авторами Redux.

https://egghead.io/courses/начало-с-редукс