vue总结(更新中)

奥奥奥奥奥奥利奥 2022-07-25 18:08:54

VUE

vue双向绑定原理

vue双向绑定原理:其实就是采用 数据劫持 结合 发布者-订阅者模式的方式。

具体实现方法是:new Vue()先将data中的变量引入对象内部,然后为其添加访问器属性。并且在set()函数中添加通知函数。接着会扫描dom树,将扫描到的可能发生变化的元素,保存到额外创建的一棵虚拟DOM树中。 每次只要我们试图修改变量值时,都会自动调用通知函数,向虚拟DOM树发出通知,虚拟DOM树就会立刻扫描自己。查找所有引用这个变量的元素,然后进行页面的更新。

虚拟dom树,好处

虚拟dom树:保存可能发生变化的元素。

(1). 小: 只保存受影响的元素,其余元素都不保存

(2). 遍历快: 因为元素个数少,所以遍历快:

(3). 修改效率高: 只更新受影响的元素,不受影响的元素不更新

(4). 避免重复操作: 虚拟DOM树天生封装了原生DOM的增删改查方法.

数据驱动(MVVM)

MVVM表示的是 Model-View-ViewModel

  • Model:模型层,专门替界面保存所有所需的变量和事件处理函数的对象
  • View:视图层,负责将数据模型转化为UI展示出来,可以简单的理解为HTML页面
  • ViewModel:视图模型层,专门负责将模型对象中的变量值始终与界面同步的特殊对象

v-show与v-if

  • v-show通过display:none隐藏元素v-if是通过删除元素隐藏元素
  • v-show 由false变为true的时候不会触发组件的生命周期;v-iffalse变为true的时候,触发组件的beforeCreatecreatedbeforeMountmounted钩子,由true变为false的时候触发组件的beforeDestorydestoryed方法
  • 性能消耗:频繁切换用v-show

Vue生命周期

beforeCreate -> created ->beforeMount -> mounted ->beforeUpdate -> updated -> beforeDestroy ->destroyed

 

数据请求在created和mouted的区别

created是在组件实例一旦创建完成的时候立刻调用,这时候页面dom节点并未生成;mounted是在页面dom节点渲染完毕之后就立刻执行的。触发时机上created是比mounted要更早的,两者的相同点:都能拿到实例对象的属性和方法。 讨论这个问题本质就是触发的时机,放在mounted中的请求有可能导致页面闪动(因为此时页面dom结构已经生成),但如果在页面加载前完成请求,则不会出现此情况。建议对页面内容的改动放在created生命周期当中。

v-if和v-for的优先级

v-for优先级比v-if高,同时用在同一个元素上,会带来性能方面的浪费(每次渲染都会先循环再进行条件判断)

SPA首屏加载速度慢的怎么解决

  • 减小入口文件积
  • 静态资源本地缓存
  • UI框架按需加载
  • 图片资源的压缩
  • 组件重复打包
  • 开启GZip压缩
  • 使用SSR(服务端渲染)

为什么data属性是一个函数而不是一个对象

目的是为了防止多个组件实例对象之间共用一个data,产生数据污染。采用函数的形式,initData时会将其作为工厂函数都会返回全新data对象

Vue传参

路由传参在router里需要传参的组件的路径上,配置上斜杠冒号(/:)想要传递的变量名,并且设置Props属性值为true,然后在组件中用props接传递过来的变量即可

组件之间的通信方式都有哪些

  • 父子关系的组件数据传递选择 props  与 $emit进行传递,也可选择ref
  • 兄弟关系的组件数据传递可选择$eventBus,其次可以选择$parent进行传递
  • 祖先与后代组件数据传递可选择attrslisteners或者 Provide与 Inject
  • 复杂关系的组件数据传递可以通过vuex存放共享的变量

vue中key的原理

key的作用主要是为了高效的更新虚拟dom

key是给每一个对象的唯一id,可以根据key,更准确, 更快的找到对应的节点

NextTick是什么

在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM

  1. 把回调函数放入callbacks等待执行
  2. 将执行函数放到微任务或者宏任务中
  3. 事件循环到了微任务或者宏任务,执行函数依次执行callbacks中的回调

keep-alive

生命周期函数:activateddeactivated

当我们从首页–>列表页–>详情页–>再返回,这时候列表页应该是需要keep-alive

缓存后如何获取数据

每次组件渲染的时候,都会执行beforeRouteEnter

beforeRouteEnter(to, from, next){
    next(vm=>{
        console.log(vm)
        // 每次进入路由执行
        vm.getData()  // 获取数据
    })
},

keep-alive缓存的组件被激活的时候,都会执行actived钩子

activated(){
   this.getData() // 获取数据
},

Vue常用的修饰符

  • 表单修饰符事件修饰符
    • lazy填完信息,光标离开标签的时候,才会将值赋予给value,也就是在change事件之后再进行信息同步
    • trim 自动过滤用户输入的首空格字符,而中间的空格不会过滤
    • number自动将用户的输入值转为数值类型
    • .stop:阻止事件冒泡
    • .native:绑定原生事件
    • .self :将事件绑定在自身身上,相当于阻止事件冒泡
    • .prevent:阻止默认事件
    • .caption:用于事件捕获
    • .once:只触发一次
    • .keyCode:监听特定键盘按下
    • .right:右键
  • 鼠标按键修饰符
    • left 左键点击
    • right 右键点击
    • middle 中键点击
  • 键值修饰符
  • v-bind修饰符
    • async
    • prop
    • camel

Vuex

 

使用场景:比如组件间的状态共享:登录状态;组件间的数据共享:购物车数据,登录的token

state数据存放
getters相当于计算属性,可以返回一个值
mutation同步操作,修改数据
action异步操作
modules模块化

原理:vuex实现了一个单项数据流,在全局又有一个state存放数据,当组件要更改state中的数据时,必须通过Mutation进行,Mutation同时提供了订阅者模式供外部插件调用获取state数据的更新。而当所有异步操作(常见于调用后台接口异步获取更新数据)或批量的同步操作需要走Action,但Action也是无法直接修改state的,还是需要通过Mutation来修改state的数据。最后根据state的变化,渲染到视图上。

Vue项目中你是如何解决跨域的呢

  • JSONP
  • CORS
  • Proxy

而在vue项目中,我们主要针对CORSProxy这两种方案进行展开

proxy 在vue.config.js文件,新增以下代码

amodule.exports = {
    devServer: {
        host: '127.0.0.1',
        port: 8084,
        open: true,// vue项目启动时自动打开浏览器
        proxy: {
            '/api': { // '/api'是代理标识,用于告诉node,url前面是/api的就是使用代理的
                target: "http://xxx.xxx.xx.xx:8080", //目标地址,一般是指后台服务器地址
                changeOrigin: true, //是否跨域
                pathRewrite: { // pathRewrite 的作用是把实际Request Url中的'/api'用""代替
                    '^/api': "" 
                }
            }
        }
    }
}

通过axios发送请求中,配置请求的根路径

axios.defaults.baseURL = '/api'

var、let、const之间的区别

  • var声明的变量既是全局变量,存在变量提升,不存在块级作用域,允许重复声明变量
  • let所声明的变量,只在let命令所在的代码块内有效,不存在变量提升,存在块级作用域,同一作用域不允许重复声明变量
  • const声明一个只读的常量,一旦声明,常量的值就不能改变,不存在变量提升,存在块级作用域,同一作用域不允许重复声明变量

ES6新特性

  1.  let: 块级作用域(三个小脾气:在未声明前禁止提前使用该变量,禁止重复声明同名变量,在全局用Let创建的变量,window中也找不到)
  2.  const: 常量; 块级作用域; 一旦声明, 则运行期间无法修改.
  3. 模板字符串(内容中支持换行、动态生成内容的特殊字符串。)
  4.  解构赋值   

         数组解构:从一个大的数组中提取出个别元素单独使用([变量1,变量2,变量3] =数组,数组会自动将相同下标位置的元素值赋值给等号左边相同下标位置的变量)

         对象解构:从一个大的对象中只提取出个别属性值和方法单独使用( {属性名1: 变量1, 属性名2: 变量2, ...} =对象,等号左边相同属性名的变量,会自动获得等号右边对象里相同属性名的属性值)

         参数解构:定义函数时,多个实参值不确定有没有,而且还要求实参值必须传给对应的形参变量,(定义函数时:将形参变量列表,定义在一个对象结构中;调用函数时:实参值列表也必须装扮为对象结构,且属性名必须和定义时使用的属性名一致)

  5.箭头函数: 匿名函数,(即让内部this与外部this保持一致,但是对象的方法和dom中的事件处理函数不能用)

  6. ...扩展对象, 取代 Object.assign()

  7. Promise: 异步编程的一种方案, 可以用来解决 回调地狱

  8. class 面向对象:只要创建一种类型,包含构造函数和原型对象时,都用class代替分开写的构造函数和原型对象

  9. set 和 map

       map映射:也称dictionary字典,一个键值结构,类似于js的对象类型

       set集合:特点为内部元素不重复,会自动去重

  10.for of: 只要遍历下标为数字的东西(索引数组、类数组对象、字符串),都可用for of代替其他遍历方式。(只能返回元素,不能控制遍历的步调和方向)

  11.参数增强:(...定收调打)

           参数默认值(希望一个变量,在函数调用时,即使没有传入实参,也能有默认值使用,在函数定义时,声明默认值)

           剩余参数(rest,箭头函数不支持arguments,在使用箭头函数时,遇到不确定实参值个数的情况下,都用剩余参数语法代替arguments,var 函数名=(固定形参, ...自定义数组名)=>{},自动创建的是一个纯正的数组)

           拆散数组(只要想打散数组,不想替换this,则可以用...语法代替apply,调用函数时:函数名(...数组),常用语法糖:var arr2=[...arr1];var arr3=[...arr1, 元素值1,...arr2, 元素值2 ])

Promise 解决回调地狱

 

JavaScript

封装异步操作并可以获取其成功或失败的结果

promise的三种状态

1.pending: 等待中,或者进行中,表示还没有得到结果
2.resolved(Fulfilled): 已经完成,表示得到了我们想要的结果,可以继续往下执行
3.rejected: 也表示得到结果,但是由于结果并非我们所愿,因此拒绝执行 

Promise.all()  并发处理多个异步任务,所有任务都执行完成才能得到结果

Promise.race()  并发处理多个异步任务,只要有一个任务完成就能得到结果

get和post的区别

  • GET在浏览器回退时是无害的,而POST会再次提交请求。
  • GET产生的URL地址可以被Bookmark,而POST不可以。
  • GET请求会被浏览器主动cache,而POST不会,除非手动设置。
  • GET请求只能进行url编码,而POST支持多种编码方式。
  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  • GET请求在URL中传送的参数是有长度限制的,而POST没有。
  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  • GET参数通过URL传递,POST放在Request body中

 

...全文
160 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
不懂程序的小白 小白 2022-11-19
精选
  • 打赏
  • 举报
回复
1.00元

支持一波

16

社区成员

发帖
与我相关
我的任务
社区描述
再疯狂的梦想,也抵不过程序员一味地坚持...
javascriptvue.jses6 个人社区
社区管理员
  • 木偶☜
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧