vue|小知识点🏆🏆你真的记全了嘛

81 阅读5分钟

1、事件修饰符

(1) .stop:等同于js的event.stopPropagation(),防止事件冒泡
(2) .prevent :等同于js的event.preventDefault(),防止事件的默认行为
(3) .capture:事件捕获,从外到内
(4) .self:只会触发自己范围内的事件,不包括子元素
(5) .once:只会触发一次

2、data为什么是一个函数而不是对象

1.data的两种形式

        var app = new Vue({
            el: '#app',
            data: {
                searchText: '123'
            }
        })
        var app = new Vue({
            el: '#app',
            data() {
                return {
                    searchText: '123'
                }
            }
        })

有效规避多实例污染的问题

Vue组件可能存在多个实例,如果使用对象定义data,则会导致他们共用同一个data对象,状态变更的时候就会影响多个实例。 采用函数形式定义,在initData时,会返回一个全新的data对象,可以有效的规避多实例污染的问题

3、vue封装数组的几个方法

1.vue利用了Object.defineProperty对数据进行拦截,但是这个方法无法监听到数组内部的变化,数据的长度变化,下标变化,截取变化等,所以vue对数组的监听专门做了处理对引起数据变化的方法pop、push、unshift、shift、reverse、sort、splice,vue进行了包装

2.vue封装的原理

就是在vue中重写数组的原生方法,首先获取这个数组的__ob__,也就是它的observer对象,如果有新的值,就调用observerArray继续对新的值观察变化,然后手动调用notify,通知渲染watcher,执行update

4、template到render的过程

1.template→ast→render

2.在vue编译的过程中会利用compileToFunctions 将template转化成render()函数

3.compileToFunctions的主要工作

(1)调用parse方法将template转成ast (2)对静态节点进行优化 (3)生成代码

4.vue模版编译的3个阶段

解析阶段

使用大量的正则表达式对tempate字符串进行解析,将指令、标签、属性等转化成抽象语法树

优化阶段

遍历AST,找到静节点,做标记,在diff的时候可以提高效率

生成阶段

将最终的AST转换成render函数

5、子组件可以直接改变父组件的值吗?

子组件不可以直接改变父组件的值,这样做主要是为了维护父子组件的单向数据流,每次父组件发生更新时,子组件中的props都会刷新为最新的值

子组件只能通过emit派发一个事件给父组件,由父组件更改

6、static和assets的区别

相同点

assets和static文件都是存储静态的资源,项目需要的资源图片、字体图标、样式文件等

不同点

assets中的资源在打包时,也就是运行npm run build的时候,会进行打包处理,也就是压缩体积,最后压缩后的静态资源最后都会放到static中和index.html一起上传服务器,

static中文件不会走打包流程,直接进入打包好的目录中,上传服务器 static中的资源没有进行打包,所以体积比assets体积大

建议

在template中定义的css和js文件放入到assets中进行打包压缩

引入的第三方库的资源文件比如iconfont.css 就放在static,因为这些引入的文件已经经过处理,不需要在进行压缩,直接上传

7、delete和vue.delete的区别

<template>
    <div>delete和vue.delete的区别</div>
</template>

<script>

export default {
  data () {
    return {
      arr1: [1, 2, 3],
      arr2: [1, 2, 3]
    }
  },
  created () {
    this.init()
  },
  methods: {
    init () {
      delete this.arr1[0]
      console.log(this.arr1) // [empty, 2, 3]

      this.$delete(this.arr2, 0)
      console.log(this.arr2) // [2, 3]
    }
  }
}
</script>

delete删除完数组元素后,元素的值会变成empty/undefined,数据的key不变,不会删除数组在内存中的占位

vue.delete删除完数组元素后,元素的key会发生改变,会删除数组在内存中的占位

8、对SSR的理解

1.原理

服务器端渲染(Server-Side Rendering)简称SSR SSR就是将Vue在客户端把标签渲染成HTML的工作放到服务器端完成,然后服务器端把处理好的HTML页面返回给客户端

当浏览器请求一个url的时候,服务器端将首屏需要的异步请求数据填充成完整的html返回客户端,返回前端的过程中,SSR是一份代码运行在两份环境中,服务端和客户端。首屏请求的时候,服务器将模板+异步数据,渲染陈html界面,返回给前端,前端再载入js文件,完成激活,剩下的就是SPA了,只有首屏是服务器端渲染且有数据的html。首屏只需要渲染一个界面,后续激活SPA是发生在浏览器中,不需要在服务器端操作所以解决了首屏加载时间慢的问题

2.优点

(1)有利于SEO检索

SPA页面的内容是Ajax获取,而搜索引擎爬取工具并不会等待Ajax异步完成后再进行爬取页面内容,所以在SPA页面是抓取不到页面通过Ajax获取到的内容,爬虫获取的html,是一个没有数据的空壳子。而SSR,是服务端直接将数据处理好,再拼接组装好,返回一个已经渲染好的页面(数据已经包含在页面中),所以爬虫可以爬取渲染好的页面。

(2)首屏加载更快

SPA页面,需要等所有的Vue编译后的js文件全部下载完成之后,才开始进行页面的渲染,文件下载需要一定的时间,所以首屏渲染需要一定的时间。SSR直接有服务端渲染好页面直接返回显示,不需要等待下载js文件后再去渲染,所以SSR能解决SPA页面首屏渲染时间太长的问题

3.缺点

服务端只支持brforeCreate和created两个钩子

服务器端承担了更多的负载

9、vue的性能优化

1.编译阶段

尽量减少data中的数据,每个数据都会增加setter和getter

v-for和v-if不要一起使用

尽量使用v-show代替v-if

如果需要使用v-for给每个元素绑定事件要使用事件代理

key值保持唯一

防抖、节流

2.SEO优化

预渲染

服务器端渲染

3.打包优化

压缩代码

4.用户体验

使用缓存,浏览器缓存,服务器缓存

keep-alive缓存界面

路由懒加载

图片懒加载

按需引入第三方组件库

参考👀

www.jianshu.com/p/6e1e985ee…

blog.csdn.net/weixin_4253…