vue理解一

37 阅读4分钟

1.vue理解

vue是一个渐进式框架,核心库只关注视图层。它是一个声明式框架,更加关注结果,而命令式关注过程。

MVC模式是后端进行处理的,前端进行借用模式MVVM

后端的MVC:请求在控制器进行处理,使用服务层拆分业务层和持久层,调用数据库,再进行页面渲染。

MVVM:数据绑定到视图上,简化controller. 但是vue不是传统的MVVM模式,只是借鉴思想。

所以vue可以跨平台,减少操作真实DOM,组件化。

2.SPA的理解

单页应用,vue和React都只有一个HTML页面,并且提供一个挂载点,最终打包后在页面引入对应资源。通过路由进行切换页面。

缺点:HTML中是没有任何内容的,无法做到SEO优化。而且需要再一次请起js,浏览器进行解析js,渲染真实DOM,造成首屏加载时间长,白屏时间长,但是维护成本低,页面切换快,进行局部刷新,服务端压力小。

MPA多页应用,多个html页面。每个页面重复加载,js,css资源,跳转时整个页面都要刷新,服务端压力大,不好维护。服务端返回完整的HTML,白屏时间小,可以进行SEO优化。

解决方案:

静态页面预渲染SSG,在构建时生成一个完整的HTML页面,打包前页面在浏览器运行,保存HTML。但适合静态页面网站,变化率不高的网站。

SSR+CSR 首屏采用服务端渲染方式,后续交互采用客户端渲染方式。

3.$refs通讯时的弊端

vue组件通信:使用$refs在组件之间进行通信,允许父组件中访问子组件的方法和数据。

弊端:

1.破坏了单向数据流的原则:父组件可以直接修改子组件中的数据,容易导致状态管理的难以维护。

2.加强了耦合关系:父子组件形成了紧密的耦合关系。

3.组件复用问题:父子组件绑定在一起,不能实现真正的组件复用。

4.undefined:获取组件实例是要在组件渲染的情况下,在组件未渲染的时候去通过$ref调用子组件里面的内容,拿到的是undefined。

4.单页应用首屏加载速度慢如何解决

1.路由懒加载,异步组件实现组件拆分,首页加载所需要的组件,同时减少入口文件体积大小(优化骨架屏)。

2.图片资源压缩,使用雪碧图,小图片进行base64减少http请求。

3.静态资源采取CDN提速。

4.静态资源缓存,采用HTTP缓存,localStorage资源缓存。

5.SSR对首屏做服务端渲染。

6.打包开启gzip压缩处理,compression-webpack-plugin插件。

7.抽离公共代码,采用splitChunks进行代码分割。

5.SSR解决了什么问题

SSR为服务端渲染。

由服务端完成页面的HTML结构拼接,发送到浏览器,然后绑定状态与事件,成为完全可交互页面的过程。

1.解决了seo,搜索引擎优的爬取。

2.首屏呈现渲染加载快,白屏时间短。

缺点:

1.提高整个项目的复杂度。

2.库及代码的兼容性。

3.性能问题,消耗大,会污染,内存占用过多。

4.服务器负载变大。

6.常用的修饰符

作用:许多细节方面的处理更加方便,更加专注于逻辑处理。

修饰符分为五种:

1.表单修饰符

2.事件修饰符

3.鼠标修饰符

4.键值修饰符

5.v-bind修饰符

1.表单修饰符

1.trim 自动过滤用户首空格字符,中间的空格并不会过滤

v-modle.trim

2.number 自动将用户输入值转化为数值类型,无法被解析返回原来的值

v-modle.number

3.lazy 光标离开标签时,才会赋值给value,在change事件之后进行信息同步

v-modle.lazy

2.事件修饰符

1.stop阻止了事件冒泡,等价于event.stopPropagation()

    @click.stop

2.prevent阻止了事件的默认行为,等价于event.preventDefault()

    @click.prevent

3.once绑定事件之后只能触发一次

    @click.once
    

4.native让组件变成像html内置标签那样监听根元素的原生事件

修饰符在Vue 3.0中已经被移除

5.self 只当在event.target是当前元素自身时触发处理函数.将事件绑定在自身身上,相当于阻止事件冒泡

 v-on:click.self

6.caption:用于事件捕获,使事件触发从包含这个元素的顶层开始往下触发

3.鼠标按钮修饰符

1.left 左键点击

 @click.left

2.right 右键点击

 @click.right

3.middle 中键点击

 @click.middle

4.键盘修饰符

```
// 只有按键为keyCode的时候才触发,监听特定键盘按下
<input type="text" @keyup.keyCode="shout()">
```

5.v-bind修饰符

1.async 能对props进行一个双向绑定

//父组件
<comp :myData.sync="data"></comp> 
//子组件
this.$emit('update:myData',params);



//父亲组件
<comp :myData="data" @update:myData="func"></comp>
    func(e){
     this.data = e;
    }
    //子组件js
    func2(){
      this.$emit('update:myMessage',params);
    }

注:

1.使用sync子组件传递的事件名格式必须为update:value,其中value必须与子组件中props中声明的名称完全一致

2.带有.sync修饰符的v-bind不能和表达式一起使用

3.将 v-bind.sync用在一个字面量的对象上,如 v-bind.sync=”{ title: data.title }”是无法正常工作的

2.prop设置自定义标签属性,避免暴露数据,防止污染HTML结构

<input  value="1" :index.prop="index">

3.camel将命名变为驼峰命名法,如将my-div属性名转换为myDiv

<svg :myDiv="myDiv"></svg>

7.什么是骨架屏

在页面完全渲染完成之前,看到一个样式简单,描绘了当前页面的大致框架的页面,然后骨架屏中各个占位部分被实际资源完全替换,这个过程中用户会觉得内容正在逐渐加载即将呈现。

8.Vue2和Vue3区别

1.响应式原理的不同。Vue2使用Object.defineProperty进行数据劫持,这种方式对新增属性和数组变动的检测有限制。相比之下,Vue 3采用了ES6可以更有效地监控数据变化,包括对象和数组的内部变动。

2.Vue3允许组件模板有多个根节点,而Vue 2要求只有一个根节点。这种变化简化了对复杂组件结构的处理。

3.Vue3在性能方面有显著提升,包括初次渲染和更新的速度提升,以及内存使用的减少。

4.API类型的不同。Vue 3引入了Composition API这是一种基于函数的API风格,相比Vue 2的Options API,它提供了更灵活和组织性更好的代码结构。

Vue3新特性:

1.速度更快:重写了虚拟Dom实现,编译模板的优化,高效的组件初始化,undate性能提高

2.体积减少

3.更易维护:可与现有的Options API一起使用,可以和其他框架搭配使用,更好的Typescript支持

4.更接近原生:可以自定义渲染 API

5.更易使用:响应式Api暴露出来

9.组件化

组件化高内聚,可重用,可组合。大幅度提高开发效率,复用性等。降低更新范围,只重新渲染变化的组件。

需要注意:数据是响应式的,数据变化后会执行watcher或effect,重新更新。每个组件都有一个渲染函数watcher,effect。如果过分拆分组件会导致watcher,effect产生过多造成性能浪费。

10.响应式数据理解

用户取值和修改值都能知道。

数据变化时,对象通过defineReactive方法,使用object.definProperty将属性进行劫持,且只劫持已经存在属性。数组通过重写方法,多层对象通过递归实现劫持。

使用definProperty进行数据劫持,需要对属性进行重写添加getter及setter,造成性能差。 当新增和删除属性时,无法监控变化,需要通过set,set,delete 实现,增加负担。 数组不采用劫持,单独处理。 对ES6新产生的Map数据结构不支持。

就是对所有属性加入get set方法,进行重写,同时进行递归解决多层对象,不停的加入get set 方法,性能会比较差。

vu3 使用proxy 代理属性解决了vue2中的问题,使用时才会进行递归完成多层对象代理。

11.检测数组变化

数组进行重写,数组中包含对象也会进行劫持,通知视图更新。

缺陷无法对索引和长度是无法监控到的。

12.computed 和 watch区别

计算属性computed 内部都维护一个dirty属性。dirty:true 将拿到的值进行缓存起来,dirty:false。 再次取值时dirty:false,从缓存中取值。 当值发生改变,dirty变成true,触发页面更新,重新获取最新的计算属性。

watch监控数据变化,触发回调。

区别:

1.computed 支持缓存,只有依赖数据发生改变,才会重新进行计算.

2.computed 不支持异步,当computed内有异步操作时无效,无法监听数据的变化.

3.当一个数据受多个数据影响时,可以使用computed.计算props的值,计算vuex的state或者getters值的变化,本组件计算

1.watch不支持缓存,数据变会触发相应的操作;

2.watch支持异步;

3.watch监听的函数接收两个参数,第一个参数是最新的值;第二个参数是旧的值;

4.deep: 深度监听,当对象内部属性的值发生变化时,Vue会触发视图的重新渲染。

13.v-if 和 v-for

v-if和v-for不能在一起使用。

vue2

先解析v-for 在解析v-if ,导致先循环后对每一项进行判断,浪费性能。

不论条件是否满足都要循环,在进行判断。

v-for优先级高于v-if

所以v-if放入外层,v-for放入里层。

如果必须在循环中使用判断,使用过滤,在计算属性中使用。 如: computed:{

filterArr(){
    return this.arr.filter(item=> item%2)
}

}

  <div v-for="l in filterArr"></div>

vue3 v-if 高于v-for