# 1-3.Vue外送平台App-異步顯示數據(食品分類輪播列表) ### 分析: ![](https://i.imgur.com/Xoxnp5F.png) * 灰線:一維數組,最大值8 * 紅線:二維數組 (但剛開始只有一維數組,現在要如何創建二維數組呢?) 1.剛開始獲得的在computed ```html 1.剛開始獲得的在computed:{ //categorys:這是一維數組(目前是空數組) ...mapState(["address"]), } ``` 2. 創建二維數組 ```htmlmixed= computed: { //devTool確認有沒有得到資料 //categorys:這是一維數組(目前是空數組) ...mapState(["categorys"]), //categorys 封裝到新創建的二維數組 categorysArr() { //先取一維數組的categorys const { categorys } = this; //創建一個空的二維數組 const arr = []; //準備一個小數組(最大長度為8) let maxArr = []; //把小的推進空的 categorys.forEach((c) => { // 當小數組已經滿了,在創建一個新的空的 if (maxArr.length === 8) { maxArr = []; } //如果小數組為0,那麼將小數組推進空數組裡面 if (maxArr.length === 0) { arr.push(maxArr); } //當前分類放進小數組裡面 maxArr.push(c); }); return arr; }, }, ``` ### 輪播列表訊息 >Miste.vue:當前要顯示的templete ![](https://i.imgur.com/9Ba7EYq.png) ```htmlmixed= <nav class="msite_nav"> <div class="swiper-container"> <div class="swiper-wrapper"> <div class="swiper-slide" v-for="(caetgorys, index) in categorysArr" :key="index"> <a href="javascript:" class="link_to_food" v-for="(category ,index) in caetgorys" :key="index"> <div class="food_container"> <img :src="BaseImgUrl + category.image_url" /> </div> <span>{{ category.title }}</span> </a> </div> </div> <!-- Add Pagination --> <div class="swiper-pagination"></div> </div> </nav> ``` ### 根據一維數組變化成二維數組 分析圖 ### 解決輪播bug 完成綁定方法後,遇到輪播無法輪播bug Msite原先代碼 ![](https://i.imgur.com/pmahs9c.png) >這功能代碼因該在顯示資料以後才做動作 >開始先顯示categorys資料 ![](https://i.imgur.com/oeyBO9G.png) 如何解決呢? * 使用監視(watch)方法監視categorys列表 方法一:可以實現效果,但不是太好的。因為方法是你自己設定的時間,假設你設定1秒,但原先只需要0.5秒 ![](https://i.imgur.com/srlOmSB.png) 方法二: 1. 哪個回調函數能知道數據已經變了,可以馬上變化? [Vue Component中有一個$nextTick 方法可以實現](https://vuejs.org/v2/api/#Vue-nextTick) 必須在computed(因先獲取categorys數據)後加入監聽效果 ```htmlmixed= computed: { //devTool確認有沒有得到資料 //categorys:這是一維數組(目前是空數組) ...mapState(["address", "categorys"]), //categorys 封裝到新創建的二維數組 categorysArr() { //先取一維數組的categorys const { categorys } = this; //創建一個空的二維數組 const arr = []; //準備一個小數組(最大長度為8) let maxArr = []; //把小的推進空的 categorys.forEach((c) => { // 當小數組已經滿了,在創建一個新的空的 if (maxArr.length === 8) { maxArr = []; } //如果小數組為0,那麼將小數組推進空數組裡面 if (maxArr.length === 0) { arr.push(maxArr); } //當前分類放進小數組裡面 maxArr.push(c); }); return arr; }, }, watch: { //介面更新後立即創建Swiper對象 categorys(value) { this.$nextTick(() => { //一旦介面完成後立即更新(此語句必須寫在數據更新之後) //創建一個Swiper對象 new Swiper('.swiper-container', { loop: true, pagination: { el: '.swiper-pagination', }, }) }) }, }, ```