mescroll-body在子組件中的使用

只要保證在最外層父頁面中引入了下面文件

import MescrollCompMixin from "mescroll-uni/mixins/mescroll-comp.js";

并在自己定義的組件上加上ref="mescrollItem",這名稱是固定的,不能改。

子組件名稱可隨意,但ref是要加上的

如果還有子子組件,則繼續(xù)在當(dāng)前子組件加ref="mescrollItem"

image.png

當(dāng)有多個子組件使用mescroll,父頁面中

<template>
    <view>
        <!-- 菜單 -->
        <view class="top-warp">
            <view class="tip">每個菜單列表僅初始化一次,切換菜單緩存數(shù)據(jù)</view>
            <!-- 當(dāng)設(shè)置tab-width,指定每個tab寬度時,則不使用flex布局,改用水平滑動 -->
            <me-tabs v-model="tabIndex" :tabs="tabs" @change="tabChange" :tab-width="130"></me-tabs>
        </view>
        
        <!-- 子組件 (i: 每個tab頁的專屬下標(biāo);  index: 當(dāng)前tab的下標(biāo)) -->
        
        <!-- 如果每個子組件布局不一樣, 可拆開寫 (注意ref只能為 "mescrollItem下標(biāo)" 的格式,
             另外 :i="下標(biāo)" :index="tabIndex"也是固定寫法,tabIndex不能寫成別的參數(shù)) : -->
        <!-- <home ref="mescrollItem0" :i="0" :index="tabIndex"></home>
        <shopcart ref="mescrollItem1" :i="1" :index="tabIndex"></shopcart>
        <user ref="mescrollItem2" :i="2" :index="tabIndex"></user> -->
        
        <mescroll-item ref="mescrollItem0" :i="0" :index="tabIndex" :tabs="tabs"></mescroll-item>
        <mescroll-item ref="mescrollItem1" :i="1" :index="tabIndex" :tabs="tabs"></mescroll-item>
        <mescroll-item ref="mescrollItem2" :i="2" :index="tabIndex" :tabs="tabs"></mescroll-item>
        <mescroll-item ref="mescrollItem3" :i="3" :index="tabIndex" :tabs="tabs"></mescroll-item>
        <mescroll-item ref="mescrollItem4" :i="4" :index="tabIndex" :tabs="tabs"></mescroll-item>
        <mescroll-item ref="mescrollItem5" :i="5" :index="tabIndex" :tabs="tabs"></mescroll-item>
        <mescroll-item ref="mescrollItem6" :i="6" :index="tabIndex" :tabs="tabs"></mescroll-item>
        <mescroll-item ref="mescrollItem7" :i="7" :index="tabIndex" :tabs="tabs"></mescroll-item>
        <mescroll-item ref="mescrollItem8" :i="8" :index="tabIndex" :tabs="tabs"></mescroll-item>
        
        
        <!-- 如果每個子組件布局一樣, 則可使用v-for (注意v-for的ref="mescrollItem"必須是固定值; 另外支付寶小程序不支持此v-for的寫法)-->
        <!-- <mescroll-item ref="mescrollItem" v-for="(tab,i) in tabs" :key="i" :i="i" :index="tabIndex" :tabs="tabs"></mescroll-item> -->
    </view>
</template>

<script>
    import MescrollItem from "./mescroll-more-item.vue";
    import MescrollMoreMixin from "@/components/mescroll-uni/mixins/mescroll-more.js";
    
    export default {
        mixins: [MescrollMoreMixin], // 多個mescroll-body寫在子組件時, 則使用mescroll-more.js補(bǔ)充子組件的頁面生命周期
        components: {
            MescrollItem
        },
        data() {
            return {
                tabs: [{name:'全部'}, {name:'奶粉'}, {name:'面膜'}, {name:'圖書'}, {name:'果汁'}, {name:'奶瓶'}, {name:'美素'}, {name:'花王'}, {name:'韓蜜'}],
                tabIndex: 0 // 當(dāng)前tab下標(biāo),必須與mescroll-more.js對應(yīng),所以tabIndex是固定變量,不可以改為其他的名字
            }
        },
        onShow() {
            // 返回刷新: https://www.mescroll.com/uni.html#note 第二點(diǎn)
            // if(this.canReset){
            //  let curMescroll = this.getMescroll(this.tabIndex)
            //  curMescroll && curMescroll.resetUpScroll()
            // }
            // this.canReset = true
        }
    }
</script>

子組件中

<template>
    <!-- 不能用v-if (i: 每個tab頁的專屬下標(biāo);  index: 當(dāng)前tab的下標(biāo); 申明在 MescrollMoreItemMixin )-->
    <view v-show="i === index">
        <!-- top="120"下拉布局往下偏移,防止被懸浮菜單遮住 -->
        <!-- ref動態(tài)生成: 字節(jié)跳動小程序編輯器不支持一個頁面存在相同的ref (如不考慮字節(jié)跳動小程序可固定值為 ref="mescrollRef") -->
        <mescroll-body :ref="'mescrollRef'+i" @init="mescrollInit" top="120" :down="downOption" @down="downCallback" :up="upOption" @up="upCallback" @emptyclick="emptyClick">
            <!-- 數(shù)據(jù)列表 -->
            <good-list :list="goods"></good-list>
        </mescroll-body>
    </view>
</template>

<script>
    import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
    import MescrollMoreItemMixin from "@/components/mescroll-uni/mixins/mescroll-more-item.js";
    import {apiSearch} from "@/api/mock.js"
    
    export default {
        mixins: [MescrollMixin,MescrollMoreItemMixin], // 注意此處還需使用MescrollMoreItemMixin (必須寫在MescrollMixin后面)
        props:{
            i: Number, // 每個tab頁的專屬下標(biāo) (除了支付寶小程序必須在這里定義, 其他平臺都可不用寫, 因?yàn)橐言贛escrollMoreItemMixin定義)
            index: { // 當(dāng)前tab的下標(biāo) (除了支付寶小程序必須在這里定義, 其他平臺都可不用寫, 因?yàn)橐言贛escrollMoreItemMixin定義)
                type: Number,
                default(){
                    return 0
                }
            },
            tabs: { // 為了請求數(shù)據(jù),演示用,可根據(jù)自己的項(xiàng)目判斷是否要傳
                type: Array,
                default(){
                    return []
                }
            }
        },
        data() {
            return {
                downOption:{
                    auto:false // 不自動加載 (mixin已處理第一個tab觸發(fā)downCallback)
                },
                upOption:{
                    auto:false, // 不自動加載
                    // page: {
                    //  num: 0, // 當(dāng)前頁碼,默認(rèn)0,回調(diào)之前會加1,即callback(page)會從1開始
                    //  size: 10 // 每頁數(shù)據(jù)的數(shù)量
                    // },
                    noMoreSize: 4, //如果列表已無數(shù)據(jù),可設(shè)置列表的總數(shù)量要大于半頁才顯示無更多數(shù)據(jù);避免列表數(shù)據(jù)過少(比如只有一條數(shù)據(jù)),顯示無更多數(shù)據(jù)會不好看; 默認(rèn)5
                    empty:{
                        tip: '~ 空空如也 ~', // 提示
                        btnText: '去看看'
                    }
                },
                goods: [] //列表數(shù)據(jù)
            }
        },
        methods: {
            /*上拉加載的回調(diào): 其中page.num:當(dāng)前頁 從1開始, page.size:每頁數(shù)據(jù)條數(shù),默認(rèn)10 */
            upCallback(page) {
                // this.i: 每個tab頁的專屬下標(biāo)
                // this.index: 當(dāng)前tab的下標(biāo)
                let word = this.tabs[this.i].name
                apiSearch(page.num, page.size, word).then(curPageData=>{
                    //聯(lián)網(wǎng)成功的回調(diào),隱藏下拉刷新和上拉加載的狀態(tài);
                    this.mescroll.endSuccess(curPageData.length);
                    //設(shè)置列表數(shù)據(jù)
                    if(page.num == 1) this.goods = []; //如果是第一頁需手動制空列表
                    this.goods=this.goods.concat(curPageData); //追加新數(shù)據(jù)
                }).catch(()=>{
                    //聯(lián)網(wǎng)失敗, 結(jié)束加載
                    this.mescroll.endErr();
                })
            },
            //點(diǎn)擊空布局按鈕的回調(diào)
            emptyClick(){
                uni.showToast({
                    title:'點(diǎn)擊了按鈕,具體邏輯自行實(shí)現(xiàn)'
                })
            }
        }
    }
</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 您將在本文當(dāng)中了解到,往網(wǎng)頁中添加數(shù)據(jù),從傳統(tǒng)的dom操作過渡到數(shù)據(jù)層操作,實(shí)現(xiàn)同一個目標(biāo),兩種不同的方式....
    itclanCoder閱讀 26,245評論 1 12
  • 探索Vue高階組件 高階組件(HOC)是 React 生態(tài)系統(tǒng)的常用詞匯,React 中代碼復(fù)用的主要方式就是使用...
    君惜丶閱讀 1,059評論 0 2
  • 探索Vue高階組件高階組件(HOC)是 React 生態(tài)系統(tǒng)的常用詞匯,React 中代碼復(fù)用的主要方式就是使用高...
    videring閱讀 10,707評論 5 30
  • 1. 組件化跟模塊化的區(qū)別 組件的出現(xiàn)就是為了拆分 vue 實(shí)例的龐大內(nèi)容的,我們可以以不同的組件來劃分不同的功能...
    Metallica_d8b1閱讀 498評論 0 0
  • 組件是視圖層的基本組成單元。 組件是一個單獨(dú)且可復(fù)用的功能模塊的封裝。 一個組件包括開始標(biāo)簽和結(jié)束標(biāo)簽,標(biāo)簽上可以...
    鄒鄒_ZZ閱讀 649評論 0 0

友情鏈接更多精彩內(nèi)容