Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

207
Visualizações
¿Cómo mirar solo después de la carga inicial de la API en VueJS?

Obtengo datos de la API con los que estoy completando el formulario en mi componente. Necesito activar a los observadores solo después del llenado inicial de datos. Como de forma asíncrona. Pero el observador se activa de inmediato. Necesito deshabilitar el botón Actualizar solo si se cambia algún valor después del llenado inicial de datos.

 <template> <div id="app"> <input type="text" v-model="user.userId" /> <br /> <br /> <input type="text" v-model="user.title" /> <br /> <br /> <button :disabled="isDisabled">Update</button> </div> </template> <script> export default { name: "App", watch: { user: { handler(oldVal, newVal) { if (oldVal != newVal) { this.isLoaded = false; } }, deep: true, }, }, computed: { isDisabled() { return this.isLoaded; }, }, async created() { await fetch("https://jsonplaceholder.typicode.com/todos/1") .then((response) => response.json()) .then((json) => { this.user = json; this.isLoaded = true; }); }, data() { return { user: { userId: 0, id: 0, title: "", completed: false, }, isLoaded: true, }; }, }; </script>

Me he referido a Vue, espero a Watch y ¿Son los relojes asíncronos? y Vue.js Cómo observar antes de montar() , no puedo obtener datos del reloj pero no puedo seguir.

Aquí hay una vista previa: https://codesandbox.io/embed/great-euler-skd3v?fontsize=14&hidenavigation=1&theme=dark

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Esto debe determinarse con alguna condición.

isLoaded ya sirve para determinar el estado de carga inicial, pero el nombre es confuso porque determina que los datos no se cargan.

Puede ser:

 watch: { user: { if (this.isLoading && oldVal != newVal) { this.isLoading = false; } ...

El observador no necesita ser deep y se puede dejar de ver cuando no se necesita:

 async created() { let unwatchUser = this.$watch('user', (oldVal, newVal) => { if (this.isLoading && oldVal != newVal) { this.isLoading = false; unwatchUser(); } }) ...

Una forma común de indicar que los datos aún no se han cargado es establecerlos en null , es decir, sin valor. Esto no necesita el indicador isLoading o un observador. Si null no es deseable debido a las propiedades del objeto al que se hace referencia, esto se puede solucionar con el encadenamiento opcional y la representación condicional:

 <div v-if="user"> <input type="text" v-model="user.userId" /> ... <div v-else class="spinner"/>
about 4 years ago · Juan Pablo Isaza Relatório

0

La respuesta más simple para la pregunta:

P: ¿Cómo ver solo después de la carga inicial de la API en VueJS?

R: Agregue una bandera dentro de su watch (por ejemplo isLoaded ).

También hay un par de cosas mal con su código:

  • async/await en created no hace nada,
  • isDisabled no es necesario porque se basa solo en 1 valor de data . En su lugar, puede usar este valor ( isLoading ).
  • Si sus llamadas a la API fallan, el indicador isLoading no cambiará, un mejor enfoque es moverlo a finalmente .

Solución de su problema ( codesandbox ):

 <template> <div id="app"> <div v-if="!isFetching"> <input type="text" v-model="user.userId" /> <br /> <br /> <input type="text" v-model="user.title" /> <br /> <br /> <button :disabled="!isLoaded">Update</button> </div> <div v-else>Loading...</div> </div> </template> <script> export default { name: "App", data() { return { user: { userId: 0, id: 0, title: "", completed: false, }, isFetching: false, isLoaded: false }; }, watch: { user: { handler(oldVal, newVal) { if (!this.isFetching) { // this comparision doesn't work (cause oldVal/newVal is an object) if (oldVal != newVal) { this.isLoaded = false; } } }, deep: true }, }, created() { this.isFetching = true; fetch("https://jsonplaceholder.typicode.com/todos/1") .then((response) => response.json()) .then((json) => { this.user = json; this.isLoaded = true; }) .finally(() => this.isFetching = false) }, }; </script>
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda