ydcss / vue-ydui

A mobile components Library with Vue2.js. 一只基于Vue2.x的移动端组件库。
http://vue.ydui.org
MIT License
2.75k stars 560 forks source link

ydui-滚动加载时,$refs没有yd-infinitescroll的ref #804

Open ljw950213 opened 3 years ago

ljw950213 commented 3 years ago

问题描述

使用ydui的滚动加载组件时,一直无法正常滚动加载,排查后发现this.$refs中没有yd-infinitescroll的ref,未发现具体原因

产生环境

提示错误信息

  1. 在浏览器中测试,没有报错,表现形式为滚动到底部后,没有重新加载数据,也没有调用callback

代码区域

<template>
        <yd-cell-item style="height: 50px;background-color: #ffffff;" href="/customer/addDonation" type="link">
            <span slot="right" style="color: #0055ff;">Add Donation</span>
        </yd-cell-item>
        <yd-cell-group v-for="(group,i) in donationGrouplist" :key="i" style="margin-top: 1px;">
            <yd-cell-item style="height: 50px;">
                <span slot="left" style="color:#0055ff;font-weight: bold;">
                    <img src="static/img/group.png" style="width:25px;height:25px;vertical-align:middle;" />
                    <span style="vertical-align: middle;padding-left:5px;">{{group.groupName}}</span>
                </span>
                <span slot="right" style="margin-right:30px;vertical-align: middle;padding-left:5px;">zip:{{group.zipCode}}</span>
                <span slot="right">
                    <img src="/static/img/group-member.png" style="width:25px;height:25px;vertical-align:middle;" @click="saveOrUpdateGroupMember(1, group.groupId)" />
                </span>
            </yd-cell-item>
            <yd-infinitescroll :callback="loadDonationGroup" distance="100" id="infinitescroll" ref="infinitescroll">
                <yd-list theme="1" slot="list">
                    <yd-cell-item v-for="(donor, j) in group.donorList" :key="j">
                        <span slot="left" style="width: 100%;">
                            <img src="static/img/stu.png" style="width:20px;height:20px;vertical-align:middle;" />
                            <span style="margin-left: 10px;">{{donor.name}}</span>
                        </span>
                        <span slot="right" style="margin-right:30px;">
                            <span>{{donor.grade}}</span>
                        </span>
                        <span slot="right" style="margin-right:30px;">
                            <yd-icon name="feedback" color="#00d300" size="20px" @click.native="saveOrUpdateGroupMember(2, group.groupId, donor.id)"></yd-icon>
                        </span>
                    </yd-cell-item>
                </yd-list>
                <!-- 数据全部加载完毕显示 -->
                <span slot="doneTip">complete</span>
                <!-- 加载中提示,不指定,将显示默认加载中图标 -->
                <span slot="loadingTip">loading</span>
            </yd-infinitescroll>
        </yd-cell-group>
        <div style="margin-top:15px;text-align:center;color: #657180;" v-show="!loadMore">
            No more data!
        </div>
        <yd-popup v-model="addDonorPopup" position="center" width="90%">
            <yd-preview :buttons="addDonorBtns">
                <yd-preview-header>
                    <div slot="left" style="text-align:center;">Add Donors</div>
                </yd-preview-header>
                <yd-cell-item>
                    <span slot="left">Name</span>
                    <input slot="right" type="text" style="text-align:right;" placeholder="Enter Name" v-model="donorName" maxlength="50"
                     onkeyup="value=value.replace(/[^\a-\z\A-\Z\0-\9\ \(\)\.]/g,'')">
                </yd-cell-item>
                <yd-cell-item>
                    <span slot="left">Grade</span>
                    <input slot="right" type="text" style="text-align:right;" placeholder="Enter Grade" v-model="donorGrade" maxlength="50"
                     onkeyup="value=value.replace(/[^\a-\z\A-\Z\0-\9\ \(\)\.]/g,'')">
                </yd-cell-item>
            </yd-preview>
        </yd-popup>

        <yd-popup v-model="editDonorPopup" position="center" width="90%">
            <yd-preview :buttons="editDonorBtns">
                <yd-preview-header>
                    <div slot="left" style="text-align:center;">Edit Donors</div>
                </yd-preview-header>
                <yd-cell-item>
                    <span slot="left">Name</span>
                    <input slot="right" type="text" style="text-align:right;" placeholder="Enter Name" v-model="donorName" maxlength="50"
                     onkeyup="value=value.replace(/[^\a-\z\A-\Z\0-\9\ \(\)\.]/g,'')">
                </yd-cell-item>
                <yd-cell-item>
                    <span slot="left">Grade</span>
                    <input slot="right" type="text" style="text-align:right;" placeholder="Enter Grade" v-model="donorGrade" maxlength="50"
                     onkeyup="value=value.replace(/[^\a-\z\A-\Z\0-\9\ \(\)\.]/g,'')">
                </yd-cell-item>
            </yd-preview>
        </yd-popup>
</template>

<script>
    import msg from '../../../static/js/msg-utils.js'
    import cfg from '../../../static/js/sys-config.js'
    import axios from '../../../static/js/axios-utils.js'
    export default {
        components: {
            layoutEx,
        },
        data() {
            let me = this;
            return {
                winHei: screen.availHeight, //屏幕高度
                page: 1,
                pageSize: 10,
                loadMore: true,
                donationGrouplist: [],
                tabStyle: '',
                addDonorPopup: false,
                editDonorPopup: false,
                curGroupId: '',
                curDonorId: '',
                donorName: '',
                donorGrade: '',
                addDonorBtns: [{
                        text: 'Cancel',
                        click: () => {
                            me.hidePopup();
                        }
                    },
                    {
                        text: 'Add',
                        click: () => {
                            if (!me.donorName) {
                                msg.error("Donor's name must not be null!");
                                return;
                            }
                            if (!me.donorGrade) {
                                msg.error("Donor's grade must not be null!");
                                return;
                            }
                            let url = ‘#’;
                            let params = {
                                token: me.$store.state.cst.token,
                                groupId: me.curGroupId,
                                name: me.donorName,
                                grade: me.donorGrade
                            };
                            msg.loading();
                            axios.post(url, params, function(data) {
                                msg.unloading();
                                msg.success("Success!");
                                me.page = 1;
                                me.loadMore = true;
                                me.loadDonationGroup();
                                me.hidePopup();
                            }, function(data) {
                                msg.unloading();
                                msg.error("Add failed!" + data + " Please retry later!");
                                me.hidePopup();
                            });
                        }
                    }
                ],
                editDonorBtns: [{
                        text: 'Cancel',
                        click: () => {
                            me.hidePopup();
                        }
                    },
                    {
                        text: 'Del',
                        click: () => {
                            if (!me.curMemberId || !me.curGroupId) {
                                msg.error("System Failure! Please retry later!")
                                return;
                            }
                            msg.confirm("Do you want to delete this donor?", () => {
                                let url = ‘#’;
                                let params = {
                                    token: me.$store.state.cst.token,
                                    memberId: me.curMemberId,
                                    groupId: me.curGroupId,
                                };
                                msg.loading();
                                axios.post(url, params, function(data) {
                                    msg.unloading();
                                    msg.success("Success!");
                                    me.page = 1;
                                    me.loadMore = true;
                                    me.loadDonationGroup();
                                    me.hidePopup();
                                }, function(data) {
                                    msg.unloading();
                                    msg.error("Delete failed!" + data + " Please retry later!");
                                    me.hidePopup();
                                });
                            });
                        }
                    }, {
                        text: 'Save',
                        click: () => {
                            if (!me.donorName) {
                                msg.error("Donor's name must not be null!");
                                return;
                            }
                            if (!me.donorGrade) {
                                msg.error("Donor's grade must not be null!");
                                return;
                            }
                            let url = ‘#’;
                            let params = {
                                token: me.$store.state.cst.token,
                                memberId: me.curMemberId,
                                groupId: me.curGroupId,
                                name: me.donorName,
                                grade: me.donorGrade
                            };
                            msg.loading();
                            axios.post(url, params, function(data) {
                                msg.unloading();
                                msg.success("Success!");
                                me.page = 1;
                                me.loadMore = true;
                                me.loadDonationGroup();
                                me.hidePopup();
                            }, function(data) {
                                msg.unloading();
                                msg.error("Save failed!" + data + " Please retry later!");
                                me.hidePopup();
                            });
                        }
                    }
                ],
            }
        },
        mounted() {
            let me = this;

            let clientHeight = document.body.clientHeight; //屏幕高度
            let tabHeight = clientHeight - 55 * 2 - 40; //减掉header和bottom
            let tabStyle = `overflow:auto; height:${tabHeight}px;`;
            me.tabStyle = tabStyle;

            me.loadDonationGroup();
        },
        destroyed() {
            let me = this;
        },
        methods: {
            loadDonationHistory() {
                let me = this;

                let url = ‘#’;
                let params = {
                    token: me.$store.state.cst.token
                };

                axios.get(url, params, function(data) {
                    me.donationHistlist = data;
                });
            },

            loadDonationGroup() {
                let me = this;

                let start = 0;
                if (me.page > 1) {
                    start = (me.page - 1) * me.pageSize;
                }
                let limit = me.pageSize;

                let url = ‘#’';
                let params = {
                    token: me.$store.state.cst.token,
                    start: start,
                    limit: limit
                }
                axios.get(url, params, function(data) {
                    console.log(data)
                    console.log(me.page)
                    if (me.page == 1) {
                        me.donationGrouplist = data;
                    } else {
                        for (let i in data) {
                            me.donationGrouplist.push(data[i]);
                        }
                    }
                    if (data.length < me.pageSize) {
                        console.log("p")
                        me.loadMore = false;
                        me.$refs.infinitescroll.$emit("ydui.infinitescroll.loadedDone");
                        return;
                    } else {
                        console.log(me.$refs) // 这里打印{}
                        console.log(me.$el.querySelector('#infinitescroll')) //这里打印null
                        me.$refs.infinitescroll.$emit("ydui.infinitescroll.finishLoad");
                    }
                    me.page++;
                    me.$refs.infinitescroll.$emit("ydui.infinitescroll.reInit");
                }, function(data) {
                });
            },

            // curPopup为1时,显示添加Donor弹窗
            // curPopup为2时,显示编辑Donor弹窗
            saveOrUpdateGroupMember(curPopup, curGroupId, curMemberId) {
                let me = this;
                if (curPopup == 1) {
                    me.curGroupId = curGroupId;
                    me.curMemberId = '';
                    me.addDonorPopup = true;
                }

                if (curPopup == 2) {
                    me.curGroupId = curGroupId;
                    me.curMemberId = curMemberId;
                    let url = '####';
                    let params = {
                        memberId: me.curMemberId
                    };

                    axios.get(url, params, function(data) {
                        me.donorName = data.name;
                        me.donorGrade = data.grade;
                        me.editDonorPopup = true;
                    });
                }
            },

            hidePopup() {
                let me = this;
                me.addDonorPopup = false;
                me.editDonorPopup = false;
                me.curGroupId = '';
                me.curMemberId = '';
                me.donorName = '';
                me.donorGrade = '';
            }
        }
    }
</script>

<style scoped>
    .donorDiv {
        width: 100%;
        display: flex;
        align-items: center;
        justify-content: center;
    }
</style>