zoukankan      html  css  js  c++  java
  • vue面试题(一)

    1=>为什么data是一个函数

    每复用一次组件,就会返回一分新的data。
    也就说:【每个组件实例创建】一个【私有】的数据空间。各个组件维护各自的数据。
    如果单纯的写成对象形式,那么所有组件实例共用了一份data.
    就会造成一个发生改变,全部都会发生改变。  
    data(){
        return{ }
     }
    

    3=> vue的生命周期 8+2 ok

    我们都知道vue常用的8个生命周期,但是这几个生命周期你熟悉吗?
    activated keep-alive 专属,组件被激活时调用 [ai k t v ti de], 第一次进入也会触发activated  
    deactivated keep-alive 专属,组件被销毁时调用 【di ai k t v ti de】
    

    4=> 怎样理解 Vue 的单项数据流 ok

    数据总是从父组件传到子组件,
    子组件没有权利修改父组件传过来的数据,[如果你强行更改,vue会有红色的警告,告诉你这个是单向的]
    只能请求父组件对原始数据进行修改。
    
    这样会防止从子组件意外改变父组件的状态,
    从而导致你的应用的数据流向难以理解。
    

    5=> v-if 和 v-for 为什么不建议一起使用 ok

    vue2中先解析v-for然后在解析v-if,[会造成消耗性能]
    如果遇到需要同时使用时可以嵌套一层元素  
    <template></template>
    

    6 template 的作用

    template的作用是模板占位符,可帮助我们包裹元素.
    但在循环过程当中,template不会被渲染到页面上
    
    template标签不支持v-show指令,
    即v-show="false"对template标签来说不起作用。
    template标签支持v-if、v-else-if、v-else、v-for这些指令。
    

    6.1=> vue3 v-for和v-if做了更改

    很幸运 vue 3.x 中, v-if 总是优先于 v-for。
    

    07==> Vue的父子组件生命周期钩子函数执行顺序 ok

    加载渲染过程
    父beforeCreate -> 父created -> 父beforeMount ->
    ->子beforeCreate -> 子created -> 子beforeMount -> 子mounted -> 父mounted
    【你可以理解页面渲染,这样就好理解了】
    
    子组件更新过程
    父beforeUpdate -> 子beforeUpdate -> 子updated -> 父updated
    
    父组件更新过程
    父beforeUpdate -> 父updated
    
    销毁过程
    父beforeDestroy -> 子beforeDestroy -> 子destroyed -> 父destroyed
    

    8. 虚拟DOM是什么?有什么优缺点?

    由于在浏览器中频繁操作DOM代价是很昂贵的。会产生一定性能问题。这就是虚拟Dom的产生原因。
    
    Vue2的Virtual DOM 借鉴了开源库 snabbdom 的实现。
    Virtual DOM本质就是用一个[原生的JS对象]去[描述]一个[DOM节点],是对真实DOM的一层抽象。
    上面这一句话就翻译为代码 就是
    <div>
     <p>123</p>
    </div>
    对应的virtual DOM(伪代码):
    var Vnode = {
     tag: 'div',
     children: [
      { tag: 'p', text: '123' }
     ]
    };
    
    优点:
    1、保证性能下限:虽然它的性能并不是最优的;
    但是比起粗暴的DOM操作,还有不错的性能,
    
    2、无需手动操作DOM:我们不需手动去操作DOM,只需要写好代码逻辑,
    框架会【根据虚拟DOM】和【数据双向绑定】,
    帮我们自动更新视图,提高我们的开发效率。
    
    3、跨平台:虚拟DOM可以进行更方便地跨平台操作,
    
    缺点:
    1、无法进行极致优化:虽然虚拟DOM + 合理的优化,足以应对大部分应用的性能需要,
    但在一些【性能要求极高】的应用中虚拟DOM无法没满足。
    2、首次渲染大量DOM时,由于多了一层DOM计算,会比innerHTML插入慢。
    

    明天继续-----------------------------------------------------------------------------------------------------------------------

    1=> Vue3.0 和 2.0 的【响应式原理】区别

    Vue3.x 改用 Proxy[pu luo k she] 替代 Object.defineProperty[di fai n prɒ pə ti]。
    
    因为 Proxy 可以直接监听对象和数组的变化,
    而Object.defineProperty是不可以直接对【数组】进行监听
    Vue2 中修改数组的索引和长度无法被监控到。
    对象新增的属性无法被Object.defineProperty监听到
    

    2=> Vuex 页面刷新数据丢失怎么解决?

    在刷新页面的时候,将vuex中的只存在本地
    也可以使用第三方插件。  vuex-persist (pəˈsɪ s t])插件,
    它是为 Vuex 持久化储存而生的一个插件。
    

    3 你都做过哪些 Vue 的性能优化?

    语法方面:
    v-if 和 v-show 区分使用场景
    computed 和 watch 区分场景使用
    v-for 遍历必须加 key,key最好是id值,且避免同时使用 v-if
    
    //数据方面
    对象层级不要过深,否则性能就会差。
    不需要响应式的数据不要放在 data 中(可以使用 Object.freeze() 冻结数据)
    
    // 加载-缓存
    路由懒加载
    第三方插件的按需加载
    适当采用 keep-alive 缓存组件
    防抖、节流的运用
    

    4 Vue.mixin 的使用场景和原理

    在开发的过程中我们会遇见相同或者相似的逻辑代码。
    可以通过vue的 mixin 功能抽离公共的业务逻辑,
    然后通过impor再组件中引入。通过mixins注册进来。
    这样我们就可以使用mixin中共同的业务逻辑
    
    <script>
    import { mixinmethods} from "../mixin.js"
        export default {
            // mixins是固定的,里面传入一个数组
            mixins:[mixinmethods]
        }
    </script>
    
    如果组件中data数据与混合中的数据重复,会进行合并。使用data中的数据。
    【组件中是可以直接使用混合中的数据的,自己理解】
    需要注意的是:声明周期不会进行合并
    如果你在混合中使用了生命周期,组件中也是用生命周期。
    组件和混合中的生命周期都会被执行。
    

    5. nextTick 使用场景和原理

    场景:进行tab切换的时候,当显示A组件的时候。
    A组件的input自动聚焦。这个时候获取A组件的input实例就会出现undefiend
    
    为什么会出现undefined?
    Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新。
    
    原理:
    nextTick 将回调延迟到下次 DOM 更新循环之后执行
    

    6、 keep-alive 使用场景和原理

    keep-alive 是 Vue 内置的一个组件,可以实现组件缓存,当组件切换时不会对当前组件进行卸载。
    常用的两个属性 include/exclude,符合条件的组件或者页面进行缓存。 [include 是页面中的name ]
    include的类型可以是字符串,数组,正则。
    
    两个生命周期 activated/deactivated,用来得知当前组件是否处理活跃状态。
    keep-alive 运用了 LRU 算法,选择最近【久未使用的组件】予以淘汰。
    keep-alive其实还有一个属性max, 最大允许缓存多少个,如果超出最大个数。
    会将已缓存组件中最久没有被访问的实例会被销毁掉。
    
    [exs k lu d] exclude 排除
    

    7、Vue.set 方法原理

    在两种情况下修改 Vue 是不会触发视图更新的。 
    1、给响应式对象新增属性,这个时候是不会跟新视图的
    2、直接更改【数组下标】来修改数组的值。
    
    我们可以通过 Vue.set(this.userInfo, 'sex' ,'男') 
    或者 this.$forceUpdate() 来解决这个问题
    
    set 原理如下
    因为是响应式数据,
    我们给对象和数组本身新增了__ob__属性,代表的是 Observer【饿 b zɜ və(r)】 实例。
    如对象新增不存在的属性,首先会把新的属性进行响应式跟踪。
    当数据发生变化后,watcher【ˈwɑːtʃər]】 去更新视图.
    【使用splice方法向数组内添加元素时】该元素会自动被变成响应式的
    源码:https://blog.csdn.net/leelxp/article/details/107212555
    

    8 assets 和static【不会打包】的区别

    答:相同点:assets【a sai s 】和static两个都是存放静态资源文件,
    图片,字体图标,都可以放在这两个文件下。
    
    不相同点:
    build的时候会将assets中放置的静态资源文件【会进行】打包压缩上传.
    最终会放置在static中跟着index.html一同上传至服务器。
    
    static中放置的静态资源文件就【不会】打包压缩
    
    建议:将项目中样式文件js文件等都可以放置在assets中,
    走打包这一流程。减少体积。
    而项目中引入的第三方的资源文件如iconfoont.css等文件可以放置在static中,
    因为这些引入的第三方文件已经经过处理,我们不再需要处理,直接上传。
    
    巧计:听读音, assets 有压缩。
    

    明天继续看----------------------------------------------------------------------------------------------

    1 .vue的两个核心点

    答:数据驱动、组件系统
    数据驱动:保证数据和视图的一致性。
    组件系统:页面中的所有模块可以看作全部是由[组件树]构成的。
    

    2. vue-router 有哪几种导航钩子?

    答:三种,
    第一种:是全局导航钩子:
    router.beforeEach(to,from,next){}
    router.afterEach(to,from,next){} 
    作用:跳转前进行判断拦截。 2个
    
    第二种:组件内的钩子   
    beforeRouteEnter (to, from, next) { }
    beforeRouteLeave(to, from, next){ }
    
    第三种:单独路由独享钩子
    beforEnter:(to, form,next) => { 
    	
    }
    

    3. $route 和 $router 的区别

    答:$router是VueRouter的实例,{可以导航到不同的URL,使用$router.push方法。}
    返回上一个历史用$router.go(-1) 或者 $router.back()
    
    $route为当前router跳转对象。里面可以获取当前路由的name,path,parmas等。
    

    4.vue初始化页面闪动问题

    有些时候看到类似于{{message}}的字样,
    虽然一般情况下这个时间很短暂,但是我们还是有必要让解决这个问题的。
    首先在css里加上
    [v-cloak] { [k ləʊ k][掩盖]
    	display: none; 
    }
    如果没有彻底解决问题,则在根元素加上:style="{display: 'block'}"
    
    还有一种方法:使用v-text来解决
    

    5. Vue2中注册在router-link上事件click无效解决方法

    使用@click.native。原因:router-link会阻止click事件,.native指直接监听一个原生事件。
    在vue3中native被移除了
    

    6. Vue里面router-link在电脑上有用,在安卓上没反应怎么解决?

    答:Vue路由在Android机上有问题。
    【通过工具查看一下该标签是否被正确解析了,如果没有使用使用一些插件来进行解决】babel问题,
    

    7. vue-loader是什么?使用它的用途有哪些?

    答:vue文件的一个加载器,将template/js/style转换成js模块
    

    8. 说说你对 SPA 单页面的理解,它的优缺点分别是什么?

    1.用户体验好、快,内容的改变不需要重新加载整个页面。
    2.SPA 相对对服务器压力小;
    
    缺点:
    初次加载耗时多:因为要在加载页面的时候将 JavaScript、CSS 统一加载,
    SEO 难度较大:由于所有的内容都在一个页面中动态替换显示,所以在 SEO 上其有着天然的弱势。
    

    9 vue常用的修饰符 【没有理解】

    .stop等同于JavaScript中的event.stopPropagation(),防止事件冒泡;
    .prevent:等同于JavaScript中的event.preventDefault(),防止执行预设的行为(如果事件可取消,则取消该事件,而不停止事件的进一步传播);
    .capture:与事件冒泡的方向相反,事件捕获由外到内;
    .self:只会触发自己范围内的事件,不包含子元素;
    .once:只会触发一次
    

    10. Proxy 与 Object.defineProperty 优劣对比

    Proxy 的优势如下:
    Proxy 可以直接监听对象而非属性;
    Proxy 可以直接监听数组的变化;
    Proxy 有多达 13 种拦截方法,不限于 apply、ownKeys、deleteProperty、has 等等是 Object.defineProperty 不具备的;
    Proxy 返回的是一个新对象,我们可以只操作新的对象达到目的,而 Object.defineProperty 只能遍历对象属性直接修改;
    Proxy 作为新标准将受到浏览器厂商重点持续的性能优化,也就是传说中的新标准的性能红利;
    
    Object.defineProperty 的优势如下:
    兼容性好,支持 IE9,
    而 Proxy 的存在浏览器兼容性问题,而且无法用 polyfill 磨平,
    因此 Vue 的作者才声明需要等到下个大版本( 3.0 )才能用 Proxy 重写。
    

    11 vue的自定义指令

    和css样式有关的操作 放在bind函数中
    bind: function (el) {},
    
    和js行为有关的操作  可以写在inserted()这个函数中去
    inserted: function (el) {  el.focus() },
    
    updated(el) {
    	//当v-model跟新的时候,就会执行这个函数  这个函数会执行多次  
    },
    
    el->表示被绑定了指令的那个元素,这个el是一个原生的js对象
    运用的场景:绑定按钮权限的时候,我就使用了 自定义指令
    

    =明天继续看==

    1.v-show 与 v-if 有什么区别?ok+

    v-if 是真正的条件渲染,也是惰性的;
    如果在初始渲染时条件为假,则什么也不做——
    直到[条件第一次变为真]时,才会开始渲染
    
    v-show 不管初始条件是什么,元素总是会被渲染.
    并且只是简单地基于 CSS 的 “display” 属性进行切换。
    
    频繁切换使用v-show, 切换较少使用v-if
    

    2.computed 和 watch 的区别和运用的场景?ok

    computed: 是计算属性,computed 的值有缓存。
    只有它[依赖的属性值]发生改变,computed 的值时才会重新计算。
    
    watch: 更多的是「观察」的作用,类似于某些[数据的监听回调]。
    每当监听的数据变化时,都会执行回调,进行后续操作。
    
    场景:
    {form表单中的input都必须有有值, 按钮才能够进行点击 我们就可以使用computed  }
    当我们需要在数据变化时【执行异步】或【开销较大】的操作时,应该使用 watch
    

    3. v-model 的原理?ok

    v-model 在内部为不同的输入元素[使用不同的属性]并[抛出不同]的事件:
    text 和 textarea 元素使用 value 属性和 input 事件;
    checkbox 和 radio 使用 checked 属性和 change 事件;
    select 字段将 value 作为 prop 并将 change 作为事件。
    

    4. vue-router 路由模式有几种? ok

    vue-router 有 3 种路由模式:hash、history、abstract,对应的源码如下所示:
    hash: 使用 hash 值来作路由。支持所有浏览器。
    history : 有些浏览器不支持
    abstract : [ æ bˈstræ k t] 支持所有 JavaScript 运行环境,如 Node.js 服务器端。
    如果发现没有浏览器的 API,路由【会自动强制进入】这个模式.
    

    6. 虚拟 DOM 实现原理?

    虚拟 DOM 的实现原理主要包括以下 3 部分:
    1.用一个[原生的JS对象]去[描述]一个[DOM节点],是对真实DOM的一层抽象。
    2.diff 算法 — 比较两棵虚拟 DOM 树的差异;【dif算法比较两颗树直接的差异】
    3.pach 【帕其】算法 — 将两【个虚拟DOM对象的差异】应用到【真正的 DOM 树】。
    

    7、Vue 中的 key 有什么作用? ok

    key 是 Vue中vnode的唯一标记,通过这个key,我们的diff操作可以更准确、更快速。
    
    2.更准确表现在sameNode函数 a.key === b.key 对比中可以避免就地复用的情况。所以会更加准确。
    (我的理解:通过 sameNode函数对比key值,避免了就地复用的情况,所以会更加的准确)
    
    3.更快速:利用key的唯一性生成map对象,来获取对应节点,比遍历方式更快。
    

    8. key的实际运用场景

    1.处理勾选时候的bug。 比如列表中有 【A,B,C】
    我们勾选B,向列表中添加D,列表是[D,A,B,C]此时却勾选了A
    
    2.key值应该是唯一的。最后使用id值。
    为什么使用id值,而不是index
    

    本文的地址 :https://juejin.cn/post/6844903918753808398#heading-22
    地址来源:https://zhuanlan.zhihu.com/p/92407628
    本文的源地址:https://www.cnblogs.com/wenshaochang123/p/14888494.html
    本文的源地址:https://www.jianshu.com/p/38f38f61b557

    继续=================================================================

    1.Vue是什么?(了解就可以)

    1.是一套用于构建用户界面的渐进式框架,自底向上逐层应用。
    2.vue核心只关注视图层,不仅容易上手,而且方便与第三方库整合。
    3.当与现代化的工具以及各种支持类库结合使用时,完全能够为复杂的单页应用提供驱动。
    

    2.Vue的优点 (了解)

    1.开发者:只关注视图,简单易学,
    2.双向数据绑定,操作数据简单
    3.组件化,构建单页面有优势
    4.视图数据分离,使用数据更方便
    5.虚拟DOM+diff算法,提高页面的渲染速度
    

    3.watch的使用

    watch: {
        firstName(newName, oldName) {
          // newName 是新值,oldName旧值
        },
        immediate: true,
    } 
    immediate: 立即监视, deep : 深度监视 
    

    4.常用的事件修饰符

    .stop ==> event.stopPropagation() 阻止事件冒泡
    .prevent ==> event.preventDefault() 取消默认事件,不停止传播
    .capture ==> 事件捕获
    .self ==> 只触发自己范围内的事件, 不包含子元素
    .once ==> 只会触发一次
    

    5.你对slot的理解

    slot是 vue 内容分发机制,插槽是子组件的一个模板标签。
    这个标签由父组件决定,有默认插槽,具名插槽和作用域插槽。
    默认:匿名插槽,直接在组件送写slot。一个组件只能有一个匿名
    具名:带有名字的插槽,slot name='xxx'可以有多个。
    作用域: 可以有名字也可以无,不同点,在子组件渲染时,
    可以将子组件内部的数据传递给父组件,父组件根据子组件的数据决定如何渲染
    

    6.Vue模版编译原理

    解析阶段:对 template 字符串解析,将标签,指令,属性转为抽象语法树 AST
    优化阶段:遍历 AST 找其中的静态节点进行标记,方便在重新渲染的时候进行 diff 比较时 ,跳过一些静态节点
    生成阶段:将 AST 转为 render函数字符串
    

    遇见问题,这是你成长的机会,如果你能够解决,这就是收获。

    作者:明月人倚楼
    出处:https://www.cnblogs.com/IwishIcould/

    想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,或者关注博主,在此感谢!

    万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!

    想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

    支付宝
    微信
    本文版权归作者所有,欢迎转载,未经作者同意须保留此段声明,在文章页面明显位置给出原文连接
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    bzoj 1257: [CQOI2007]余数之和sum 数论
    codevs 1063 合并果子 STL 优先队列
    HTTP错误code大全
    URL中的特殊字符处理笔记
    单例中懒汉和饿汉的本质区别
    关于静态方法的使用方式
    111
    WebService 简单安全验证
    WebService安全解决方案—简单握手协议
    RESTEasy使用json返回的例子
  • 原文地址:https://www.cnblogs.com/IwishIcould/p/15659118.html
Copyright © 2011-2022 走看看