Проблемы с использованием контекста
Я изо всех сил пытаюсь понять, почему установка контекста с помощью assign не всегда работает. У меня есть очень простое приложение, которое вы можете найти здесь https://codesandbox.io/embed/y0xk1mo9x9
У меня есть этот контекст:
{
selectedItem: 0, //Fake Value
nextSelectedItem: 0
}
который обновляется этими функциями:
const decrementNextSelectItem = (context, event) => {
console.log("decrementNextSelectItem: " + context.nextSelectedItem);
assign({
nextSelectedItem:
context.nextSelectedItem > 0
? context.nextSelectedItem--
: context.nextSelectedItem
});
console.log("decrementNextSelectItem is now: " + context.nextSelectedItem);
};
const incrementNextSelectItem = (context, event) => {
console.log("incrementNextSelectItem: " + context.nextSelectedItem);
assign({
nextSelectedItem:
context.nextSelectedItem < 5
? context.nextSelectedItem++
: context.nextSelectedItem
});
console.log("incrementNextSelectItem is now: " + context.nextSelectedItem);
};
const updateCurrentSelectedItem = (context, event) => {
console.log(" updateCurrentSelectedItem: " + context.selectedItem);
assign({
selectedItem: context.nextSelectedItem
});
console.log(" updateCurrentSelectedItem is now: " + context.selectedItem);
};
decrementNextSelectItem
(связан с событием UP_KEY - нажмите стрелку вверх) и incrementNextSelectItem
(связаны с событием DOWN_KEY - нажмите стрелку вниз) правильно называются:
incrementNextSelectItem: 0
incrementNextSelectItem is now: 1
DOWN KEY pressed
incrementNextSelectItem: 1
incrementNextSelectItem is now: 2
DOWN KEY pressed
incrementNextSelectItem: 2
incrementNextSelectItem is now: 3
DOWN KEY pressed
decrementNextSelectItem: 3
decrementNextSelectItem is now: 2
UP KEY pressed
Но updateCurrentSelectedItem
(связан с событием OK_KEY - нажмите клавишу "o"), не работает должным образом:
updateCurrentSelectedItem: 0
updateCurrentSelectedItem is now: 0
OK KEY pressed
Есть ли причина? Схожу с ума.
0 ответов
То, как определены ваши действия, вызовет эту проблему, в ваших DecmentNextSelectItem и incrementNextSelectItem вы изменяете значения контекста при выполнении:
context.nextSelectedItem++
или
context.nextSelectedItem--
а затем в функции updateCurrentSelectedItem вы ожидаете, что использование assign, как вы использовали в других действиях, даст вам правильный результат:
assign({
selectedItem: context.nextSelectedItem
});
но что вы действительно хотели сделать, так это определить свое действие так
const updateCurrentSelectedItem = assign({
selectedItem: (context, event) => context.nextSelectedItem
})