#javascript #reactjs #checkbox #ecmascript-6 #mapping
#javascript #reactjs #флажок #ecmascript-6 #сопоставление
Вопрос:
Я создал функцию ограничения выбора, которая гарантирует, что общий флажок выше минимального значения и ниже максимального значения, эти значения были взяты из JSON, из которого сопоставлены флажки, теперь ограничение выбора работает, но я пытаюсь добавить проверку для отображения предупреждений с помощью onblur, но я не уверен, как можно преобразовать ту же функцию в функцию проверки onblur. например, если кто-то снимает флажок, на консоли отображается, что вам нужно выбрать минимум 3, пока не будет установлено значение 3, по той же логике, что и selectData().
Функция
selectData(id, event) {
let isSelected = event.currentTarget.checked;
if (isSelected) {
if (this.state.currentData < this.props.max) {
this.setState({ currentData: this.state.currentData 1 });
} else {
event.preventDefault();
event.currentTarget.checked = false;
}
} else {
if (this.state.currentData >= this.props.min) {
this.setState({ currentData: this.state.currentData - 1 });
} else {
event.preventDefault();
event.currentTarget.checked = true;
}
}
}
Полный код:https://codesandbox.io/embed/48o2jo2500?fontsize=14
Комментарии:
1. Как это
onblur
событие будет обработано?2. из формы ввода типа <input onblur={функция}….
3. Не могли бы вы, пожалуйста, привести пример в code.pen. Прокомментировав строку и добавив событие, которое только
console.log('x')
тогда я смогу попытаться добавить функциональность, которую вы хотите4. @AlxL Прошу прощения, но ссылка на полный код не работает. Не могли бы вы, пожалуйста, исправить это, чтобы я мог видеть полный исходный код компонента?
Ответ №1:
Ваш общий подход, похоже, должен сработать, просто нужна утонченность для фактической реализации состояний ошибки. Однако здесь было бы предложено обновить ваше !isSelected amp;amp; this.state.currentData < this.props.min
условие, чтобы можно было выбрать менее трех, но отображать пользователю состояние ошибки.
...
} else {
if (this.state.currentData >= this.props.min) {
// this.setState({ currentData: this.state.currentData - 1 });
// UPDATE:
this.setState((state) => ({ currentData: state.currentData - 1 }));
} else {
event.preventDefault();
// Don't force the box to be selected, show error state instead
// Disable calls to filtering, sorting, etc. until error resolved
// event.currentTarget.checked = true;
}
}
}
Базовая реализация:
- Ванильный JavaScript: https://codepen.io/hollyos/pen/XGqryV
- Реагировать:https://codepen.io/hollyos/pen/EMpXdR
Комментарии:
1. Имейте в виду, что это
setState
асинхронно, и доступ к предыдущемуcurrentData
значению, как вы это делали, небезопасен. Вы должны написатьthis.setState((state) => ({ currentData: state.currentData - 1 }));