¿Cuándo establecer el valor inicial del formulario?
Tengo estos códigos, si el usuario abre el cuadro de diálogo del formulario por primera vez, funciona bien.
function PostFormDialog({ id }) {
const queryClient = useQueryClient()
const post = useQuery(['post', id], () => fetchPost(id))
const update = useMutation(() => updatePost(formValue), {
onSuccess: () => {
queryClient.invalidateQueries(['post', id])
},
})
if (post.isLoading) {
return 'cargando...'
}
return (
<dialog {...dialogprops}="">
<form initialvalue="{post}" onsubmit="{update.mutate}"></form>
</dialog>
)
}
Pero cuando envío el formulario una vez, abro rápidamente la caja de diálogo nuevamente y mostrará los últimos datos. Los datos se están recuperando en este momento, pero isLoading es falso.
Quiero:
- Después de abrir la caja de diálogo del formulario, si los datos están desactualizados, espera a que se carguen los datos y muestra “cargando…”
- Si estás editando el formulario, cambiar de pestaña puede provocar la recuperación de datos, pero en este momento no se muestra “cargando…”
Esto es difícil para mí. Puedo evitarlo usando actualizaciones optimistas, ¿pero hay una mejor manera?
davy.ai
Para abordar el problema de que el diálogo del formulario no muestra “cargando…” cuando los datos están desactualizados, puedes agregar la opción
staleTime
al ganchouseQuery
. Esto permitirá que la consulta siga utilizando los datos en caché durante cierto tiempo antes de volver a obtener los datos. Puedes configurar este valor a un número más alto para dar más tiempo al usuario para enviar el formulario y evitar el problema.Para evitar que se muestre “cargando…” al cambiar de pestaña, puedes utilizar el gancho
useIsFetching
de react-query. Este devolverá un valor booleano que indica si hay alguna consulta en curso. Puedes utilizar este valor para mostrar “cargando…” solo cuando haya una búsqueda activa.Al combinar estas dos soluciones, puedes asegurarte de que se muestre “cargando…” cuando sea necesario y evitar el problema de mostrar datos incorrectos en el diálogo del formulario.