Тож я почав вивчати React тиждень тому, і я неминуче дійшов до проблеми стану та того, як компоненти повинні взаємодіяти з рештою програми. Я шукав навколо, і Redux здається смаком місяця. Я прочитав всю документацію і думаю, що насправді це досить революційна ідея. Ось мої думки щодо цього:
Загалом держава вважається досить злим і великим джерелом помилок у програмуванні. Замість того, щоб розкидати все це по вашому додатку, Redux каже, чому б просто не сконцентрувати все це у глобальному дереві станів, яке вам потрібно виконати, щоб змінити дії? Звучить цікаво. Усі програми потребують стану, тож давайте вкладемо його в один нечистий простір і модифікуємо лише зсередини, щоб помилки було легко відстежити. Тоді ми також можемо декларативно прив’язати окремі фрагменти стану до компонентів React і зробити їх автоматичним перемальовуванням, і все прекрасно.
Однак у мене є два запитання щодо всього цього дизайну. По-перше, чому дерево держав має бути незмінним? Скажімо, я не дбаю про налагодження подорожей у часі, гаряче перезавантаження та вже застосував скасування / повтор у своєму додатку. Це просто здається таким громіздким, коли доводиться це робити:
case COMPLETE_TODO:
return [
...state.slice(0, action.index),
Object.assign({}, state[action.index], {
completed: true
}),
...state.slice(action.index + 1)
];
Замість цього:
case COMPLETE_TODO:
state[action.index].completed = true;
Не кажучи вже про те, що я роблю онлайн-дошку лише для того, щоб навчитися, і кожна зміна стану може бути такою ж простою, як додавання мазка пензля до списку команд. Через деякий час (сотні мазків) дублювання всього цього масиву може стати надзвичайно дорогим і трудомістким.
Я добре з глобальним деревом станів, яке не залежить від інтерфейсу користувача, який мутується за допомогою дій, але чи справді воно має бути незмінним? Що поганого в такій простій реалізації (дуже грубий проект. Написав за 1 хвилину)?
var store = { items: [] };
export function getState() {
return store;
}
export function addTodo(text) {
store.items.push({ "text": text, "completed", false});
}
export function completeTodo(index) {
store.items[index].completed = true;
}
Це все ще глобальне дерево станів, яке мутується за допомогою випущених дій, але надзвичайно простих та ефективних.
immutablejs
і використовуйте,return state.setIn([action.index, 'completed'], true);
щоб зменшити шаблон.