1. Что такое Редукс?
Redux — это контейнер состояния JavaScript, обеспечивающий предсказуемое управление состоянием. Он специально разработан для фреймворка React.js, но не только для реакции, а для любой интерфейсной библиотеки.
Итак, зачем React.js нужно это управление контейнерами состояний?
Во-первых, понятно, что такое React.По официальному определению, React — это только фреймворк для слоя представления, который решает проблему рендеринга данных и шаблонов, но не предоставляет решения для управления состоянием данных, которое очень большой проект в больших проектах Болевые точки. Например:
2. Принципы дизайна Redux
1. Единый источник данных
В программах, использующих избыточность, все состояние хранится в одном хранилище источника данных, подобно огромному дереву объектов.
2, состояние только для чтения
Состояние доступно только для чтения, единственный способ изменить состояние извне — запустить действие для его изменения.
3. Используйте чистые функции для изменения
Для того, чтобы описать, как действие меняет состояние, нужно написать какую-то конкретную логику, которую пропишут в редюсере. Редуктор — это какая-то чистая функция.
Чистая функция: с фиксированным входным параметром и фиксированным возвратным выходом не будет асинхронной операции, и значение параметра не будет изменено в процессе.
3. Рабочий процесс 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)
}
Хотя этот способ написания вводит типы действий и создатели действий, операция более хлопотная, но она может лучше справляться с управлением действиями больших и сложных проектов и фактически повышает эффективность разработки и обслуживания.
Это предварительный обзор редукса, и я надеюсь, что он будет полезен всем.