鍍金池/ 問答/HTML/ vue 項(xiàng)目中 “父組件” 異步獲取數(shù)據(jù)之后,傳遞給子組件不顯示

vue 項(xiàng)目中 “父組件” 異步獲取數(shù)據(jù)之后,傳遞給子組件不顯示

clipboard.png
有兩個(gè)組件:一個(gè)為 transaction(父組件),一個(gè)為 transactionList (子組件);
上圖為一個(gè)列表頁,為父組件,在父組件里面的data中定義了數(shù)據(jù)列表,
template中:

<transactionList :list="transactionList"></transactionList>

js中:

data () {
    return {
      transactionList: [...]
    }
}

子組件通過 props 接受一個(gè) list 顯示出來沒有問題。
但是,問題是,現(xiàn)在這些數(shù)據(jù)我通過 axios 取得:

methods: {
    getTransData () {
      axios.get(httpUrl.getTransData)
      .then(res => {
        console.log(res.data.transData)
        this.transactionList = res.data.transData
      })
      .catch(err => console.log(err))
   }
},
created () {
   this.getTransData()
}

created 的時(shí)候把數(shù)據(jù)獲取到,然后賦值給 data 中的 transactionList ,
因?yàn)槭褂昧?axios 獲取數(shù)據(jù),所以 data 中的 transactionList 為空數(shù)組:
transactionList: [ ]
但是這樣寫完之后,頁面什么也不顯示了,控制臺(tái)輸出之后發(fā)現(xiàn)數(shù)據(jù)也獲取到了, 賦值給 this.transactionList 也成功了,但是貌似是沒有傳到子組件中,這是為什么?


子組件:

<template>
  <div>
    <div class="ui segment"
      v-for="item in items"
      :class="[item.status ? 'green' : 'red']">
      <div class="ui list m-aa">
        <div class="item" :class="[item.status ? 'text-green' : 'text-red']">
          <h3 v-if="item.status">交易金額:{{ item.tstMoney }} 元</h3>
          <h3 v-else>取消消費(fèi):{{ item.tstMoney }} 元</h3>
        </div>
        <div class="item m-gray">
          {{ item.tstTime }}
        </div>
      </div>
      <div class="ui list">
        <div class="item">
          消費(fèi)門店:{{ item.tstAddress }}
        </div>
      </div>
      <div class="ui bulleted list m-gray">
        <div class="item">
          預(yù)存支付:{{ item.tstJifen }}
        </div>
        <div class="item">
          積分支付:{{ item.tstYucun }}
        </div>
        <div class="item">
          其他支付:{{ item.tstElse }}
        </div>
      </div>

    </div>
  </div>
</template>

<script>
export default {
  props: {
    list: {
      type: Array,
      default: []
    }
  },
  data () {
    return {
      items: this.list
    }
  }
}
</script>

父組件:

<template>
  <div class="m-bg" style="padding-left: 10px; padding-right: 10px;">
    <transactionList :list="transactionList"></transactionList>
  </div>
</template>

<script>
import transactionList from '../components/transactionList'
import axios from 'axios'
import { httpUrl } from '../../http_url.js'
export default {
  components: {
    transactionList
  },
  data () {
    return {
      transactionList: []
    }
  },
  methods: {
    getTransData () {
      axios.get(httpUrl.getTransData)
      .then(res => {
        // console.log(res.data.transData)
        console.log(this.transactionList)
        this.transactionList = res.data.transData
        console.log(this.transactionList)
        // console.log(this.transactionList)
      })
      .catch(err => console.log(err))
    }
  },
  created () {
    this.getTransData()
  }
}
</script>

回答
編輯回答
亮瞎她

console.log(this.transactionList) 有值嗎
試試不使用驗(yàn)證

props:['list']

列表渲染用list

2017年8月26日 14:45
編輯回答
枕邊人

errrredf

2017年12月26日 03:27
編輯回答
枕頭人

你子組件這么寫就相當(dāng)于:
list = []
item = list
list = [2333]
item 還是指向原來的空數(shù)組,并沒有更新

2018年5月4日 13:44
編輯回答
離觴

可以試一下用watch:{ }偵聽,然后每獲取一次就執(zhí)行init()之類的函數(shù)

2017年9月20日 17:56
編輯回答
詆毀你

因?yàn)檫M(jìn)來的時(shí)候,你的list默認(rèn)為空數(shù)組,子組件渲染的時(shí)候,props的值還沒有傳輸進(jìn)來,所以item等于空數(shù)組,給你兩個(gè)方法。
1.直接渲染list,不要渲染item
2.建立一個(gè)watch,監(jiān)聽list變化,再賦值給item

2018年3月29日 02:15
編輯回答
焚音

子組件直接 渲染 list 就好了
你這 渲染的是items 不是你傳進(jìn)去的值

v-for="item in list "

data 可以不要了

2017年2月23日 19:45
編輯回答
夕顏

這種問題猜測(cè)應(yīng)該是子組件里面使用數(shù)據(jù)是問題;

你可以在計(jì)算屬性中return prop中接收的數(shù)據(jù),然后渲染這個(gè)計(jì)算屬性即可。

=----------------------------
看到子組件代碼了。。
問題就是在data中返回了一個(gè)item。給item賦值的時(shí)候list是空數(shù)組,等list有值的賦值已經(jīng)結(jié)束了。自然不會(huì)更新了。連個(gè)方案:

1、如上所說用計(jì)算屬性
2、如果不會(huì)修改list,直接操作list即可

2018年4月23日 15:38