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 垃圾回收机制分析
Oct 10 Javascript
jquery遍历数组与筛选数组的方法
Nov 05 Javascript
javascript实现判断鼠标的状态
Jul 10 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
Jan 31 Javascript
javascript运算符——逻辑运算符全面解析
Jun 27 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
Aug 05 Javascript
Backbone View 之间通信的三种方式
Aug 09 Javascript
layui表格实现代码
May 20 Javascript
基于Bootstrap框架菜鸟入门教程(推荐)
Sep 17 Javascript
angular6.0开发教程之如何安装angular6.0框架
Jun 29 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
Nov 21 Javascript
websocket4.0+typescript 实现热更新的方法
Aug 14 Javascript
记一次用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
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
php pthreads多线程的安装与使用
2016/01/19 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
2016/04/04 PHP
php 使用html5实现多文件上传实例
2016/10/24 PHP
php计算多个集合的笛卡尔积实例详解
2017/02/16 PHP
php批量转换文件夹下所有文件编码的函数类
2017/08/06 PHP
PHP+Apache环境中如何隐藏Apache版本
2017/11/24 PHP
jquery获取input的value问题说明
2010/08/19 Javascript
js/jQuery对象互转(快速操作dom元素)
2013/02/04 Javascript
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
JavaScript实现的一个日期格式化函数分享
2014/12/06 Javascript
JavaScript制作弹出层效果
2016/12/02 Javascript
从零学习node.js之简易的网络爬虫(四)
2017/02/22 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
2017/09/01 Javascript
实战node静态文件服务器的示例代码
2018/03/08 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
2018/05/16 Javascript
JS中的一些常用的函数式编程术语
2019/06/15 Javascript
JavaScript React如何修改默认端口号方法详解
2020/07/28 Javascript
[46:42]DOTA2-DPC中国联赛正赛 Aster vs Magma BO3 第二场 3月5日
2021/03/11 DOTA
Python中生成Epoch的方法
2017/04/26 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
Django如何将URL映射到视图
2019/07/29 Python
如何通过python实现IOU计算代码实例
2020/11/02 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
带病坚持工作事迹
2014/05/03 职场文书
会计演讲稿范文
2014/05/23 职场文书
2014法院干警廉洁警示教育思想汇报
2014/09/13 职场文书
婚礼答谢词
2015/01/04 职场文书
2015暑假假期总结
2015/07/13 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
领导莅临指导欢迎词
2015/09/30 职场文书
Python多线程实用方法以及共享变量资源竞争问题
2022/04/12 Python
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL
Apache自带的ab压力测试工具的实现
2022/07/23 Servers