1.0.3 • Published 2 years ago

@husandao/scroll-view v1.0.3

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

滚动视图组件

介绍

基于better-scroll.js库封装的vue2.x滚动视图组件,用于展示上下滚动的页面,解决了ios手机页面快速滚动卡死的问题,同时扩展了下拉刷新和上拉加载的功能,预设了刷新和加载过程每个阶段的插槽,做到极高的定制化

快速开始

引入

npm i @husandao/scroll-view -S

使用

// 项目主入口main.js
import ScrollView from "@husandao/scroll-view";
import "@husandao/scroll-view/dist/style.css"
Vue.use(ScrollView)

注意事项

better-scroll文档解释了滚动原理:在滚动方向上,第一个子元素的长度超过了容器的长度时就可以滚动,当使用发现滚动不了时,请检查子元素的长度是否超过了容器的长度

scroll-view组件内容元素在滚动方向上的长度必须大于容器元素,scroll-view的宽高设置为100%,所以父级元素要给定宽高

代码演示

基础用法

<div class="test">
    <!-- 滚动区域 -->
    <scroll-view>
        <div class="cell" v-for="i in list" :key="i">{{ i }}</div>
    </scroll-view>
</div>
export default {
    data() {
        return {
            list: [],
            loading: false,
            finished: false,
            refreshing: false,
        };
    },
    methods: {
        onLoad() {
            // 异步更新数据
            // setTimeout 仅做示例,真实场景中一般为 ajax 请求
            // 异步更新数据
            // setTimeout 仅做示例,真实场景中一般为 ajax 请求
            setTimeout(() => {
                for (let i = 0; i < 30; i++) {
                    this.list.push(this.list.length + 1);
                }
            }, 1000);
        }
    },
    created() {
        this.onLoad();
    },
};
.test {
    width: 100vw;
    height: 100vh;
    background: #fff;
}
.cell {
    height: 108px;
    font-size: 18px;
    border-bottom: 1px solid #ccc;
    line-height: 108px;
    text-align: center;
}

上拉加载

scroll-view组件通过loading和finished两个变量控制加载状态。当组件滚动到底部时,scroll-view组件会给父组件抛出load事件同时将父组件的loading设置为true,父组件监听load事件发起异步操作更新数据,数据更新完毕后,将loading设置为false即可。如果数据已经全部加载完了,就将finishe设置为true即可。

<div class="test">
    <!-- 滚动区域 -->
    <scroll-view
        :openLoad="true"
        :loading.sync="loading"
        :finished="finished"
        @load="onLoad"
    >
        <div class="cell" v-for="i in list" :key="i">{{ i }}</div>
    </scroll-view>
</div>
export default {
    data() {
        return {
            list: [],
            loading: false,
            finished: false
        };
    },
    methods: {
        onLoad() {
            // 异步更新数据
            // setTimeout 仅做示例,真实场景中一般为 ajax 请求
            setTimeout(() => {
                for (let i = 0; i < 10; i++) {
                    this.list.push(this.list.length + 1);
                }

                // 加载状态结束
                this.loading = false;

                // 数据全部加载完成
                if (this.list.length >= 30) {
                    this.finished = true;
                }
            }, 1000);
        },

    },
};
.test {
    width: 100vw;
    height: 100vh;
    background: #fff;
}
.cell {
    height: 108px;
    font-size: 18px;
    border-bottom: 1px solid #ccc;
    line-height: 108px;
    text-align: center;
}

下拉刷新

scroll-view组件通过refreshing变量控制刷新状态。当组件滚动到顶部时继续下拉一段距离,scroll-view组件会给父组件抛出refresh事件同时将父组件的refreshing设置为true,父组件监听refresh事件进行操作,操作完毕后,将refreshing设置为false即可,表示刷新成功。

<div class="test">
    <!-- 滚动区域 -->
    <scroll-view
        :openRefresh="true"
        :refreshing.sync="refreshing"
        @refresh="onRefresh"
    >
        <div class="cell" v-for="i in list" :key="i">{{ i }}</div>
    </scroll-view>
</div>
export default {
    data() {
        return {
            list: [],
            refreshing: false,
        };
    },
    methods: {
        onLoad() {
            // 异步更新数据
            // setTimeout 仅做示例,真实场景中一般为 ajax 请求
            setTimeout(() => {
                if (this.refreshing) {
                    this.list = [];
                    this.refreshing = false;
                }
                for (let i = 0; i < 20; i++) {
                    this.list.push(this.list.length + 1);
                }
            }, 1000);
        },
        onRefresh() {
            this.onLoad();
        },
    },
    created() {
        this.onLoad();
    },
};
.test {
    position: relative;
    width: 100%;
    height: 100%;
    background: #fff;
}
.cell {
    height: 108px;
    font-size: 18px;
    border-bottom: 1px solid #ccc;
    line-height: 108px;
    text-align: center;
}

上拉加载+下拉刷新

完整的组件功能

<div class="test">
    <!-- 滚动区域 -->
    <scroll-view
        :openLoad="true"
        :loading.sync="loading"
        :finished="finished"
        :openRefresh="true"
        :refreshing.sync="refreshing"
        @load="onLoad"
        @refresh="onRefresh"
    >
        <div class="cell" v-for="i in list" :key="i">{{ i }}</div>
    </scroll-view>
</div>
export default {
    data() {
        return {
            list: [],
            loading: false,
            finished: false,
            refreshing: false,
        };
    },
    methods: {
        onLoad() {
            // 异步更新数据
            // setTimeout 仅做示例,真实场景中一般为 ajax 请求
            setTimeout(() => {
                if (this.refreshing) {
                    this.list = [];
                    this.refreshing = false;
                }
                for (let i = 0; i < 10; i++) {
                    this.list.push(this.list.length + 1);
                }

                // 加载状态结束
                this.loading = false;

                // 数据全部加载完成
                if (this.list.length >= 30) {
                    this.finished = true;
                }
            }, 1000);
        },
        onRefresh() {
            // 重置加载完毕的状态
            this.finished = false;

            // 重新加载数据
            // 将 loading 设置为 true,表示处于加载状态
            this.loading = true;
            this.onLoad();
        },
    },
};
.test {
    position: relative;
    width: 100%;
    height: 100%;
    background: #fff;
}
.cell {
    height: 108px;
    font-size: 18px;
    border-bottom: 1px solid #ccc;
    line-height: 108px;
    text-align: center;
}

自定义提示

srcoll-view组件提供了color和size两个props,使用者可以简单的定制提示内容的颜色和font-size,srcoll-view组件使用vw作为单位(以iphone6 750px为基准,使用者也应传入此基准设计稿的值),传入数字(20)或者字符串(20px),内部会自动转成vw单位,传入的是rem或em则不转换

<div class="test">
    <!-- 滚动区域 -->
    <scroll-view
        :openLoad="true"
        :loading.sync="loading"
        :finished="finished"
        :openRefresh="true"
        :refreshing.sync="refreshing"
        color="skyblue"
        size="40px"
        @load="onLoad"
        @refresh="onRefresh"
    >
        <div class="cell" v-for="i in list" :key="i">{{ i }}</div>
    </scroll-view>
</div>
export default {
    data() {
        return {
            list: [],
            loading: false,
            finished: false,
            refreshing: false,
        };
    },
    methods: {
        onLoad() {
            // 异步更新数据
            // setTimeout 仅做示例,真实场景中一般为 ajax 请求
            setTimeout(() => {
                if (this.refreshing) {
                    this.list = [];
                    this.refreshing = false;
                }
                for (let i = 0; i < 10; i++) {
                    this.list.push(this.list.length + 1);
                }

                // 加载状态结束
                this.loading = false;

                // 数据全部加载完成
                if (this.list.length >= 30) {
                    this.finished = true;
                }
            }, 1000);
        },
        onRefresh() {
            // 清空列表数据
            this.finished = false;

            // 重新加载数据
            // 将 loading 设置为 true,表示处于加载状态
            this.loading = true;
            this.onLoad();
        },
    },
};
.test {
    position: relative;
    width: 100%;
    height: 100%;
    background: #fff;
}
.cell {
    height: 108px;
    font-size: 18px;
    border-bottom: 1px solid #ccc;
    line-height: 108px;
    text-align: center;
}

srcoll-view组件预设了下拉刷新和上拉加载各阶段的插槽,使用者可以通过插槽自定义提示内容,具有极高的自由度

<div class="test">
    <!-- 滚动区域 -->
    <scroll-view
        :openLoad="true"
        :loading.sync="loading"
        :finished="finished"
        :openRefresh="true"
        :refreshing.sync="refreshing"
        @load="onLoad"
        @refresh="onRefresh"
    >
        <div slot="pulling" class="slot-tips">下拉刷新slot</div>
        <div slot="loosing" class="slot-tips">释放刷新slot</div>
        <div slot="refreshing" class="slot-tips">刷新中slot</div>
        <div slot="success" class="slot-tips">刷新成功slot</div>
        <div class="cell" v-for="i in list" :key="i">{{ i }}</div>
        <div slot="loading" class="slot-tips">加载中slot</div>
        <div slot="finished" class="slot-tips">加载完毕slot</div>
        <div slot="loadingBefore" class="slot-tips">上拉加载slot</div>
    </scroll-view>
</div>
export default {
    data() {
        return {
            list: [],
            loading: false,
            finished: false,
            refreshing: false,
        };
    },
    methods: {
        onLoad() {
            // 异步更新数据
            // setTimeout 仅做示例,真实场景中一般为 ajax 请求
            setTimeout(() => {
                if (this.refreshing) {
                    this.list = [];
                    this.refreshing = false;
                }
                for (let i = 0; i < 10; i++) {
                    this.list.push(this.list.length + 1);
                }

                // 加载状态结束
                this.loading = false;

                // 数据全部加载完成
                if (this.list.length >= 30) {
                    this.finished = true;
                }
            }, 1000);
        },
        onRefresh() {
            // 清空列表数据
            this.finished = false;

            // 重新加载数据
            // 将 loading 设置为 true,表示处于加载状态
            this.loading = true;
            this.onLoad();
        },
    },
};
.test {
    position: relative;
    width: 100%;
    height: 100%;
    background: #fff;
}
.cell {
    height: 108px;
    font-size: 18px;
    border-bottom: 1px solid #ccc;
    line-height: 108px;
    text-align: center;
}
.slot-tips {
    padding: 50px 0;
    text-align: center;
    color: red;
    font-size: 32px;
}

API

props

参数说明类型默认值
openLoad是否开启上拉加载Booleanfalse
loading是否处于加载状态(.sync)Booleanfalse
finished是否已加载完成Booleanfalse
loadingBeforeText加载前的提示提示文案String上拉加载更多
loadingText加载过程中的提示文案String加载中
finishedText加载完成后的提示文案String没有更多了
openRefresh是否开启下拉刷新Boolean或Objectfalse
refreshing是否处于刷新状态Booleanfalse
pullingText下拉过程的提示文案String下拉刷新
loosingText释放过程的提示文案String手指释放刷新
refreshingText刷新过程的提示文案String刷新中...
successText刷新成功的提示文案String刷新成功
successDuration刷新成功提示展示时长(ms)Number0
color提示文案的颜色String#000
size提示文案的字体大小Number或String28

event

事件名说明回调参数
readybetter-scroll初始化完成时触发当前better-scroll对象
scroll页面滚动时触发{x: 当前x轴滚动距离, y: 当前y轴滚动距离}
load上拉加载时触发-
refresh下拉刷新时触发-

slots

名称说明参数
pulling下拉过程提示内容-
loosing释放过程顶部内容-
refreshing刷新过程提示内容-
success刷新成功提示内容-
loadingBefore上拉过程提示内容-
loading加载过程提示内容-
finished加载完成提示内容-