vue实现新闻展示页的步骤详解


Posted in Javascript onApril 11, 2019

需求

1.  做一个新闻展示页
2.  新闻分类可以自定义
3.  每类新闻的内容,样式不一样
4.  上拉加载新的数据
5.  点击进入详情页,再返回时,定位到原来的位置

图片展示

vue实现新闻展示页的步骤详解 

vue实现新闻展示页的步骤详解 

vue实现新闻展示页的步骤详解 

采用的技术

轮播图使用:swiper
    zepto.js
    vue.js
    vue.resource.js
    vue-router.js
滑动插件:iscroll.js
界面样式采用的   weui

设计的思路

因为使用了vue.js  每个分类的样式不一样,而且分类是可以配置的。所以呢,想到了单页面应用,所以选择了vue-router.js的路由。也使用了vue.resource 插件用来做数据传输。

因为我比较菜,所以呢还是使用的原始的引入方式,没有使用webpack之类的打包工具,就最原始的js 写法。

难点

使用了路由,是为了返回的时候,可以回到刚才离开的地方,vue虽然有自带的keep-alive  但是似乎必须使用路由的history模式,还要修改服务器端的东西,所以感觉不是很合适。而且我们需要Ajax加载数据,怎样能返回路由的时候,展示ajax加载的内容呢?

我想到了记录个数,每次进入路由再从这个数开始加载,但是呢我们没有下拉更新,用户再也看不到之前看的内容。

后来我想到了H5 的缓存方法。使用了sessionStorage。

sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。

再离开一个路由之前,把这个路由现在状态信息全部记录下来(包括提示语,滑动位置,新闻内容等),等下次进入这个路由的时候,再取出来数据这样就实现了不管加载多少数据,再次进入这个路由的时候,都可以和上一个衔接上。

下图为存在缓存里面的内容。而且一关闭浏览器数据会被清空

vue实现新闻展示页的步骤详解

有一个重要的地方是:sessionStorage 是有最大容量的,应该是有容量限制的,我找了找localStorage 5M左右,sessionStorage 我还没有找到,但在项目中运行情况来看,暂时稳定。

重要代码展示

路由的定义

vue实现新闻展示页的步骤详解

重点的是每个组件里面的方法

vue实现新闻展示页的步骤详解

每个组件都共用的data , create 和 methods_all

var returndata={
    swipertime:swipertime,
    demoData: [],
    demoData2:[],
    message:'正在加载数据',
    iscrollaction:false,
    token:'{pigcms:$token}',
    cdn:"{pigcms::C('cdn_images')}",
    param:{
      api_url:"{pigcms::C('api_weixin')}",
      local_url:"{pigcms::C('site_url')}",
      classid: -1,
      startnum: 0 ,
      other:''
    },
    ajax_status:false,
    huadong:true,
  }
  //组件开始的时候,先注销掉上一个组件的滑动,然后查看缓存里面有没有数据,如果有缓存就进入缓存里面,如果没有,就重新加载
  var create=function() {
    var that = this;
    if (that.myScroll){
      that.myScroll.destroy(); //把滑动注销掉
    }
    var session_name=this.$route.path;
    if(sessionStorage[session_name]){ //说明缓存里面有
      that.session_data();
    }else{
      that.ajax_data();
    }
  };
//有缓存的处理办法
session_data:function () {
      var that = this;
      var session_name=this.$route.path;
      //把缓存内容取出来
      var session_data= JSON.parse(sessionStorage[session_name]);
      for (x in session_data){
        switch(x){
          case 'data1':
            that.demoData=session_data[x];
            break;
          case 'data2':
            that.demoData2=session_data[x];
            break;
          case 'scroll_y':
            var scroll_y=session_data[x];
            break;
          case 'iscrollaction':
            that.iscrollaction=session_data[x];
            break;
          case 'startnum':
            that.param.startnum=session_data[x];
            break;
          case 'other':
            that.param.other=session_data[x];
            break;
          case 'message':
            that.message=session_data[x];
            break;
          case 'classid':
            that.param.classid=session_data[x];
            break;
        }
      }
      Vue.nextTick(function () {
        //初始化滚动插件
        that.myScroll = new IScroll('#wrapper', {
          mouseWheel: true,
          wheelAction: 'zoom',
          click: true,
          scrollX: false,
          scrollY: true,
          startY:scroll_y,//滑动定位到原来的位置
        });
        //滚动监听
        that.myScroll.on('scrollStart',that.showbox);//滚动监听,1000
        that.myScroll.on('scrollEnd',that.scrollaction);//滚动监听,1000
        that.myScroll.refresh();
      })
    },
//没有缓存重新加载
 ajax_data:function(){
      var that = this;
      if (this.$route.params.id != ''){
        that.param.classid=this.$route.params.id;
      }else{
        that.param.classid=-1;
      }
      that.param.startnum=0;//初始化数据
      var url = that.param.api_url + ******' + that.token + '&classid=' + that.param.classid + '&offset=' + that.param.startnum;//接口url
      that.$http.jsonp(url).then(function (response) {
        var res = response.data; //取出的数据
        this._data.demoData2 = res.new;
        this._data.demoData = res.data;
        this._data.param.other = res.other ;
        var listdata = res.data;  //数据
        var code = res.code; //状态值
        if (res.other !== 1) {
          if (code == '20001') {
            if(listdata.length == 10){
              that.iscrollaction = true;
              that.message='正在加载数据';
            }else{
              that.iscrollaction = false;
              that.message='没有更多资讯';
            }
          }else if (code == '20002') {
            that.iscrollaction=false;
            that.message='没有更多资讯';
          } else if (code == '40001' || code == '40002') {
            that.message='访问错误';
            that.iscrollaction=false;
          }else{
            that.message='暂无数据';
            that.iscrollaction=false;
          }
        } else {
          that.iscrollaction=false;
        }
        that.param.startnum = listdata.length;
        Vue.nextTick(function () {
          //初始化滚动插件
          that.myScroll = new IScroll('#wrapper', {
            mouseWheel: true,
            wheelAction: 'zoom',
            click: true,
            scrollX: false,
            scrollY: true,
          });
          //滚动监听
          that.myScroll.on('scrollStart',that.showbox);//滚动监听,1000
         that.myScroll.on('scrollEnd',that.scrollaction);//滚动监听,1000
          //把数据放在缓存里面
          var session_name=that.$route.path;
          var session_all={};
          session_all.name=session_name;
          session_all.data1=that._data.demoData;
          session_all.data2=that._data.demoData2;
          session_all.scroll_y = 0;
          session_all.iscrollaction=that.iscrollaction;
          session_all.startnum= that.param.startnum;
          session_all.other= that.param.other;
          session_all.message= that.message;
          session_all.classid= that.param.classid;
          var session_all = JSON.stringify(session_all);
          sessionStorage[session_name]=session_all;
        })
      }, function (response) {
        //取消加载效果
        loadingToast.css('display', 'none');
        that.message='服务器维护,请稍后重试';
      });
    },

遇到的困难

最折磨我的还是iscroll的问题,我们用的vue,所以呢 我的点击都是用v-on:click 这种方式来完成的,但是呢,刚开始用iscroll的时候,点击不生效,后来是给 iscroll的options.click 设置为true 才可以点击。

后来有一个难题是:在滑动过程中点击会出发跳转,(本意是滑动一下会再次点击希望他停止滑动,却发生了跳转),造成了不好的体验。我去看了其他的网站, 有的安卓会发生,苹果不会,有的是苹果发生,安卓不会。让我不知道应该怎么办。

总结

sessionStorage 和  localStorage的区别

而localStorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。

以上所述是小编给大家介绍的vue实现新闻展示页的步骤详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,请注明出处,谢谢!

Javascript 相关文章推荐
使用JavaScript的ActiveXObject对象检测应用程序是否安装的方法
Apr 15 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
Mar 13 Javascript
JavaScript框架是什么?怎样才能叫做框架?
Jul 01 Javascript
简单介绍JavaScript中字符串创建的基本方法
Jul 07 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
Dec 22 Javascript
jquery 正整数数字校验正则表达式
Jan 10 Javascript
JS滚动到指定位置导航栏固定顶部
Jul 03 Javascript
使用jQuery实现页面定时弹出广告效果
Aug 24 jQuery
JavaScript中import用法总结
Jan 20 Javascript
在layui框架中select下拉框监听更改事件的例子
Sep 20 Javascript
Javascript组合继承方法代码实例解析
Apr 02 Javascript
如何使用vue3打造一个物料库
May 08 Vue.js
记一次用vue做的活动页的方法步骤
Apr 11 #Javascript
vue数据初始化initState的实例详解
Apr 11 #Javascript
Vue起步(无cli)的啊教程详解
Apr 11 #Javascript
vue+vuex+json-seiver实现数据展示+分页功能
Apr 11 #Javascript
小白教程|一小时上手最流行的前端框架vue(推荐)
Apr 10 #Javascript
微信小程序 wepy框架与iview-weapp的用法详解
Apr 10 #Javascript
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
Apr 10 #jQuery
You might like
基于HTTP长连接的"服务器推"技术的php 简易聊天室
2009/10/31 PHP
php微信公众平台交互与接口详解
2016/11/28 PHP
PHP正则表达式匹配替换与分割功能实例浅析
2017/02/04 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
2020/04/06 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
JAVASCRIPT style 中visibility和display之间的区别
2010/01/22 Javascript
WEB高性能开发之疯狂的HTML压缩
2010/06/19 Javascript
使用documentElement正确取得当前可见区域的大小
2014/07/25 Javascript
php,js,css字符串截取的办法集锦
2014/09/26 Javascript
使用jquery+CSS实现控制打印样式
2014/12/31 Javascript
JavaScript闭包详解
2015/02/02 Javascript
js中对函数设置默认参数值的3种方法
2015/10/23 Javascript
理解JavaScript中worker事件api
2015/12/25 Javascript
NodeJS处理Express中异步错误
2017/03/26 NodeJs
ES6学习笔记之字符串、数组、对象、函数新增知识点实例分析
2020/01/22 Javascript
vue.js实现简单的计算器功能
2020/02/22 Javascript
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
python多线程之事件Event的使用详解
2018/04/27 Python
python画折线图的程序
2018/07/26 Python
Pythony运维入门之Socket网络编程详解
2019/04/15 Python
python中时间、日期、时间戳的转换的实现方法
2019/07/06 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
python超时重新请求解决方案
2019/10/21 Python
使用Keras画神经网络准确性图教程
2020/06/15 Python
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
简述DNS进行域名解析的过程
2013/12/02 面试题
大学生简历的个人自我评价
2013/12/04 职场文书
大学同学会活动方案
2014/08/20 职场文书
学校领导班子对照检查材料
2014/08/28 职场文书
工作作风整顿个人剖析材料
2014/10/11 职场文书
大学生助学金感谢信
2015/01/21 职场文书
学生个人总结范文
2015/02/15 职场文书
2015年工会工作总结
2015/03/30 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
2019最新激励员工口号大全!
2019/06/28 职场文书