рассмотрение
- Первое знакомство с реакцией (1) Раскрыть синтаксис jsx и виртуальный DOM
- Первое знакомство с реакцией (2) Реализовать упрощенную демку html+redux.js
- Первое знакомство с реагированием (3) Использование редукса в реагировании для реализации упрощенного счетчика
- Первое знакомство с react (4) redux-saga, асинхронное решение в react
- Первое знакомство с реакцией (5) Окончательное решение потока данных dva (нулевая конфигурация)
предисловие
Прежде всего, чтобы исправить недоразумение, redux можно использовать с такими фреймворками, как jq, не ограничиваясь только реакцией. Чтобы всем было понятно, мы реализуем здесь только использование самой простой версии html+redux.js.
Почему появляется редукс
Из-за сложности одностраничных приложений трудно обмениваться состоянием между несколькими не связанными между собой компонентами.Появление Redux решает проблему данных.
Редукс дизайнерские идеи
- Redux хранит все состояние приложения в одном месте, называемый магазином
- Сохраняет дерево состояний дерево состояний
- Компоненты могут отправлять действия отправки в хранилище вместо прямого уведомления других компонентов.
- Другие компоненты могут обновлять свои представления, подписываясь на состояние в магазине.
Три принципа редукции
единственный источник правды
- Состояние всего приложения хранится в хранилище, которое мы называем хранилищем, и у всего приложения может быть только одно хранилище.
состояние только для чтения
- Единственный способ изменить состояние — это dispatch(action), то есть действие по отправке.
Используйте чистые функции для выполнения модификаций
- Напишите редукторы с чистыми функциями для каждого действия, чтобы описать, как изменить состояние
Столько наговорил, не понял?Не важно, есть три понятия: состояние, редюсер и действие. Давайте объясним API один за другим
Анализ концепции
1. Склад магазина
- redux предоставляет функцию createStore для создания магазина
- Хранилище — это место, где хранятся данные, которое можно рассматривать как контейнер. Все приложение может иметь только один магазин
function createStore(reducer) { //将状态放到一个盒子里 别人改不了
...
}
let store = createStore(reducer)
2. Государство государство
Объект хранилища содержит все данные. Если вы хотите получить данные в определенный момент времени, вам необходимо создать снимок хранилища. Сбор данных в этот момент времени называется состоянием. Состояние на текущий момент можно получить через store.getState().
let state = store.getState()
3. действие действие
- действие должно быть объектом, требуется тип, пользователи могут отправлять действия для изменения состояния.
let action = {
type:"change_title_text",
text:"改变标题了"
}
4. store.dispatch(action) действие отправки
- store.dispatch() — единственный способ выполнить действие
let store = createStore(reducer);
store.dispatch(action) //action=>{type:"change_title_text",text:"改变标题了"}
5. Администратор редуктора, также известный как обработчик
- После того, как Store получит отправленное действие, то есть dispatch(action), он должен вернуть новое состояние, чтобы представление изменилось.
- Этот процесс вычисления состояния называется Reducer, который представляет собой чистую функцию, которая принимает состояние и действие в качестве параметров и возвращает новое состояние.
let reducer = function(state,action){
return new_state;
}
После такой ерунды я рад, что закончил с основными понятиями и, наконец, приступил к практической битве, чтобы увидеть, как это работает. Давайте сделаем простой калькулятор, нажмите и добавьте 1, чтобы увидеть, как работает сокращение.
Шаги реализации счетчика (сокращение)
1. Объявить состояние инициализации
let initState = {number:0}
2. В центре внимания createStore
- Создать склад, сохранить состояние, выставить текущее состояние => getState и как изменить состояние => диспетчеризация
let createStore=(reducer)=> { //将状态放到一个盒子里 别人改不了
let state ; //声明状态
function dispatch(action) { //派发 参数是action动作,action是一个对象
state= reducer(state,action); //调用写好的方法,这个方法会返回一个新的状态
}
dispatch({}); //内部需要先定义次
let getState = ()=> JSON.parse(JSON.stringify(state)); //获取状态的方法 深拷贝
return {
getState,
dispatch
};
}
- Вам нужно знать, что действие — это объект => {тип: «добавить», количество: 5}, тип — добавить, и каждый щелчок добавляет 5
- При создании склада он по умолчанию вызывает сначала dispatch({}) и присваивает состояние по умолчанию состоянию
- Открывайте метод getState извне, чтобы пользователи могли получить последнее состояние.
- Выставляйте метод отправки извне, и пользователи могут отправлять действия
Когда вы не можете понять это, пока вы знаете, что есть только одна цель, вы назначаете значение по умолчанию в состояние. Первая отправка ({}) => Редуктор (состояние, действие). Вы можете назначить значение по умолчанию, чтобы понять, как, посмотрите вниз
3. Реализация редуктора
- Администратор, может возвращать разные статусы в зависимости от типа
let reducer=(state=initState,action)=> { //管理员,负责如何更改状态的
switch (action.type) { //更改状态 要有一个新的状态覆盖掉
case "add":
return {number:state.number+action.count}
}
return state;
};
Ладно, пока разберемся с идеями
- Будем вызывать let store = createStore(reducer) вот так, что тут происходит, как присвоить начальное состояние состоянию
- Шаг отправки ({}) => редуктор (initState, действие) => состояние = initState
4. Верните вид страницы в начальное состояние.
let store = createStore(reducer);
function render() {
let content = document.querySelector('.content');
content.innerHTML = store.getState().getState().number;
}
render();
- Привязать просмотр страницы к состоянию в магазине. увидеть эффект
Пока все идеально, так как же мы нажимаем кнопку для изменения состояния, только через метод store.dispatch()
5. Нажмите, чтобы изменить представление
btn.onclick = function () {
store.dispatch({type:"add",count:5});
render()
}
До сих пор было реализовано одно из самых простых приложений с редукцией. На самом деле, редукс относительно прост. Ключ в том, чтобы понять его концепцию. Я объясню, как использовать редукцию в реакции позже.