Resuelva el problema de que el componente principal en vue pasa datos al componente secundario a través de accesorios, pero el componente secundario no puede recibirlos

Problema: el componente principal inicia una solicitud al backend para obtener datos durante el montaje y luego pasa los datos obtenidos al componente secundario. El componente secundario desea obtener datos durante el montaje, pero no puede obtenerlos.

Ejemplo de código:

//父组件
<template>
  <div>
    <HelloWorld :message="message"></HelloWorld>
  </div>
</template>

<script setup>
import HelloWorld from "./components/HelloWorld.vue";
import {
    
     onMounted, ref } from "vue";
const message = ref("1");
onMounted(() => {
    
    
//模拟异步请求
   setTimeout(() => {
    
    
    message.value = "1312";
  }, 0);
});


</script>

<style scoped></style>
//子组件
<template>
  <div>{
    
    {
    
    message}}</div>
</template>

<script setup>
import {
    
     onMounted, defineProps } from "vue";
const props = defineProps(["message"]);
onMounted(() => {
    
    
  console.log("传递过来的数据", props.message);
});
</script>

<style scoped></style>

Resultado de impresión: props.message está vacío, que es el valor inicial del mensaje del componente principal, pero los datos del componente secundario se pueden representar
inserte la descripción de la imagen aquí

Análisis de causa:

El orden de ejecución del ciclo de vida de los componentes padre-hijo es el siguiente:

Cargar proceso de renderizado de datos

  • componente padre beforeCreate
  • componente principal creado
  • componente padre beforeMount
  • Subcomponente beforeCreate
  • Subcomponente creado
  • Subcomponente beforeMount
  • Subcomponente montado
  • Componente principal montado

Actualizar datos de renderizado

  • componente padre beforeUpdate
  • Subcomponente beforeUpdate
  • subcomponente actualizado
  • componente principal actualizado

Destruir proceso de datos de componentes

  • Componente padre beforeUnmount
  • Subcomponente beforeUnmount
  • Subcomponente desmontado
  • componente principal desmontado

Del proceso de representación de datos de carga anterior, se puede ver que el componente montado del componente secundario se monta antes que el componente montado del componente principal, por lo que no se pueden obtener los datos obtenidos después de la solicitud asincrónica.

Solución

Método 1: use v-if para controlar el tiempo de procesamiento de los subcomponentes

//父组件
<template>
  <div>
    <HelloWorld :message="message" v-if="isShow"></HelloWorld>
  </div>
</template>

<script setup>
import HelloWorld from "./components/HelloWorld.vue";
import {
    
     onMounted, ref } from "vue";
const message = ref("1");
const isShow=ref(false);
onMounted(() => {
    
    
//模拟异步请求
   setTimeout(() => {
    
    
    message.value = "1312";
    isShow.value=true;//获取数据成功,再让子组件渲染
  }, 0);
});

</script>

<style scoped></style>

Método 2: use el reloj para monitorear los datos pasados ​​por el componente principal

//子组件
<template>
  <div>{
    
    {
    
    message}}</div>
</template>

<script setup>
import {
    
     defineProps,watch} from "vue";
const props = defineProps(["message"]);
//监听传过来的数据
watch(()=>props.message,()=>{
    
    
 console.log("传递过来的数据", props.message);
})
</script>
<style scoped></style>

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/CYL_2021/article/details/130323719
Recomendado
Clasificación