vue
- 写出你知道的所有指令
- 什么时候视图不会更新?
//1.操作数组的索引
//2.操作数组的length
//以上两种情况都不会更新视图
- 为什么操作这两个属性不会更新视图?
//原因就是因为Vue2.0底层响应式原理使用了ES5中的Object.defineProperty()这个方法,这个方法有个缺点,缺点就是无法劫持数组,数组的变化是没有办法进行响应
//操作一些数组的方法 比如push pop shift unshift reverse等方法会触发视图的更新,因为vue的底层特别对这几个方法做了hack处理,只要我们调用这些方法也会视图的更新
//Vue3.0的版本,使用的proxy这个方法,这个方法可以劫持数组,就不会出现操作索引和length不更新视图的情况了
- 怎么处理不更新的问题?
//1.不要操作数组的length和索引,如果说硬要操作,可以使用Vue.$set(target,key,value)方法
//2.如果说操作了这些属性,不知道问题在哪里,解决不了视图不更新的情况,我们可以调用强制更新$forceUpdate()
- v-for中有个属性,key,key的作用是什么?
用于区分diff算法的时候,元素的唯一性
//key的值,正常情况下一般都要给一个唯一的值,如果没有一个惟一的情况下,那么可以暂时的使用index来代替
//写项目的时候,后台返回的数据肯定有id,那么这个id就是唯一的标识所以我们一般使用id来作为key的值
- v-model的修饰符 ?
trim lazy number
- V-if v-show的区别 以及使用场景
//v-if 都是用于控制元素/组件的显示和隐藏 值都是布尔值,如果布尔值为true那么元素就会显示,如果为false,那么元素或者组件就会隐藏 v-if元素不显示的时候,dom结构也会一并移除
//v-if可以和v-else v-else-if结合使用,如果v-if布尔值为true,那么不会展示v-else的内容,如果布尔值为false,那么就会展示v-else,而不会展示v-if,两者的关系,就是老死不相往来,互斥
//v-show 都是用于控制元素/组件的显示和隐藏 值都是布尔值,如果布尔值为true那么元素就会显示,如果为false,那么元素或者组件就会隐藏 v-show隐藏元素之后,不会移除dom结构
//使用场景:首次渲染开销较大的时候,可以使用v-if 频繁切换的时候使用v-show
- v-on的修饰符
//prevent 阻止默认事件
//ocne 只调用一次
//native 触发组件根元素的原生事件
- 定义自定义指令的方式,以及自定义指令的钩子函数
//bind
//inserted
//update
- 计算属性的特点?
//1.计算的结果会缓存
//2.根据外界响应式依赖发生变化而变化
- watch和compunted的区别是什么?
//watch的监听函数,只要是监听的属性变化了就会触发,而computed属性的函数,需要在外界响应式依赖的值发生变化的时候才会变化
//computed的结果会缓存
- watch监听的三种情况和写法
普通监听
深度监听
字符串写法
- v-if v-for的优先级
v-for优先级别高
- 全局组件和局部组件创建方式
- 组件的通信方式 写出所有的
- 在组件上使用v-model流程
- 封装组件的流程
- slot具名插槽 插槽作用域
- Mixins合并策略
//1.如果说混入了data属性,那么会对data进行递归合并,冲突的时候,以组件的属性优先
//2.同名的钩子函数会被合并为一个数组,都会进行调用,会以混入对象的钩子函数优先调用
//3.组件选项 比如methods directives components filters...都会被合并为一个对象,冲突的时候,以组件的键值对为主
- $nextTick的作用
- vue生命周期钩子函数 created中能不能修改data 为什么?
- 发送异步请求在哪个钩子?
- 动态添加路由用什么方法?
- beforeDestroy和destroyed一般用来做什么?
- keep-alive的作用以及使用方式 钩子函数 以及两个属性的用法
- 组件相互嵌套,钩子函数的执行顺序是什么?
- 父组件的beforeUpdate触发了会不会触发子组件的beforeUpdate?不会
- 为什么beforeCreate不能发请求? 因为$data都还没初始化,就算获得了后台数据,也不能修改data
- 什么是虚拟dom?通过js模拟真实dom的嵌套,创建踹的结构,就是虚拟dom,在内存中,页面是看不见的,只有添加到页面上才能看见
- 为什么要使用虚拟dom?使用虚拟dom,可以在内存中更新结构,而不是操作真实dom一个一个更新,最大的好处提高页面渲染的性能,结合diff算法 让页面进行高效更新
- Vue响应式的原理是什么?
- 什么是回流 什么是重绘?
- 单页应用优化访问速度
- 触发回流的条件 触发重绘的条件?
- 如何获取路由动态参数
# 回流
1. 位置的改变 translate 定位的left top
2. 元素位置的显示和隐藏也会引起回流
3. 宽高的变化
# 重绘
1. 颜色的变化
2. 字体风格的变化
3. 背景的变化
- 什么是单页应用? 一个项目只有一个html页面 所有的页面跳转依据于路由进行
- 单页应用的有点和缺点? 用户体验好,切换速度快,不需要刷新整个页面
- 怎么解决单页应用缺点的问题? 使用服务端渲染 nuxt
- History hash abstract模式的区别?
1. hash有#号,#号后面的url不会向后端发起请求
2. hash路由使用onhashchange监听 history使用onpopstate监听
3. history使用的是H5的api pushState replaceState
4. 当hash值相同时,不会触发hashchange,history当输入相同的路径的时候,会将浏览器中的地址当成是请求地址向后台发送请求,会造成页面404
5. abstract模式是在没有浏览器api的情况下自动启用,abstract模式在切换页面的时候,路径是不会发生变化的
6. 关键字 onhashchange pushstate replacestate popstate
7.
- 动态路由参数解耦合步骤
- vuex中的state能映射到组件的data中吗?为什么?
- 修改vuex中state唯一的方式是什么?只有mutation中可以修改嘛?哪些方式还可以修改state的状态?
- 组件中的data为什么要写成一个函数?
- 说一下vuex异步的操作流程
- 小程序的分包流程
- 小程序分包的大小
- 小程序路由怎么跳转
- 小程序怎么定义组件
- 小程序怎么发请求,本地存储如何存储
- 小程序如何完成路径的导航? wx.openLocation
其它
说说vue动态权限绑定渲染列表(权限列表渲染)
- 首先请求服务器,获取当前用户的权限数据,比如请求 this.$http.get(“rights/list”);
- 获取到权限数据之后,在列表中使用v-if v-if-else的组合来展示不同的内容
<template>
<div>
<!-- 面包屑导航区 -->
<el-breadcrumb separator-class="el-icon-arrow-right">
<el-breadcrumb-item :to="{ path: '/home' }">首页</el-breadcrumb-item>
<el-breadcrumb-item>权限管理</el-breadcrumb-item>
<el-breadcrumb-item>权限列表</el-breadcrumb-item>
</el-breadcrumb>
<!-- 卡片视图 -->
<el-card>
<el-table :data="rightsList" border stripe>
<el-table-column type="index" label="#"></el-table-column>
<el-table-column label="权限名称" prop="authName"></el-table-column>
<el-table-column label="路径" prop="path"></el-table-column>
<el-table-column label="权限等级" prop="level">
<template slot-scope="scope">
<el-tag v-if="scope.row.level === '0'">一级</el-tag>
<el-tag type="success" v-else-if="scope.row.level === '1'">二级</el-tag>
<el-tag type="danger" v-else>三级</el-tag>
</template>
</el-table-column>
</el-table>
</el-card>
</div>
</template>
<script>
export default {
data() {
return {
// 权限列表
rightsList: []
};
},
created() {
this.getRightsList();
},
methods: {
async getRightsList() {
//获取权限列表数据
const { data: res } = await this.$http.get("rights/list");
if (res.meta.status !== 200) {
return this.$message.error("获取权限列表失败!");
}
this.rightsList = res.data;
}
}
};
</script>
<style lang='less' scoped>
</style>
Vue用的哪种设计模式
属于发布订阅模式,在vue中使用observer和definereactive两个方法的结合对数据进行递归劫持,然后通过watch这个类来对属性进行订阅,Dep类用于解耦合,当数据变更的时候先触发数据的set方法,然后调用Dep.notiify通知视图更新
说说vue操作真实dom性能瓶颈
vue性能瓶颈的几种情况
- 一次渲染大量的数据的时候,存在大量数据并且都是复杂类型的时候,会导致vue对数据的劫持时间和渲染时间变长, js 连续执行时间过长,会导致页面长时间无法交互,而且渲染时间太慢,用户一次交互反馈的时间过长。
化方案:可以使用
requestAnimation
这个方法,将数据进行分割,分批次渲染,减少了 js 的连续运行时间,并且加快了渲染时间,利用加长总运行时间换取了渲染时间,用户既能快速得到反馈,而且不会因为过长时间的 js 运行而无法与页面交互。
- 当页面中存在大量数据,只是修改了一小部分导致页面也会导致页面卡顿,因为vue的更新以组件为粒度进行更新的,只要修改了当前组件中所使用的数据,组件就会整个去进行更新,造成大量的时间浪费
优化方案:将不同的模块划分成不同的组件,这样有效降低虚拟dom的diff运算时间过长的问题,比如将大量数据的模块单独放一个组件,其它放一个组件,由于vue是以组件为粒度更新,修改其它组件的情况下不会导致table的重新diff,提升页面响应速度高达几百倍
- 动态插槽作用域或者静态插槽的更新
使用插槽作用域来替换这两种操作方式,一样能提升性能,因为使用
插槽作用域
之后,插槽内容会被封装到一个函数中,被子组件渲染,而不是在父组件