#reactjs
#reactjs
Вопрос:
Я пытаюсь сохранить объект в БД.
Поток идет следующим образом:
- Извлеките обновленные данные из базы данных (используйте для этого API), представьте их пользователю и сохраните в
useState
var. - Пользователь изменяет данные и нажимает «Сохранить».
- Повторная выборка обновленных данных из базы данных в случае, если другой пользователь внес изменения.
- Обновление последних извлеченных данных с новыми изменениями и отправка для обновления (с использованием API).
в настоящее время я застрял по 2 причинам:
- Данные извлекаются в состояние, поэтому мне нужно «подождать», пока новые данные будут асинхронно установлены в состояние. Я читал, что единственным вариантом является использование
useEffect
, хотя это не самое чистое решение. (таким образом,useEffect
будет содержать всю логику обновления, которая опасна в случае изменения данных без сохранения. Я могу использовать флаг сохранения, но все равно это не лучший подход.)
это то, что, как я думал, могло бы быть кодом:
useEffect(() => {
if (isSave) {
save()
setSave(false)
}
}, [dataFetched])
- Даже если я буду использовать
useEffect
, в случае, если «старые» данные будут совпадать с новыми данными,useEffect
не будут запущены, и данные не будут сохранены.
Что я могу сделать?
Комментарии:
1. Как вы извлекаете данные? Различные подходы имеют очень разные решения для этого ( простое сокращение, сокращение с промежуточным программным обеспечением, где вы можете
await dispatch(...)
,fetch()
API,useSWR()
и т.д.). Однако… Лично я БЫ НЕ стал заниматься этим на стороне клиента. Независимо от того, что вы пытаетесь, всегда может возникнуть конфликт, этот сценарий должен обрабатываться на стороне сервера при попытке обновить данные, и клиент должен только обрабатывать ответ 409 (который вы должны в любом случае, потому что серверу всегда нужно это делать)2. Вы можете установить начальное значение для вашего сохранения
let [save, setSave] = React.useState(initialValue)
3. @АдрианоРепетти 1. Я использую API. обновил вопрос. 2. Наш сервер получает весь объект целиком и сохраняет его как есть (после проверки). Как он может определить, исходят ли различия от пользователя или от конфликта?
4. @bubulledu93 как это мне помогает? Я боюсь, что useEffect будет запущен без нажатия кнопки save каким-либо образом. это не то, что я могу контролировать, потому что это зависит от чего-то, что связано с состоянием.
5. 1. Да, вы используете API, но то, как вы его вызываете (и как вы возвращаете его результат), является тем, что имеет значение здесь. 2. сервер ДОЛЖЕН выполнить эту проверку, это не то, что вы можете оставить клиенту (что можно обойти / подделать). Представьте, смогу ли я переопределить ваше бронирование самолета своими собственными данными после того, как вы успешно забронировали место (потому что сервер не проверяет и доверяет клиентам). На практике: нужно ли этой стороне сервера и веб-клиенту просто правильно обрабатывать код состояния HTTP 409 (информировать пользователя? попробуйте выполнить согласование ?)