1.应该在何时创建BScroll对象
1)
created : 中请求数据,ajax是异步的,这个时候可能mounted已经执行完了,也就是dom挂载完了,但数据还没请求回来,无法获取到内部元素(数据渲染出来的dom)高度. 无法渲染内部元素,无法滚动
2)
updated:数据发生改变时执行;数据改变,dom也要重新渲染,并执行updated,但无法保证是先dom渲染还是先updated,

//解决:
this.$nextTick(()={
    //操作
    this.scroll = new BScroll(this.$refs.className,{})
})

3)最佳方式:

mounted() {
    this.scroll = new BScroll(this.$refs.scrollWrapper,{})
}
watch: {
    shuju() {
        this.$nextTick(() => {
            this.scroll.refresh();
        })
    }
}

2.拆分better-scroll组件----//scroller.vue

<template>
    <div ref="wrapper">
        <div>
        //vue 感知不到slot变化,但能感知数据变化
            <slot></slot>
        </div>
    </div>
</template>
<script>
    import BScroll from 'better-scroll'
    export default {
        props: ['shuju'],
        mounted() {
            this.scroll = new BScroll(this.$refs.wrapper,{})
        },
        watch: {  //保障数据加载dom渲染,刷新
            shuju() {
                this.$nextTick(() => {
                    this.scroll.refresh();
                })
            }
        }
    }
</script>
<style>

</style>

西葫芦
21 声望0 粉丝

积跬步至千里