国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

vue中父組件異步數(shù)據(jù)通過props方式傳遞給子組件,子組件接收不到的問題

這篇具有很好參考價(jià)值的文章主要介紹了vue中父組件異步數(shù)據(jù)通過props方式傳遞給子組件,子組件接收不到的問題。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

vue中父組件異步數(shù)據(jù)通過props方式傳遞給子組件,子組件接收不到的問題

問題描述
組件化開發(fā)中經(jīng)常用到父子組件的通信,父傳子子傳父等數(shù)據(jù)的操作,如果父組件的數(shù)據(jù)是發(fā)請求從后端獲取的異步數(shù)據(jù),那么父組件將這個(gè)數(shù)據(jù)傳遞給子組件的時(shí)候,因?yàn)槭钱惒綌?shù)據(jù),就會(huì)出現(xiàn)父組件傳遞過去了,但是子組件mounted鉤子初始情況下是接收不到的問題。本篇文章記錄了一下這個(gè)問題的解決方案。

在說這個(gè)問題之前,我們先來回顧一下父子組件的生命周期

父子組件生命周期執(zhí)行順序

加載渲染數(shù)據(jù)過程父組件

beforeCreate -->
父組件 created -->
父組件 beforeMount -->
子組件 beforeCreate -->
子組件 created -->
子組件 beforeMount -->
子組件 mounted -->
父組件 mounted -->

更新渲染數(shù)據(jù)過程

父組件 beforeUpdate -->
子組件 beforeUpdate -->
子組件 updated -->
父組件 updated -->

銷毀組件數(shù)據(jù)過程

父組件 beforeDestroy -->
子組件 beforeDestroy -->
子組件 destroyed -->
父組件 destroyed

可以這樣理解,父組件生命周期中會(huì)先看看子組件的生命周期有沒有走完,子組件生命周期走完了,才會(huì)走父組件的生命周期。

問題分析
我們模擬一下父子組件通信的過程,寫個(gè)小demo??纯丛谧咏M件中的mounted鉤子中能不能接收到父組件傳遞過來的數(shù)據(jù)

父組件代碼

<template>
  <div id="app">
    <child :msg="msg"></child>
  </div>
</template>

<script>
import child from "./views/child";
export default {
  name: "App",
  components: {
    child,
  },
  data() {
    return {
      msg: "", // 我們要把父組件從接口獲取的數(shù)據(jù)存到data中的msg里面,然后再傳遞給子組件
    };
  },
  created() {
    // 用定時(shí)器模擬發(fā)請求異步獲取后端接口的數(shù)據(jù)
    setTimeout(() => {
      this.msg = "666";
    }, 200);
  },
};
</script>

子組件代碼

<template>
  <div>
      <h2>{{msg}}</h2>
  </div>
</template>

<script>
export default {
    props:{
        msg:{
            type:String,
            default:''
        }
    },
    mounted() {
        console.log('mounted鉤子中接收',this.msg);
    },
}
</script>

最終在mounted鉤子中會(huì)實(shí)現(xiàn),我們會(huì)發(fā)現(xiàn)打印不出來,如下圖
vue中父組件異步數(shù)據(jù)通過props方式傳遞給子組件,子組件接收不到的問題

當(dāng)然如果是同步的數(shù)據(jù)傳遞給子組件,子組件的mounted鉤子是能接收到,能打印出來的,這里就不演示了,因?yàn)槲覀冏鲰?xiàng)目開發(fā)的數(shù)據(jù)大多數(shù)都輸從后端的接口中獲取的異步數(shù)據(jù)的。

因?yàn)楦附M件傳遞給子組件的數(shù)據(jù),可能我們還要加工一下再使用,所以在mounted鉤子中獲取父組件傳遞過來的數(shù)據(jù)是一定要做的。那么,這里為什么mounted鉤子中打印不出來父組件傳遞過來的數(shù)據(jù),但是props最終接收到了,頁面最終還渲染出來了么?

原因淺析

我們知道,mounted鉤子默認(rèn)加載只會(huì)執(zhí)行一次,由于數(shù)據(jù)是要等到200毫秒以后才能拿到,那么子組件的mounted鉤子執(zhí)行的時(shí)候,還沒有拿到父組件傳遞過來的數(shù)據(jù),但是又必須要打印出來this.msg的結(jié)果,那這樣的話,就只能去打印props中的msg的默認(rèn)值空字符串了,所以打印的結(jié)果是一個(gè)空字符串,比如,我們在子組件中這樣打印就知道this.msg是不是空字符串了

mounted() {
        console.log('mounted鉤子中接收', this.msg == '');
    },

打印結(jié)果圖如下
vue中父組件異步數(shù)據(jù)通過props方式傳遞給子組件,子組件接收不到的問題
但是props是可以等的,是可以拿到異步的數(shù)據(jù)渲染的。所以就出現(xiàn)了上述的結(jié)果,有問題解決問題,接下來說一下解決這樣的問題的方案

方案一 使用v-if控制子組件渲染的時(shí)機(jī)

思路其實(shí)很簡單,就是初始還沒拿到后端接口的異步數(shù)據(jù)的時(shí)候,不讓組件渲染,等拿到的時(shí)候再去渲染組件。使用v-if="變量"去控制,初始讓這個(gè)變量為false,這樣的話,子組件就不會(huì)去渲染,等拿到數(shù)據(jù)的時(shí)候,再讓這個(gè)變量變成true,這樣的話,組件就會(huì)去渲染,此時(shí)數(shù)據(jù)也已經(jīng)得到了,這樣的話,在子組件的mounted鉤子中就拿到父組件傳過來的異步數(shù)據(jù)了。代碼如下

父組件

<template>
  <div id="app">
    <child :msg="msg" v-if="isGetData"></child>
  </div>
</template>

<script>
import child from "./views/child";
export default {
  name: "App",
  components: {
    child,
  },
  data() {
    return {
      msg: "",
      isGetData:false // 初始為false,就不會(huì)被渲染對應(yīng)的子組件
    };
  },
  created() {
    // 用定時(shí)器模擬發(fā)請求異步獲取后端接口的數(shù)據(jù)
    setTimeout(() => {
      this.msg = "666";
      this.isGetData = true // 拿到數(shù)據(jù)以后,再把isGetData置為true,這樣的話,組件就會(huì)被渲染啦,數(shù)據(jù)也就會(huì)被傳遞過去啦
    }, 200);
  },
};
</script>

子組件
這種方式,子組件不用動(dòng)代碼,在父組件中去做控制即可

但是這種方式有一個(gè)小小的缺點(diǎn),就是最終效果會(huì)顯得組件有些延遲才出現(xiàn)效果。因?yàn)楫惒綌?shù)據(jù)是從后端的接口獲取的,如果接口時(shí)間長一些的話,最終效果渲染也會(huì)慢一點(diǎn),但是!??!一般情況下,后端的接口速度都會(huì)控制在幾十到幾百毫秒的時(shí)間,一般情況下,不會(huì)出現(xiàn)好幾秒,甚至幾十秒的接口,所以瑕不掩瑜,這種方式不影響我們使用

方案二 子組件使用watch監(jiān)聽父組件傳遞過來的數(shù)據(jù)

父組件
這種方式父組件正常傳遞數(shù)據(jù)即可,不需要做什么代碼處理,只要在子組件中加一個(gè)監(jiān)聽即可

子組件

<template>
  <div>
    <h2>{{ editMsg }}</h2>
  </div>
</template>

<script>
export default {
  props: {
    msg: {
      type: String,
      default: "",
    },
  },
  watch: {
    // 監(jiān)聽到父組件傳遞過來的數(shù)據(jù)后,加工一下,
    // 存到data中去,然后在頁面上使用
    msg(newnew, oldold) {
      console.log("監(jiān)聽", newnew, oldold);
      this.editMsg = "---" + newnew + "---";
    },
  },
  data() {
    return {
      editMsg: "",
    };
  },
};
</script>

看一下這種方式對應(yīng)的效果圖
vue中父組件異步數(shù)據(jù)通過props方式傳遞給子組件,子組件接收不到的問題文章來源地址http://www.zghlxwxcb.cn/news/detail-402228.html

到了這里,關(guān)于vue中父組件異步數(shù)據(jù)通過props方式傳遞給子組件,子組件接收不到的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vue前端開發(fā)自學(xué),父子組件傳遞數(shù)據(jù),借助于Props實(shí)現(xiàn)子傳父

    vue前端開發(fā)自學(xué),父子組件傳遞數(shù)據(jù),借助于Props實(shí)現(xiàn)子傳父

    vue前端開發(fā)自學(xué),父子組件傳遞數(shù)據(jù),借助于Props實(shí)現(xiàn)子傳父! 之前我們說過,Props這個(gè)是用在父傳子的情況下,今天為大家介紹的代碼,就是在父組件里,自定義事件,綁定一個(gè)函數(shù),讓子組件可以接受到這個(gè)自定義事件綁定的函數(shù),從而“委婉”的傳遞數(shù)據(jù)給父組件。 如圖

    2024年01月23日
    瀏覽(27)
  • vue中父組件直接調(diào)用子組件方法(通過ref)

    目錄 1、vue2 中,父組件調(diào)用子組件的方法 2、vue3?中,父組件調(diào)用子組件的方法 在Vue 2中,父組件可以通過使用 ref 屬性來引用子組件的實(shí)例,然后通過該實(shí)例調(diào)用子組件的方法。 首先,在父組件的模板中,給子組件添加一個(gè) ref 屬性: 然后,在父組件的JavaScript代碼中,可以

    2024年04月27日
    瀏覽(23)
  • Vue組件的嵌套關(guān)系;父組件傳遞子組件props;子組件傳遞給父組件$emit;自定義事件;案例

    Vue組件的嵌套關(guān)系;父組件傳遞子組件props;子組件傳遞給父組件$emit;自定義事件;案例

    前面將所有的邏輯放到一個(gè)App.vue中: 在之前的案例中,只是創(chuàng)建了一個(gè)組件App; 如果一個(gè)應(yīng)用程序?qū)⑺械倪壿嫸挤旁谝粋€(gè)組件中,那么這個(gè)組件就會(huì)變成非常的臃 腫和難以維護(hù); 所以組件化的核心思想應(yīng)該是對組件進(jìn)行拆分,拆分成一個(gè)個(gè)小的組件; 再將這些組件組合

    2024年02月13日
    瀏覽(23)
  • vue3父組件異步props傳值,子組件接收不到值問題

    當(dāng)我們使用vue3進(jìn)行開發(fā)在創(chuàng)建組件的時(shí)候,子組件經(jīng)常需要調(diào)用父組件的數(shù)據(jù),那么這是就需要vue3的props進(jìn)行對父組件與子組件通信來達(dá)到傳值的效果 在使用props進(jìn)行父子組件通信時(shí),子組件無法成功渲染數(shù)據(jù),導(dǎo)致拿到數(shù)據(jù)為空問題 提示:這里填寫問題的分析: 在使用

    2024年02月11日
    瀏覽(21)
  • watch監(jiān)聽,解決Vue3父組件異步props傳值,子組件接收不到的問題

    watch監(jiān)聽,解決Vue3父組件異步props傳值,子組件接收不到的問題

    寫靜態(tài)數(shù)據(jù)的時(shí)候父組件傳值子組件接收并渲染是沒問題的,但當(dāng)父組件異步獲取數(shù)據(jù),子組件接收數(shù)據(jù)會(huì)晚于渲染,就會(huì)產(chǎn)生接收不到的問題,我在用echarts繪制圖表時(shí)圖表就直接不顯示 ?用watch監(jiān)聽props數(shù)據(jù)并在watch內(nèi)進(jìn)行賦值操作可解決該問題 直接上代碼 父組件,vue3語法

    2024年02月15日
    瀏覽(36)
  • 在 React 中,props(屬性)用于在組件之間傳遞數(shù)據(jù)

    在 React 中,props(屬性)用于在組件之間傳遞數(shù)據(jù)。它是父組件向子組件傳遞信息的一種方式,通過 props,父組件可以向子組件傳遞數(shù)據(jù)、回調(diào)函數(shù)、配置項(xiàng)等。 注意: props 是只讀的,它的值由父組件傳遞給子組件時(shí)確定,并且在子組件中不能直接修改。如果子組件需要改

    2024年02月15日
    瀏覽(29)
  • vue前端開發(fā)自學(xué)練習(xí),Props數(shù)據(jù)傳遞-類型校驗(yàn),默認(rèn)值的設(shè)置!

    vue前端開發(fā)自學(xué)練習(xí),Props數(shù)據(jù)傳遞-類型校驗(yàn),默認(rèn)值的設(shè)置!

    ?vue前端開發(fā)自學(xué)練習(xí),Props數(shù)據(jù)傳遞-類型校驗(yàn),默認(rèn)值的設(shè)置! 實(shí)際上,vue開發(fā)框架的時(shí)候,充分考慮到了前端開發(fā)人員可能會(huì)遇到的各種各樣的情況,比如大家經(jīng)常遇到的,數(shù)據(jù)類型的校驗(yàn),再比如,默認(rèn)值的設(shè)定等等。下面給大家展示一下,源碼。和實(shí)際的效果。 如圖,

    2024年01月23日
    瀏覽(30)
  • Vue中父組件如何控制子組件的值

    Vue中父組件如何控制子組件的值

    前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站,這篇文章男女通用,看懂了就去分享給你的碼吧。 在Vue開發(fā)中,父組件和子組件之間的數(shù)據(jù)傳遞是一項(xiàng)常見的任務(wù)。本文將介紹如何在Vue中實(shí)現(xiàn)父組件控制子組件的

    2024年02月11日
    瀏覽(19)
  • 什么???你連vue中父組件怎么監(jiān)聽子組件的事件都不知道?快來看看vue2和vue3中父組件監(jiān)聽子組件事件的區(qū)別吧

    vue2和vue3中父組件監(jiān)聽子組件事件的區(qū)別 在Vue 2中,可以使用$emit方法在子組件上觸發(fā)自定義事件,并使用v-on或@指令在父組件中監(jiān)聽該事件,也就是通過父組件給子組件綁定一個(gè)自定義事件實(shí)現(xiàn)子給父傳遞數(shù)據(jù)。例如: 在這個(gè)例子中,當(dāng)子組件中的按鈕被單擊時(shí),將觸發(fā)ch

    2024年02月12日
    瀏覽(36)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包