#reactjs
Вопрос:
У меня есть форма по крайней мере с 30 входами. Я хочу показывать сообщение Do you want to save the changes ?
только в том случае, если пользователь внес какие-либо изменения, иначе не показывайте это сообщение. Решение, которое я могу придумать, это,
- Добавьте
onChange
событие в каждое поле ввода . - создайте логическую
state
переменную типаisChanged
и инициализируйте сfalse
помощью . - При любом
onChange
триггере события вызовите метод , подобныйhandleChange
handleChange
методу .inside , установите значениеisChanged
переменнойTrue
равным . - Если
True
затем показать сообщение, то больше не показывайте.
Мой вопрос в том, есть ли способ, которым мы можем захватить обмен с уровня формы вместо захвата onChange
из отдельных полей ?
Ответ №1:
Мой вопрос в том, есть ли способ, которым мы можем захватить обмен с уровня формы вместо захвата
onChange
из отдельных полей?
Да, вы можете использовать обработчик form
onChange
событий элемента.
Вы можете добавить дополнительный фрагмент состояния, чтобы отслеживать, загрязнена форма или нет, и в некоторых обратных вызовах, где вы хотите отобразить сообщение/предупреждение, проверьте dirty
состояние и условно отобразите сообщение.
const [dirty, setDirty] = React.useState(false);
const markFormDirty = () => setDirty(true);
...
/* in some callback */
if (dirty) {
... logic to trigger message ...
}
...
<form onChange={markFormDirty}>
...
</form>
function App() {
const [formKey, setFormKey] = React.useState(0);
const [dirty, setDirty] = React.useState(false);
const markFormDirty = () => setDirty(true);
const resetState = () => {
setFormKey((key) => key 1);
setDirty(false);
};
const submitHandler = (e) => {
e.preventDefault();
resetState();
};
const resetHandler = (e) => {
e.preventDefault();
if (dirty) {
if (window.confirm("Do you want to save the changes?")) {
window.alert("Saved!");
resetState();
}
}
};
return (
<div className="App">
<h1>
Form key: {formKey} - isDirty?: {dirty ? "yes" : "no"}
</h1>
<form
key={formKey}
onChange={markFormDirty}
onSubmit={submitHandler}
onReset={resetHandler}
>
{Array.from({ length: 10 }, (_, i) => i).map((i) => (
<div key={i}>
<label>
Text {i 1}
<input id={`test-${i}`} type="text" />
</label>
</div>
))}
<button type="submit">Submit</button>
<button type="reset">Reset</button>
</form>
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
rootElement
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.production.min.js"></script>
<div id="root" />