关于 Vue 混入 (Mixin)

Vue Mixinis

Vue中可以可以实现 组件混入的写法, 类似Python 的多继承关系

  1. 在 scroll.js中对 better-scroll 进行二次封装

    import BScroll from 'better-scroll'
    export default {
     data(){
         return{
             down:false,//下拉时顶部是否显示加载中
             up:false,//上拉时底部是否显示加载中
             upend:false,//数据加载完成底部提示
             bol:false,//最后一次加载
             scrollStyle :'',
             sateY:0,
             lastList:0,//最后一页是几条
             totalBalance:0,//合计,后端只返回每页的合计,需累加
         }
     },
     created(){
         setTimeout(()=>{
                //提前加载滚动插件
             this._initSlider()
         },20)
     },
     watch:{
            // 监听渲染的数据列表发生变化之时
         dataList(){//监听数据变化,重新初始化滚动函数
             seTimeout(()=>{//提前加载滚动插件
                 this.refresh();  
                    // this.scroll.refresh(); BS内置重置 滚动方法, 防止滚动高度发生偏差
                 if(scrollStyle === 'up'){
                        //如果是上拉,滚动条直接滚动到
                     this.scroll.scrollTo(0,this.satrY(115*this.lastList))
                 }
             },20)
         }
     },
     methods:{
         _initSlider(){
                //下拉刷新,上拉加载
             if(!this.$refs.wrapper){
                 return
             }
             //better-scroll初始化
             this.scrool = new BScroll(this.$refs.wrapper,{
                 probeType:3,
                 click:true,
                 scrollx:true
             });
                // 监听scroll的滚动事件, 回调函数会传入 位置信息
             this.scool.on('scroll',pos=>{
                 this.satry = pos.y;
                 //如果下拉超过50px 就显示下拉刷新的文字
                 this.down = true;
                 // pos.y > 50 ?(this.down = true):(this.down = false)
                 this.down = pos.y > 50
                });
                //touchEnd 通过这个方法来监听下拉刷新 (即 监听手指抬起这个动作)
                this.scroll.on('touchEnd ',pos=>{
                    //下拉动作
                    if(pos.y > 10){
                        this.scrollStyle = 'down';
                        this.down = true;
                        console.log('下拉刷新');
                        this.pagNo = 1; //请求第一页
                        this.upend = false;
                        this.totalBalance = 0;//下拉刷新合计清0
                        this.upend = false;
                        this.getData().then(res=>{
                            //刷新数据
                            this.down = false;
                            //去除旧数据,防止数组一直累加
                            this.dataList.length = 0;
                            this.dataList = res;
                            return
                        })
                    }
                 if(this.scroll.maxScrollY > pos.y +10){
                        //这里的10是距离底部多少像素的时候触发
                        if(!this.bol){//如果是最后一次请求
                            this.up = false;
                            this.upend = true;
                            return
                        }
                        this.satry = pos.y;
                        this.scrollStyle = 'up';
                        console.log('上拉刷新');
                        this.up = true;
                        this.pageNo = this.pageNoNew;//赋值之前存储的当前页数
                        if(this.up){
                            this.getData().then(res=>{
                                this.dataList = res;
                            })
                        }
                    }
                })       
            }
     },
     refresh(){
         this.scroll && this.scroll.refresh();
     }
    }
    
  2. 在Vue组件中 混入封装 scroll.js插件

    <!--注意,这里必须用v-show,以便预加载滚动插件-->
    <div v-show='dataList.length > 0'> 
     <div class='wrapper' ref='wrapper'>
            <ul class='content'>
                <!-- transition是Vue内置的动画插件 name是指动画效果 -->
                <transition name='fade'>
                    <div class='newxin' v-show='down'>
                        <p>
                            <loading-tip size='24px'>下拉刷新</loading-tip>
                        </p>
                    </div>
                </transition>
                <li class='myorderList' 
                    v-for='(item,index) in dataList' 
                    :key="index" 
                    :id="`scroll-item-${index}`"
                    >
                    <div @click='myOrderFind(index)'>
                        <p> {{item.totalRealPrice}}元</p>
                        <p> {{item.title}}</p>
                        <p> {{item.totalRealPrice}}元</p>
                    </div>           
                </li>
                <transition name='fade'>
                    <div class='newxin'>
                        <p  v-show='up'>
                            <!-- 随便做一个 加载提示的组件, 实在不行就写个 p 标签 -->   
                            <loading-tip size='24px'>加载中...</loading-tip>
                        </p>
                        <p  v-show='upend'>
                            <loading-tip size='24px'>已经没有更多了~~~</v-loading>
                        </p>
                    </div>
                </transition>
            </ul>
     </div>
    </div>
    
    <div v-else>
        <nodata-tip txt='暂无数据'></nodata-tip>
    </div>
    <script>
    
    import { scrollMixin} from '/mixin/scoll';
    import LoadingTip from "@/components/common/loading_tip"
    import NodataTip from "@/components/common/nodata_tip"
    export default {
        mixins:[scrollMixin],
        data(){
            return{
                dataList:[],//渲染的数据列表
                pageNo:1,//第几页
                pageSize:10,//多少条
                pageNoNew :0,
            }
        },
        compoonents: {
            LoadingTip: LoadingTip,
            NodataTip: NodataTip
        },
        created(){
            this.getData();
        },
        methods:{
            getData(){//构造一个promise请求
                this.up = false;
                this.down = false;
                return this.
                $Api.getMyorder(this.pageNo,this.pageSize).
                    then(res =>{
                        if(res.code == 200){
                            if(res.data.length > 0){
                                this.dataList = this.dataList.concat(res.data);
                                this.totalBalance += res.totalBalance ;
                                this.pageNo++;
                                this.pageNoNew = this.pageNo;//上拉加载时,存储当前页
                            }
                            if(this.dataList.length >= res.total){
                                this.bol = false;//停止请求数据
                                this.upend = true;
                            }else{
                                this.bol = true;
                                this.upend = false;
                                this.up = false;
                            }
                        }else{
                            //使用cube-ui的错误提示
                            this.$createToast({
                                type: "info",
                                txt: res.message,
                                time: 1500
                            }).show()
                        }
                    })
                    // 请求成功返回异步获取的数据
                    return this.dataList
                })
         }
     }
    }
    </script>
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容