1. Что такое Редукс?
Redux — это контейнер состояния JavaScript, обеспечивающий предсказуемое управление состоянием. Он специально разработан для фреймворка React.js, но не только для реакции, а для любой интерфейсной библиотеки.
Итак, зачем React.js нужно это управление контейнерами состояний?
Во-первых, понятно, что такое React.По официальному определению, React — это только фреймворк для слоя представления, который решает проблему рендеринга данных и шаблонов, но не предоставляет решения для управления состоянием данных, которое очень большой проект в больших проектах Болевые точки. Например:
Любое сложное приложение будет иметь такую древовидную структуру компонентов, так как же компоненты, не являющиеся родительскими и дочерними, передают данные? Например, компонент, отмеченный синим цветом, передает данные компоненту в правом нижнем углу.Если используется только метод передачи значения родитель-потомок компонента реакции, его нужно сначала передать родительскому компоненту, а затем передать от родительского компонента к родительскому компоненту верхнего уровня, а затем переход к следующим подкомпонентам... Очевидно, это просто взаимодействие двух компонентов, не слишком ли неудобно использовать такую сложную операцию? Если проект немного сложен, он становится неуправляемым, даже если его можно развивать. Так появился Redux. Позвольте Redux управлять данными унифицированным способом, и операции любого компонента над данными передаются Redux для управления, что значительно повышает эффективность разработки и обслуживания.2. Принципы дизайна Redux
1. Единый источник данных
В программах, использующих избыточность, все состояние хранится в одном хранилище источника данных, подобно огромному дереву объектов.
2, состояние только для чтения
Состояние доступно только для чтения, единственный способ изменить состояние извне — запустить действие для его изменения.
3. Используйте чистые функции для изменения
Для того, чтобы описать, как действие меняет состояние, нужно написать какую-то конкретную логику, которую пропишут в редюсере. Редуктор — это какая-то чистая функция.
Чистая функция: с фиксированным входным параметром и фиксированным возвратным выходом не будет асинхронной операции, и значение параметра не будет изменено в процессе.
3. Рабочий процесс Redux
Может быть, на первый взгляд не очень понятно, не беда, в качестве аналогии можно использовать пример заимствования книг из библиотеки: Картинка стоит тысячи слов, на самом деле рабочий процесс redux тоже очень прост.В-четвертых, используйте избыточность
// src/store/index.js
import { createStore } from 'redux';
import reducer from './reducer';
//通过createStore创建一个store,把reducer作为参数传入
const store = createStore(
reducer,
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()//chrome中激活redux devtools插件
);
export default store;
// src/store/reduce.js
const defaultState = {
inputValue: '',
list: []
}
export default (state = defaultState, action) => {
if(action.type === 'add_item') {
const newState = JSON.parse(JSON.stringify(state))
newState.list.push(newState.inputValue)
newState.inputValue = ''
return newState
}
return state;
}
// App.js
import React, { Component } from 'react'
import store from './store/index.js'
class App extends Component {
constructor(props) {
super(props);
//从redux拿到state
this.state = store.getState()
//store需要通过一个方法给组件传递newState,并将这个方法传入subscribe函数的参数里面
this.handleStoreChange = this.handleStoreChange.bind(this)
store.subscribe(this.handleStoreChange)
}
render() {
return (
//渲染部分
);
}
handleStoreChange() {
//更新组件状态
this.setState(store.getState())
}
}
export default App;
//在响应点击事件的函数中
handleItemClick(e) {
const action = {
type: 'add_item',
value: e.target.value
}
//由store进行action的分发
store.dispatch(action)
}
5. Пишите Действия более научно
Если хорошенько подумать, то на самом деле есть проблема с частью действия в функции ответа, написанной выше, потому что когда мы вводим строку, мы случайно вводим не ту букву и не можем изменить состояние, но в это время редюсер не может распознать соответствующую введите, и об ошибке не будет сообщено. В настоящее время отладка может занять много времени.
В это время необходимо написать более стандартизированные действия для предотвращения подобных аварий.
// src/store/actionTypes.js
export const ADD_ITEM = 'add_item'
// src/store/actionCreators.js
import { ADD_ITEM } from "./actionTypes";
export const getAddItemAction = (e) => ({
type: ADD_ITEM
value: e.target.value
})
// src/store/reducer.js
import { ADD_ITEM } from './actionTypes'
const defaultState = {
inputValue: '',
list: []
}
export default (state = defaultState, action) => {
//这里改成ADD_ITEM
if(action.type === ADD_ITEM) {
const newState = JSON.parse(JSON.stringify(state))
newState.list.push(newState.inputValue)
newState.inputValue = ''
return newState
}
return state;
}
Затем в App.js
//首先引入Action
import { getAddItemAction } from './store/actionCreators'
//修改响应函数
handleItemClick(e) {
const action = getAddItemAction(e)
store.dispatch(action)
}
Хотя этот способ написания вводит типы действий и создатели действий, операция более хлопотная, но она может лучше справляться с управлением действиями больших и сложных проектов и фактически повышает эффективность разработки и обслуживания.
Это предварительный обзор редукса, и я надеюсь, что он будет полезен всем.