美文网首页让前端飞技术干货
前端(vue)面试题答案分享

前端(vue)面试题答案分享

作者: 一起学习web前端 | 来源:发表于2019-03-29 14:23 被阅读2次

    首先还是把之前留的悬念给大家揭晓,6-10题的答案,

    6.Vue中如何监控某个属性值的变化?

    比如现在需要监控data中, obj.a 的变化。Vue中监控对象属性的变化你可以这样:

    watch: {

         obj: {

         handler (newValue, oldValue) {

           console.log('obj changed')

         },

         deep: true

       }

     }

    deep属性表示深层遍历,但是这么写会监控obj的所有属性变化,并不是我们想要的效果,所以做点修改:

    watch: {

      'obj.a': {

         handler (newName, oldName) {

           console.log('obj.a changed')

         }

      }

     }

    还有一种方法,可以通过computed 来实现,只需要:

    computed: {

       a1 () {

         return this.obj.a

       }

    }

    利用计算属性的特性来实现,当依赖改变时,便会重新计算一个新值。

    7. Vue中给data中的对象属性添加一个新的属性时会发生什么,如何解决?

    示例:

    <template>

     <div>

       <ul>

         <li v-for="value in obj" :key="value">

           {{value}}

         </li>

       </ul>

       <button @click="addObjB">添加obj.b</button>

     </div>

    </template>

    <script>

    export default {

     data () {

       return {

         obj: {

           a: 'obj.a'

         }

       }

     },

     methods: {

       addObjB () {

         this.obj.b = 'obj.b'

         console.log(this.obj)

       }

     }

    }

    </script>

    <style></style>

    点击button会发现, obj.b 已经成功添加,但是视图并未刷新:

    原因在于在Vue实例创建时, obj.b 并未声明,因此就没有被Vue转换为响应式的属性,自然就不会触发视图的更新,这时就需要使用Vue的全局api—— $set():

    addObjB () {

         // this.obj.b = 'obj.b'

         this.$set(this.obj, 'b', 'obj.b')

         console.log(this.obj)

       }

    $set() 方法相当于手动的去把 obj.b 处理成一个响应式的属性,此时视图也会跟着改变了:

    8. 如何优化SPA应用的首屏加载速度慢的问题?

    将公用的JS库通过script标签外部引入,减小app.bundel的大小,让浏览器并行下载资源文件,提高下载速度;

    在配置 路由时,页面和组件使用懒加载的方式引入,进一步缩小app.bundel的体积,在调用某个组件时再加载对应的js文件;

    加一个首屏loading图,提升用户体验;

    9.前端如何优化网站性能?

    1、减少 HTTP 请求数量

    在浏览器与服务器进行通信时,主要是通过 HTTP 进行通信。浏览器与服务器需要经过三次握手,每次握手需要花费大量时间。而且不同浏览器对资源文件并发请求数量有限(不同浏览器允许并发数),一旦 HTTP 请求数量达到一定数量,资源请求就存在等待状态,这是很致命的,因此减少 HTTP 的请求数量可以很大程度上对网站性能进行优化。

    CSS Sprites

    国内俗称CSS精灵,这是将多张图片合并成一张图片达到减少HTTP请求的一种解决方案,可以通过CSS的background属性来访问图片内容。这种方案同时还可以减少图片总字节数。

    合并 CSS 和 JS 文件

    现在前端有很多工程化打包工具,如:grunt、gulp、webpack等。为了减少 HTTP 请求数量,可以通过这些工具再发布前将多个CSS或者多个JS合并成一个文件。

    采用 lazyLoad

    俗称懒加载,可以控制网页上的内容在一开始无需加载,不需要发请求,等到用户操作真正需要的时候立即加载出内容。这样就控制了网页资源一次性请求数量。

    2、控制资源文件加载优先级

    浏览器在加载HTML内容时,是将HTML内容从上至下依次解析,解析到link或者script标签就会加载href或者src对应链接内容,为了第一时间展示页面给用户,就需要将CSS提前加载,不要受 JS 加载影响。

    一般情况下都是CSS在头部,JS在底部。

    3、利用浏览器缓存

    浏览器缓存是将网络资源存储在本地,等待下次请求该资源时,如果资源已经存在就不需要到服务器重新请求该资源,直接在本地读取该资源。

    4、减少重排(Reflow)

    基本原理:重排是DOM的变化影响到了元素的几何属性(宽和高),浏览器会重新计算元素的几何属性,会使渲染树中受到影响的部分失效,浏览器会验证 DOM 树上的所有其它结点的visibility属性,这也是Reflow低效的原因。如果Reflow的过于频繁,CPU使用率就会急剧上升。

    减少Reflow,如果需要在DOM操作时添加样式,尽量使用 增加class属性,而不是通过style操作样式。

    5、减少 DOM 操作

    6、图标使用 IconFont 替换

    10. jQuery如何扩展自定义方法

    (jQuery.fn.myMethod=function () {

          alert('myMethod');

    })

    // 或者:

    (function ($) {

           $.fn.extend({

                myMethod : function () {

                     alert('myMethod');

                }

           })

    })(jQuery)

    使用:

    $("#div").myMethod();

    这次是更新的上一篇文章的后面几个题目,以后将不定期给大家带来前端干货,不想错过的,可以动动你们的小手指吗,点击下关注,或者给个小心心~

    相关文章

      网友评论

        本文标题:前端(vue)面试题答案分享

        本文链接:https://www.haomeiwen.com/subject/ykclbqtx.html