Редуктор держит ваше состояние. Таким образом, способ думать об этом - «каковы части моей программы, которые могут измениться?» И затем оттуда, следующий вопрос: «Какое минимальное количество состояний требуется для моей программы?»
От взгляда на ваш пример, создается впечатление, что вы пытаетесь создать приложение, которое иногда отображает «привет мир» в пользовательском интерфейсе. Позвольте мне сделать еще несколько взаимодействий, чтобы помочь описать все фигуры.
Вначале я помогу вам создать программу с пустой меткой и кнопкой. Когда вы нажмете на кнопку, отобразится «hello world».
Хорошо, поэтому, чтобы ответить на первый вопрос: что может измениться? Приложение может отображать «привет мир» или ничего. Мы могли бы сохранить это несколькими способами. Если строка жестко закодирована, как вы уже упомянули выше, то действительно у вас есть сообщение bool
, показывающее сообщение, или нет.
И на второй вопрос: одно истинное значение в значительной степени является определением минимального состояния. Так давайте редуктор:
var initialState = {
showMessage: false,
};
var reducer = function(state, action) {
var newState = Object.assign({}, state);
if (action.type === 'BUTTON_PRESS') {
newState.showMessage = !newState.showMessage;
}
return newState;
}
Итак, теперь мы создали редуктор, что, когда он получает действие BUTTON_PRESS, он щелкает немного своего состояния.
Теперь давайте поговорим о том, как подключить этот редуктор до сокращения. Прямо сейчас, редуктор - простая функция javascript. Нам просто нужно передать этот магазин в redux с начальным состоянием. [createStore] [1]
P.S. Я обычно пишу код ES2015, так что могут быть небольшие опечатки в импортном синтаксисе CommonJS
var redux = require('redux');
var store = redux.createStore(reducer, initialState);
Следующая часть, чтобы посмотреть на redux-react
. Редукс-реакция - это клей, который работает в обе стороны в реакции. Он связывает данные из магазина redux, чтобы реагировать на реквизиты, и он соединяет ответные обратные вызовы (например, щелчок) с действиями сокращения.
Таким образом, концептуально это выглядит так. У вас есть реагирующий компонент с кнопкой. Когда вы нажимаете кнопку, мы хотим сгенерировать действие «BUTTON_PRESS». После этого ваш компонент реагирования больше не заботится о том, что происходит с BUTTON_PRESS. Его работа выполнена. BUTTON_PRESS мог сделать одно из бесконечных вещей. Теперь предположим, что redux-реакция выполняет свою работу и получает действие, переданное редуктору. Редуктор вычисляет свою новую логику и возвращает новое состояние. Это новое состояние имеет значение showMessage. Затем редукция-реакция выполняет вторую половину соединения и делает showMessage опорой для компонента. Чтобы быть ясным, нет явной причины, почему один и тот же реагирующий компонент должен реагировать на состояние, измененное вашим действием. Они могут быть разными компонентами.
Выражаясь в точки пули, вот как codeflow должно работать:
- Мы создаем начальный магазин с ShowMessage = ложной
- При создании Реагировать компонента, мы используем
connect
связать showMessage
на опору и обрабатывать onClick
кнопки в компоненте для создания действия «BUTTON_PRESS».
- Поскольку showMessage является ложным, изначально имеется только кнопка.
- Пользователь нажимает кнопку. Реагировать на вызовы в обработчик onClick
- Мы используем эффект редукции для отправки события BUTTON_PRESS
- Когда redux получает действие, он вызывает редуктор с текущим состоянием и действием. Редуктор отвечает за генерацию нового состояния в ответ на это действие
- редуктор устанавливает ShowMessage истины
- перевождь реагирует слушает сохранить изменения и когда он изменяет он изменяет опору для реагирования компоненты
- опоров изменения так реагируют на вызовы render()
- Внутри метода визуализации вы видите, что this.props.showMessage верно, поэтому вы отображаете сообщение.
А вот как можно было бы реализовать такой компонент реакции. Есть достаточно различий между компонентами React в ES5 vs ES2015, которые я только что дам вам версию ES2015 и снова извиняюсь.
class HelloWorld extends Component {
render() {
const message = this.props.showMessage ? "Hello world!" : "";
return (
<div id="label">{message}</div>
<div id="button" onClick={this.props.handleOnClick}>Toggle the message </div>
);
}
}
HelloWorld.propTypes = {
showMessage: PropTypes.bool.isRequired,
handleOnClick: PropTypes.func.isRequired,
};
const mapStateToProps = state => ({
showMessage: state.showMessage,
});
const mapDispatchToProps = dispatch => ({
handleOnClick: dispatch({ type: 'BUTTON_PRESS', payload: '' })
});
export default connect(mapStateToProps, mapDispatchToProps)(HelloWorld);
Вы можете продолжать читать документы, но я надеюсь, что это поможет объяснить все детали. Дайте мне знать, если что-то неясно. [1]: http://redux.js.org/docs/api/createStore.html
Ничего себе, что щедрое использование времени yoru со мной. Спасибо за подробный ответ. Государство всегда казалось мне таким абстрактным. Кажется, что вы говорите, если я всегда хочу, чтобы он отображал мир привет, тогда вообще не нужно реагировать, потому что реагирование полезно, когда вы хотите внести изменения в страницу. Если не будет никаких изменений, нет никаких изменений в состоянии, необходимых, и, следовательно, не нужно реагировать (в данном случае, по крайней мере). Правильно ли это? Другой вопрос: почему вы не можете изменить состояние напрямую? Почему это вызывает проблемы? Почему мы всегда должны создавать новые государства? –
Не нужно также добавлять тип: type в initialState? Наконец, im, предполагая, что мой компонент выглядит следующим образом: '' 'var BUTTON_PRESS = 'BUTTON_PRESS'; var buttonPress = функция() { возвращение { тип: BUTTON_PRESS, showMessage: showMessage }; }; export.BUTTON_PRESS = BUTTON_PRESS; export.buttonPress = buttonPress; '' ' –
** React ** в основном используется для рисования пользовательского интерфейса. Он имеет собственный способ управления состоянием через реквизит и 'setState'. ** Redux ** в основном используется для управления состоянием. Для этого примера игрушек не существует необходимости в сокращении. Redux более полезен, когда ваш логический уровень состояния более сложный. 2. http://redux.js.org/docs/introduction/ThreePrinciples.html#state-is-read-only – AnilRedshift