vue父組件異步獲取動態(tài)數(shù)據(jù)傳遞給子組件 獲取不到值的問題已完美解決 附demo

前幾天遇到一個問題坚弱,在父組件中使用axios獲取異步數(shù)據(jù)傳給子組件,但是發(fā)現(xiàn)子組件在渲染的時候并沒有數(shù)據(jù)关摇,在created里面打印也是空的,結(jié)果發(fā)現(xiàn)一開始子組件綁定的數(shù)據(jù)是空的输虱,在請求數(shù)據(jù)沒有返回數(shù)據(jù)時,子組件就已經(jīng)加載了宪睹,并且他綁定的值也是空的愁茁,問題找到了亭病,怎么解決那鹅很?有兩種方法解決罪帖,請看下面代碼。

方法一胸蛛、

開始的時候讓子組件隱藏,然后等數(shù)據(jù)返回的時候污茵,讓子組件顯示葬项。
<template>
  <div class="list">
    <ul v-if="list.length != 0">
      <li v-for="(item,index) in list" :key="index"</li>
    </ul>
  </div>
</template>
<script>
export default {
  props:['getList'], //接收一個數(shù)組
    data(){
      return {
        list: []
      }
    },
    watch:{   // 使用監(jiān)聽的方式,監(jiān)聽數(shù)據(jù)的變化
      getList(val){
        this.list = val;
      }
    }
}
</script>
不過這樣方式不太合適民珍,有bug襟士,比如我點擊一個按鈕去獲取數(shù)據(jù),然后在彈框里面展示數(shù)據(jù)陋桂,彈框是一個子組件逆趣,在獲取數(shù)據(jù)的這段過程有可能幾百毫秒嗜历,也有可能十秒或者更長時間,難道我要在點擊按鈕過十秒才讓彈框顯示嗎梨州?這這這絕對不行痕囱,推薦使用方法二

方法二暴匠、 推薦使用

大概邏輯:使用vuex全局狀態(tài)管理,其實簡單,利用vuex的輔助函數(shù)(mapState每窖,mapMutations)mapState是將state里面的數(shù)據(jù)映射到計算中(computed)帮掉,mapMutations也是類似窒典,把vuex中mutations的方法映射到組件里面旭寿,就可以在組件里面直接使用方法了,在vuex中使用異步(actions)去掉用接口崇败,然后在接口成功的函數(shù)里面取觸發(fā)同步(mutations)里面的方法,把得到數(shù)據(jù)傳給mutations里面的方法里并且給state里面的屬性賦值肩祥,然后就可以在子組件中使用computed計算中去獲取數(shù)據(jù)并且渲染到頁面上,其實說的有點繞( -_-")混狠,但是看代碼就明白了 岸霹。
vuex / index.js
import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'
Vue.use(Vuex) 
export default new Vuex.Store({  
    //定義初始數(shù)據(jù)
    state: {  
        title: '',
        list: [],
        isShow: false
    },
    //同步的方法
    mutations: {
        //向state 里面設(shè)置數(shù)據(jù)
        changeListMutation(state, list) {
            state.list = list
        },
        //在list.vue里面點擊下拉選項的時候觸發(fā) 給state.title賦值
        changeTitleMutation(state, title) {
            state.title = title
        },
        //selectinput.vue里面點擊input的時候觸發(fā) 給state.isShow賦值
        toggleShow(state, isShow) {
            state.isShow = isShow 
        }
    },
    //異步的方法
    actions: {
        //在list.vue里面created生命周期里面觸發(fā)
        getListAction({ commit }) {
            axios.get('/mock/5afd9dc0c088691e06a6ab45/example/dataList')
                .then((res) => {
                    commit('changeListMutation', res.data) //調(diào)用mutations下面的changeListMutation方法并且傳值過去
                })
                .catch((error) => {
                    console.log(error)
                })

        }
    }
})
// 觸發(fā)異步里面的方法是用 this.$store.dispatch('這里是方法名')
// 觸發(fā)同步里面的方法是用 this.$store.commit('這里是方法名')
父組件 select.vue
這個頁面只是引入兩個子組件贡避,沒有什么好說的
<template>
  <div class="select">
    <div class="wrap">
        <selectInput></selectInput>
        <list></list>
    </div>
  </div>
</template>
<script>
  // 引入子組件 
  import selectInput from '@/components/selectInput'  
  import list from '@/components/list'
  export default {
    components:{   //加載子組件
      selectInput,
      list
    },
  }
</script>
<style>
  .select{
    background:#4a56fe;
    width: 400px;
    margin: 100px auto 0;
    padding: 40px;
    border-radius: 10px;
  }
  .wrap{
    background: #e3e5fe;
    border-radius: 10px;
    padding: 40px;
  }
  ul{
    list-style: none;
  }
</style>
子組件 list.vue
該組件就是展示下拉選項,并且調(diào)用數(shù)據(jù)渲染
<template>
  <div class="list">
    <ul>
      <li v-for="(item,index) in list" :key="index" v-show="initShow" @click="changeTitle(item.title)">{{item.title}}</li>
    </ul>
  </div>
</template>

<script>
    import {mapState,mapMutations} from 'vuex'  // 將vuex中的state數(shù)據(jù)和mutations中的方法映射到組件中
    export default {
        //vue 生命周期(created)在實例創(chuàng)建之后予弧,在數(shù)據(jù)初始化之前被調(diào)用
        created(){  
            this.$store.dispatch('getListAction')  //調(diào)用vuex 中的 getListAction異步方法
        },
        //計算state數(shù)據(jù)
        computed:{
            ...mapState({
              list:'list',
              initShow:'isShow'
            })
        },
        methods:{
            changeTitle(title){
              this.$store.commit('changeTitleMutation',title)
              this.$store.commit('toggleShow',!this.initShow)
            }
        }
    }
</script>
// 觸發(fā)異步里面的方法是用 this.$store.dispatch('這里是方法名')
// 觸發(fā)同步里面的方法是用 this.$store.commit('這里是方法名')

<style>
  .list{
    padding: 10px 0;
    text-align: center;
  }
  li{
    line-height: 30px;
    height: 30px;
    border-radius: 15px;
    cursor: pointer;
    color:#535353;
  }
  li:hover{
    background: #ff705b;
    color: #fff;
  }
</style>
子組件 selectinput.vue
該組件展示選中的數(shù)據(jù)
<template>
  <div class="inputBox">
    <input type="text" readonly :value="getTitle" @click="toggleShow" placeholder="你喜歡什么">
  </div>
</template>

<script>
export default {
  computed:{
    // 獲取vuex中的state數(shù)據(jù)并賦值綁定到 value上面  computed 里面的方法名其實就是相當于 data里面的數(shù)據(jù),可以用this.getTitle 去訪問
    getTitle(){ 
      return this.$store.state.title
    },
    // 初始化控制下拉選項顯示隱藏的狀態(tài)掖蛤,如果isShow是false 則不限是下拉菜單,默認是false
    initShow(){
        return this.$store.state.isShow
    }
  },
  methods:{
    //點擊input的時候調(diào)用該方法蚓庭,這個方法去觸發(fā)mutations下面的toggleShow致讥,去改變isShow的狀態(tài),默認是isShow等于false, 然后在點擊的時候去改變isShow 等于true ,  !this.initShow就是true垢袱,如果是true的話墓拜,下拉選項才能出來,并將改變過后的值傳給toggleShow方法请契,去給vuex/store.js 里面的state.isShow賦值咳榜。
    toggleShow(){
      this.$store.commit('toggleShow',!this.initShow)
    }
  }
}
</script>

<style>
input{
  outline: none;
  width: 100%;
  height: 40px;
  line-height: 40px;
  border-radius: 10px;
  border: 1px solid #d3d3d3;
  text-indent: 20px;
  color: #535353;
}
</style>

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贿衍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子救恨,更是在濱河造成了極大的恐慌,老刑警劉巖肠槽,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件擎淤,死亡現(xiàn)場離奇詭異秸仙,居然都是意外死亡嘴拢,警方通過查閱死者的電腦和手機寂纪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捞蛋,“玉大人孝冒,你說我怎么就攤上這事拟杉。” “怎么了搬设?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵穴店,是天一觀的道長拿穴。 經(jīng)常有香客問我泣洞,道長默色,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮弟蚀,結(jié)果婚禮上蚤霞,老公的妹妹穿的比我還像新娘义钉。我一直安慰自己,他們只是感情好捶闸,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布夜畴。 她就那樣靜靜地躺著删壮,像睡著了一般贪绘。 火紅的嫁衣襯著肌膚如雪央碟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天亿虽,我揣著相機與錄音菱涤,去河邊找鬼洛勉。 笑死粘秆,一個胖子當著我的面吹牛收毫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播此再,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼昔搂,長吁一口氣:“原來是場噩夢啊……” “哼引润!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淳附,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蠢古,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體草讶,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡洽糟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了坤溃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡薪介,死狀恐怖祠饺,靈堂內(nèi)的尸體忽然破棺而出汁政,到底是詐尸還是另有隱情,我是刑警寧澤记劈,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布勺鸦,位于F島的核電站,受9級特大地震影響换途,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嘶窄,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柄冲。 院中可真熱鬧吻谋,春花似錦、人聲如沸漓拾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骇两。三九已至姜盈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間馏颂,已是汗流浹背示血。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留难审,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓亿絮,卻偏偏與公主長得像麸拄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子黔姜,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • ## 框架和庫的區(qū)別?> 框架(framework):一套完整的軟件設(shè)計架構(gòu)和**解決方案**。> > 庫(lib...
    Rui_bdad閱讀 2,890評論 1 4
  • vue概述 在官方文檔中地淀,有一句話對Vue的定位說的很明確:Vue.js 的核心是一個允許采用簡潔的模板語法來聲明...
    li4065閱讀 7,187評論 0 25
  • vuex 場景重現(xiàn):一個用戶在注冊頁面注冊了手機號碼失球,跳轉(zhuǎn)到登錄頁面也想拿到這個手機號碼帮毁,你可以通過vue的組件化...
    sunny519111閱讀 8,008評論 4 111
  • 理解vue 引用一段官方的原話: Vue.js(讀音 /vju?/,類似于 view) 是一套構(gòu)建用戶界面的漸進式...
    綽號陸拾柒閱讀 2,365評論 3 6
  • 有一句話叫做:好的愛情是你通過一個人看到整個世界烈疚,而壞的愛情是你為了一個人舍棄世界黔牵。 好久之前我以為只是一句“嗯,...
    東城LEO閱讀 401評論 0 1