使用vuejs开发的一个面试页面

试题链接

参考答案GitHub地址

第一部分

是关于javascript的简答题,考的是js基础知识。涉及的内容包括数组操作,js中改变this指向的方法call()以及js原型法。

第二部分

使用SPA框架开发一个滚动加载的页面,我使用的是vue.js,涉及的开发知识比较多。项目核心知识包括Vue.js,webpack,vue-scroller,axios,moment.js,xml2json.js,跨域问题,JavaScript正则匹配。数据源是http://36kr.com/feed,数据格式是xml。

正文如下。大家可以看看试题,再看看我的参考答案,以下是详细介绍,欢迎大家给参考答案点一个star~

1.项目结构直接使用vue-scroller的演示demo 传送门

2.配置webpack,设置proxy代理,解决网络请求插件axios获取http://36kr.com/feed存在跨域问题。在webpack.config.js中devServer的设置添加proxy,如下:

devServer: {
    historyApiFallback: true,
    noInfo: true,
    proxy: {
        '/feed': {
        target: 'http://36kr.com/',
        changeOrigin: true,
        secure: false
      }
    }
  }

3.移动端使用相对长度单位rem,需要在index.html中添加一段js代码,根据屏幕尺寸设置根字体大小。

<script type="text/javascript">
        window.addEventListener('resize', infinite);
        function infinite() {
            const html = document.getElementsByTagName('html')[0];
            const htmlWidth = document.body.clientWidth
            if (htmlWidth >= 1080) {
                html.style.fontSize = "42px";
            } else {
                html.style.fontSize = (42/ 1080 * htmlWidth) + 'px';
            }
        }infinite();
  </script>

4.这部分知识主要包括vue指令v-for、v-if、v-text、v-html。以及自定义事件refresh、infinite。css只要使用flex布局,比较简单不贴代码了,组件html结构如下:

<template>
  <div id="app">
    <scroller :on-refresh="refresh"
              :on-infinite="infinite"
              ref="my_scroller">
      <div v-for="(item, index) in items" class="row">
        <h1 class="itme-title" v-text="item.title.__cdata"></h1>
        <div class="itembox">
          <span class="author" v-text="item.author"></span>
          <span class="category" v-text="item.category"></span>
          <span class="timebox" v-text="newmoment(item.pubDate.__cdata)"></span>
        </div>
        <a class="item-content" :href="item.link">
          <div class="leftbox" v-html="handlerData(item.description.__cdata)"></div>
          <div class="rightbox">
            <div class="imgbox">
             ![](skewImg.url?skewImg.url:'/src/assets/404.jpg')
            </div>
          </div>
        </a>
      </div>
    </scroller>
  </div>
</template>

5.在vue生命周期created阶段,通过axios发起网络请求,获取数据之后,将数据经过xml2json插件转换后,保存json数据到本地数组。

 data() {
      return {
        items: [],//当前渲染数据
        allData: [],//所有数据
        dataLen: 0,//数据总长度
        step: 10,//上拉加载时,每次载入数据的数量
        times: 0,//上拉加载次数
        skewImg: []//缩略图保存地址
      }
    },
created() {
        var dataObj = {};
        var self = this;
        axios.get('/feed')
        .then(function (response) {
          var x2js = new X2JS();
          var dataObj = response.data;
          var jsonObj = x2js.xml_str2json( dataObj );
          var itemData = jsonObj.rss.channel.item;
          for (var i = itemData.length; i >= 0; i--) {
            self.allData.push(itemData[i])
          }
          self.dataLen = self.allData.length;
        })
        .catch(function (error) {
          console.log(error);
        });
    }

6.渲染到页面前数据处理,若当前item有多张图片,则保存第一张图片的src地址,若没有图片则保存一个空值。然后将数据去除所有html标签,只保留300个字符长度的文本,渲染到页面中:

handlerData(str) {
        var self = this;
        var dd = '';
        var arr = str.replace(/<img [^>]*src=['"]([^'"]+)[^>]*>/i, function (match, capture) {
             dd = capture
        });
        self.skewImg['url'] = dd;

        var str = str.substring(0,300);
        return str.replace(/<[^>]+>/g,"");
      }

7.渲染到页面前,使用moment.js格式化时间。

newmoment(arg) {
        return moment(arg).format('MM 月 DD 日 hh:mm')
     }

8.上拉加载更多调用infinite()方法,每次上拉操作,次数times自加1,并往items数组添加step长度的数据:

infinite() {
        var self = this;
        setTimeout(() => {
          self.times +=1;
          var end = ((self.step)+1)*self.times;
          var sta  = end - self.step;
          self.items = self.items.concat(self.allData.slice(sta,end));//合并数组
          if (self.items.length >= self.dataLen) {//当加载完所有数据,禁用上拉加载
            this.$refs.my_scroller.finishInfinite(true)
          }
          setTimeout(() => {
            this.$refs.my_scroller.finishInfinite(true)
          })
        }, 1500)
      },

9.下拉刷新调用reflesh()方法,重新发起一次网络请求,并且往items中填充step条数据:

refresh() {
        setTimeout(() => {
        var dataObj = {};
        var self = this;
        axios.get('/feed')
        .then(function (response) {
          var x2js = new X2JS();
          var dataObj = response.data;
          var jsonObj = x2js.xml_str2json( dataObj );
          var itemData = jsonObj.rss.channel.item;
          for (var i = itemData.length; i >= 0; i--) {
            self.allData.push(itemData[i])
          }
          self.items = self.allData.slice(sta,end);
          var end = ((self.step)+1)*self.times;
          var sta  = end - self.step;
        })
        .catch(function (error) {
          console.log(error);
        });
          if (this.$refs.my_scroller)
            this.$refs.my_scroller.finishPullToRefresh();
        }, 1500)
      },

最后是遗留问题:应该是webpack配置有点问题,打包之后,不知道是否是路径问题,设置的proxy代理失效。求大神帮忙看看。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 转载 :OpenDiggawesome-github-vue 是由OpenDigg整理并维护的Vue相关开源项目库...
    果汁密码阅读 23,083评论 8 124
  • 上一章黑暗中4 5. 还没有等陈雅静想明白是怎么回事,突然耳边传来杨二狗的一声大喊:“跑!”她感觉到一股巨大的拉力...
    1019d835891a阅读 222评论 0 0
  • 能和铃铛子训练营相遇是一种缘分,也是一种幸运。那天期末复习很是烦躁,突然想起一个在某APP听故事时时常听到的叫简书...
    LBBB765阅读 548评论 13 19
  • 在了解socket网络编程之前,我们需要先知道以下几个问题: 网络中进程之间如何通信? Socket是什么? TC...
    心至靜行至遠阅读 7,486评论 12 87
  • 去年因为在武汉照顾女儿,女儿早出晚归,我有了大把时间,不想太闲,就做起了微商,卖内衣,总的来说还不错。今年到店里来...
    叛逆的榴莲阅读 351评论 0 1