vue的内容分发很是适合“固定部分+动态部分”的组件的场景,固定部分能够是结构固定,也能够是逻辑固定,好比下拉loading,下拉loading只是中间内容是动态的,而拉到底部都会触发拉取更多内容的操做,所以咱们能够把下拉loading作成一个有slot的插件。vue
“下拉加载更多”的场景在移动端相对来讲出现得比较多。咱们知道下拉触底都要监听触底事件,触底的操做也相同(去后台拉取数据),分页算法也相同,所以咱们会想到把它作成一个组件,重用这些相同的地方,让其余地方能够共用这个组件,从而减小代码量。
然而,下拉loading并非一个能够彻底重用的组件,由于列表里面的内容不一样,空白页(没有内容时)的内容也可能不一样,若是要作成组件,那么就要考虑到这方面的“不一样”,所以咱们想到利用vue的内容分发slot来作。下面是本人在开发的时候作的一个下拉loading,你们能够参考下。算法
组件代码:bash
<template>
<div>
<slot name="list" v-if="total > 0"></slot>
<slot name="empty" v-else></slot>
</div>
</template>
<script>
import Toast from 'lib/xl-toast'
import Tool from 'tool/tool'
export default {
data() {
return {
page: 1,
isLoading: false,
busy: false,
isFirstLoad: false
}
},
props: {
pageSize: {
default: 10 // 每页展现多少条数据
},
total: {
default: 0 // 总共多少条记录
}
},
computed: {
totalPage() {
return Math.ceil(this.total / this.pageSize)
}
},
created() {
this.getList()
},
mounted() {
this.addScrollListener()
},
methods: {
addScrollListener() {
// 添加监听滚动操做,用到函数防抖
this.scrollFn = Tool.throttle(this.onScroll, 30, 30)
document.addEventListener('scroll', this.scrollFn, false)
},
getList() {
// 正在拉取数据或者没有数据了,则取消滚动监听
if(this.isLoading || this.isFirstLoad && (this.page > this.totalPage)) {
document.removeEventListener('scroll', this.scrollFn, false)
return
}
this.busy = true
this.isLoading = true
// 通知父组件去拉取更多数据
this.$emit("getList", this.page, () => {
this.isFirstLoad = true
this.isLoading = false
this.page++
}, () => {
Toast.show('网络错误,请稍后重试')
this.total = 0
this.isLoading = false
})
},
reset() {
// 从新拉取数据
this.page = 1
this.total = 0
this.isLoading = false
this.isFirstLoad = false
this.addScrollListener()
this.getList()
},
onScroll() {
// 到底拉取更多数据
if(Tool.touchBottom()) {
this.getList()
}
}
}
}
</script>
复制代码
总之,遇到一些有想对比较固定的部分,包括js操做或者结构固定,又有一些动态的部分,咱们应该就应该考虑到使用:组件+slot。网络
我在作需求的时候,作了一个组件,该组件分为上下两个部分,这两个部分耦合度很高(否则我怎么把它当成一个组件呢哈哈哈),以下图所示: 函数
<A></A>
<B></B>
<C></C>
复制代码
改成slot之后是这样的ui
<C>
<A slot="c1"></A>
<B slot="c2"></B>
</C>
复制代码
这样就能作到不把C模块拆分,又能调整位置了,以最小的代价完成需求~~。this
vue的slot不只能够用来内容分发,还能够用来作位置调整。若是在须要拆分组件来作位置调整,又不想由于拆分耦合度很高的组件,能够考虑使用slot来进行位置调整。一点愚见,但愿对你们有所帮助。spa