7.Vue框架

简介: Vue核心原理:数据驱动视图,通过响应式系统实现双向绑定。v-bind用于属性绑定,v-model实现表单双向数据绑定。Vue三要素为响应式、模板解析与渲染。模板经编译生成render函数,返回vnode,结合diff算法高效更新DOM。依托Object.defineProperty监听数据变化,配合Watcher与Dep实现发布订阅模式,数据变化自动触发视图更新。支持组件化开发,vuex集中管理状态,vue-router实现路由控制,整体流程清晰,易于维护与扩展。
  1. v-bind和v-model的区别?
    1
    v-bind用来绑定数据和属性以及表达式,缩写为':'
    2
    v-model使用在表单中,实现双向数据绑定的,在表单元素外使用不起作用
  2. Vue 中三要素的是什么?
    2.1 响应式
    2.2 Vue中如何解析模板?
    2.2.1 模板是什么?
    2.3 render函数?
    2.3.1 with的用法
    2.3.2 render函数的实现机制?
    2.3.3 render函数与vdom?
    2.3.4 vm._c是什么,render函数返回了什么?
    1
    vdom: 使用js模拟DOm结构
    2
    snabbdom: h函数和patch函数 Vue中的v_c:就是相当于snabbdom函数的h函数 patch函数:
    **(问题总结)
    a
    vue模板:字符串,有逻辑,嵌入JS变量……
    b
    模板必须转换为JS代码(有逻辑的,渲染html,js变量)
    c
    render函数是什么样子的
    d
    render函数的执行结果是返回的vnode
    e
    updateComponent
  3. Vue的整个实现流程源码解读???(总结点)
    3.1 解析模板成render函数
    Note

    with函数的使用

    模板中的所有信息都被render函数包含

    模板中用到的data中的属性,都变成了JS变量

    模板中的v-model v-for v-on都变成了JS逻辑

    render函数返回vnode
    3.2 响应式开始监听数据

    Object.defineProperty

    将data的属性代理到vm上
    3.3 首次渲染,显示页面,且绑定依赖
    Note

    初次渲染,执行updateComponent, 执行vm._render()

    执行render函数,会访问到vm.list和vm.title属性

    会被响应式的get方法监听到(Object.defineProperty)

    执行updateComponent, 会执行vdom的patch方法

    patch将vnode渲染成DOM,初次渲染完成
    3.4 为何要监听get, 直接监听set不行吗?
    Note

    data中有很多属性,有些会被用到,有些可能不被用到

    被用到的会走到get, 不被用到的不会走到get

    未走到get中的属性,set的时候我们也无需关心

    避免不必要的重复渲染(关键点)
    3.5 data属性变化,触发rerender函数
    Note

    修改属性,被响应式的set监听到

    set中执行updateComponnet

    updateComponent重新执行vm._render()

    生成的vnode和preVnode, 通过patch进行对比

    渲染到html中去
  4. 说一下从使用jQuery和使用框架的区别?
    1
    数据和视图的分离(代码解耦)---开房封闭原则
    2
    数据驱动视图,只关系数据变化,DOM操作被封装
  5. 说一下对MVVM的理解?
    1
    MVC
    2
    MVVM
    3
    关于ViewModel
  6. Vue中如何实现响应式的呢?
    1
    响应式
    2
    模板引擎
    3
    渲染(首次渲染,后面的渲染)

    Object.defineProperty

    data的属性代理到vm上面(with)
  7. Vue中是如何解析模板的呢?
    1
    模板的本质就是字符串(有逻辑)
    2
    模板必须要转换为JS代码
    3
    render函数的实现(返回的是一个vnode)
    4
    updateComponnet(patch函数)
  8. 说一下Vue的整体实现流程?
    1
    解析模板成为render函数
    2
    响应式开始监听数据
    3
    首次渲染,显示页面,且绑定依赖
    4
    data属性数据发生变化,重新触发惹人的人、函数
  9. vue的数据劫持以及操作数组的坑?
    1
    给data添加新属性的时候vm.$set(vm.info,'newKey','newValue')
    2
    data上面属性值是数组的时候,需要用数组的方法操作数组,而不能通过index或者length属性去操作数组,因为监听不到属性操作的动作。
  10. 谈一下对mvvm和mvc的理解?
    1
    mvc其实是model view Model传统所有逻辑在controller,难以维护。用户输入 => 控制器 => 数据改变,如果数据变了需要获取dom,操作属性,再渲染到视图上。
    2
    mvvm其实是model view viewModel数据变化驱动视图。数据变了,不需要你获取dom,然后改变dom的内容。这边数据变了,vm负责监听,视图那边自动发生变化。最明显的是不需要document.querySelector之类的了。
  11. vm的实质?
    Note
    上面说了vm负责让数据变了,视图能自动发生变化。这么神奇魔术背后的原理是Object.defineProperty。其实就是属性的读取和设置操作都进行了监听,当有这样的操作的时候,进行某种动作。来一个demo玩下。
  12. defineReactive的实现(响应式手写实现)?
    Note
    在浏览器执行的时候,控制台随手也可以obj.name="hua1"类似的操作,发现都监听到了。但是如果更深一步,obj.name={firstname:'hua',lastname:'piaoliang'};obj.name.lastname='o'就不能监听到属性修改了。因为并没有将新的赋值对象监听其属性。所以函数需要改进。
    需要在defineReactive的第一行加上observer(value)。设置值的时候如果是对象的话,也需要将这个对象数据劫持。同理,set那边也需要加这行。
    12.1 基础实现
    12.2 数组方法的劫持
    如果obj.name=[1,2,3];obj.name.push(4)发现又没有通知了,这是因为Object.defineProperty不支持监听数组变化。所以需要重写数组上面的方法。
    12.3 vue 的双向绑定的原理是什么(常考)
    vue.js 是采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty()来劫持各个属性的 setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
    1
    第一步:需要 observe 的数据对象进行递归遍历,包括子属性对象的属性,都加上 setter 和 getter 这样的话,给这个对象的某个值赋值,就会触发 setter,那么就能监听到了数据变化
    2
    第二步:compile 解析模板指令,将模板中的变量替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动,收到通知,更新视图
    3
    第三步:Watcher 订阅者是 Observer 和 Compile 之间通信的桥梁,主要做的事情是:

    在自身实例化时往属性订阅器(dep)里面添加自己

    自身必须有一个 update()方法

    待属性变动 dep.notice()通知时,能调用自身的 update() 方法,并触发 Compile 中绑定的回调,则功成身退。
    4
    第四步:MVVM 作为数据绑定的入口,整合 Observer、Compile 和 Watcher 三者,通过 Observer 来监听自己的 model 数据变化,通过 Compile 来解析编译模板指令,最终利用 Watcher 搭起 Observer 和 Compile 之间的通信桥梁,达到数据变化 -> 视图更新;视图交互变化(input) -> 数据 model 变更的双向绑定效果。
  13. Vue如何监听数组数据变化?
    13.1 vm.$set方法
    因为是一开始就数据劫持了。所以后来如果新绑定属性,是没有数据劫持的。如果需要调用 vm.$set(vm.info,'newKey','newValue'),vm是vue的实例。
    13.2 使用数组的方法
    当属性值是数组,数组变化的时候,跟踪不到变化。因为数组虽然是对象,但是Object.defineProperty不支持数组,所以vue改写了数组的所有方法,当调用数组方法的时候,就调动变动事件。但是不能通过属性或者索引控制数组,比如length,index。
    Note
    总结:data上,绑定所有属性避免后期加新属性。如果是数组,只能通过数组方法修改数组。如下例子,控制台vm.arr--发现视图并不会变化,vm.arr.push(4)就能变化
  14. vue 的优点和缺点是什么?
    14.1 优点
    1
    低耦合。视图(View)可以独立于 Model 变化和修改,一个 ViewModel 可以绑定到不同的"View"上,当 View 变化的时候 Model 可以不变,当 Model 变化的时候 View 也可以不变。
    2
    可重用性。你可以把一些视图逻辑放在一个 ViewModel 里面,让很多 view 重用这段视图逻辑。
    3
    独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用 Expression Blend 可以很容易设计界面并生成 xml 代码。
    4
    可测试。界面素来是比较难于测试的,而现在测试可以针对 ViewModel 来写。
    14.2 缺点(面试常考)
    1
    网站SEO问题
    2
    浏览器兼容性问题
    3
    海量数据节点的渲染问题
  15. 请详细说下你对 vue 生命周期的理解?
    总共分为 8 个阶段创建前/后,载入前/后,更新前/后,销毁前/后。
    1
    创建前/后: 在 beforeCreate 阶段,vue 实例的挂载元素 el 还没有, created阶段。
    2
    载入前/后:在 beforeMount 阶段,vue 实例的$el 和 data 都初始化了,但还是挂载之前为虚拟的 dom 节点,data.message 还未替换。在 mounted 阶段,vue 实例挂载完成,data.message 成功渲染。
    3
    更新前/后:当 data 变化时,会触发beforeUpdate 和 updated方法。
    4
    销毁前/后:在执行 destroy 方法后,对 data 的改变不会再触发周期函数,说明此时 vue 实例已经解除了事件监听以及和 dom 的绑定,但是 dom 结构依然存在
  16. Vue组件之间的传值?
    16.1. 父组件与子组件传值
    16.2 子组件向父组件传递数据
  17. Vue路由相关问题
    17.1 active-class 是哪个组件的属性?
    vue-router 模块的 router-link 组件。
    17.2 嵌套路由怎么定义?
    在实际项目中我们会碰到多层嵌套的组件组合而成,但是我们如何实现嵌套路由呢?因此我们需要在 VueRouter 的参数中使用 children 配置,这样就可以很好的实现路由嵌套。 index.html,只有一个路由出口
    main.js,路由的重定向,就会在页面一加载的时候,就会将 home 组件显示出来,因为重定向指向了 home 组件,redirect 的指向与 path 的必须一致。children 里面是子路由,当然子路由里面还可以继续嵌套子路由。
    home.vue,点击显示就会将子路由显示在出来,子路由的出口必须在父路由里面,否则子路由无法显示。
    17.3 路由之间跳转?

    声明式(标签跳转)

    编程式( js 跳转) router.push('index')
    17.4 懒加载(按需加载路由)(常考)
    webpack 中提供了 require.ensure()来实现按需加载。以前引入路由是通过 import 这样的方式引入,改为 const 定义的方式进行引入。
    17.4.1 不进行页面按需加载引入方式
    17.4.2 进行页面按需加载的引入方式
    17.5 vue-router 有哪几种导航钩子?
    1
    全局导航钩子

    router.beforeEach(to, from, next),

    router.beforeResolve(to, from, next),

    router.afterEach(to, from ,next)
    2
    组件内钩子

    beforeRouteEnter,

    beforeRouteUpdate,

    beforeRouteLeave
    3
    单独路由独享组件

    beforeEnter
  18. Vux相关问题
    18.1 vuex 是什么?怎么使用?哪种功能场景使用它?
    vue 框架中状态管理。在 main.js 引入 store,注入。新建了一个目录 store,….. export 。场景有:单页应用中,组件之间的状态。音乐播放、登录状态、加入购物车
    18.2 vuex 有哪几种属性?
    有 5 种,分别是 state、getter、mutation、action、module
    18.3 vuex 的 store 特性是什么

    vuex 就是一个仓库,仓库里放了很多对象。其中 state 就是数据源存放地,对应于一般 vue 对象里面的 data

    state 里面存放的数据是响应式的,vue 组件从 store 读取数据,若是 store 中的数据发生改变,依赖这相数据的组件也会发生更新

    它通过 mapState 把全局的 state 和 getters 映射到当前组件的 computed 计算属性
    18.4 vuex 的 getter 特性是什么

    getter 可以对 state 进行计算操作,它就是 store 的计算属性

    虽然在组件内也可以做计算属性,但是 getters 可以在多给件之间复用

    如果一个状态只在一个组件内使用,是可以不用 getters
    18.5 vuex 的 mutation 特性是什么

    action 类似于 muation, 不同在于:action 提交的是 mutation,而不是直接变更状态

    action 可以包含任意异步操作
    18.6 vue 中 ajax 请求代码应该写在组件的 methods 中还是 vuex 的 action 中
    如果请求来的数据不是要被其他组件公用,仅仅在请求的组件内使用,就不需要放入 vuex 的 state 里
    如果被其他地方复用,请将请求放入 action 里,方便复用,并包装成 promise 返回
    18.7 不用 vuex 会带来什么问题

    可维护性会下降,你要修改数据,你得维护 3 个地方

    可读性下降,因为一个组件里的数据,你根本就看不出来是从哪里来的

    增加耦合,大量的上传派发,会让耦合性大大的增加,本来 Vue 用 Component 就是为了减少耦合,现在这么用,和组件化的初衷相背
    18.8 vuex 原理
    vuex 仅仅是作为 vue 的一个插件而存在,不像 Redux,MobX 等库可以应用于所有框架,vuex 只能使用在 vue 上,很大的程度是因为其高度依赖于 vue 的 computed 依赖检测系统以及其插件系统,
    vuex 整体思想诞生于 flux,可其的实现方式完完全全的使用了 vue 自身的响应式设计,依赖监听、依赖收集都属于 vue 对对象 Property set get 方法的代理劫持。最后一句话结束 vuex 工作原理,vuex 中的 store 本质就是没有 template 的隐藏着的 vue 组件;
    18.9 扩展问题
    18.9.1 使用 Vuex 只需执行 Vue.use(Vuex),并在 Vue 的配置中传入一个 store 对象的示例,store 是如何实现注入的?
    美团
    Vue.use(Vuex) 方法执行的是 install 方法,它实现了 Vue 实例对象的 init 方法封装和注入,使传入的 store 对象被设置到 Vue 上下文环境的$store 中。因此在 Vue Component 任意地方都能够通过 this.$store 访问到该 store。
    18.9.2 state 内部支持模块配置和模块嵌套,如何实现的?
    美团
    在 store 构造方法中有 makeLocalContext 方法,所有 module 都会有一个 local context,根据配置时的 path 进行匹配。所以执行如 dispatch('submitOrder', payload)这类 action 时,默认的拿到都是 module 的 local state,如果要访问最外层或者是其他 module 的 state,只能从 rootState 按照 path 路径逐步进行访问。
    18.9.3 在执行 dispatch 触发 action(commit 同理)的时候,只需传入(type, payload),action 执行函数中第一个参数 store 从哪里获取的?
    美团
    store 初始化时,所有配置的 action 和 mutation 以及 getters 均被封装过。在执行如 dispatch('submitOrder', payload)的时候,actions 中 type 为 submitOrder 的所有处理方法都是被封装后的,其第一个参数为当前的 store 对象,所以能够获取到 { dispatch, commit, state, rootState } 等数据。
    18.9.4 Vuex 如何区分 state 是外部直接修改,还是通过 mutation 方法修改的?
    美团
    Vuex 中修改 state 的唯一渠道就是执行 commit('xx', payload) 方法,其底层通过执行 this._withCommit(fn) 设置_committing 标志变量为 true,然后才能修改 state,修改完毕还需要还原_committing 变量。外部修改虽然能够直接修改 state,但是并没有修改_committing 标志位,所以只要 watch 一下 state,state change 时判断是否_committing 值为 true,即可判断修改的合法性。
    18.9.5 调试时的"时空穿梭"功能是如何实现的?
    美团
    devtoolPlugin 中提供了此功能。因为 dev 模式下所有的 state change 都会被记录下来,'时空穿梭' 功能其实就是将当前的 state 替换为记录中某个时刻的 state 状态,利用 store.replaceState(targetState) 方法将执行 this._vm.state = state 实现。
  19. 指令相关
    19.1 自定义指令(v-check, v-focus) 的方法有哪些? 它有哪些钩子函数? 还有哪些钩子函数参数

    全局定义指令:在 vue 对象的 directive 方法里面有两个参数, 一个是指令名称, 另一个是函数。

    组件内定义指令:directives

    钩子函数: bind(绑定事件出发)、inserted(节点插入时候触发)、update(组件内相关更新)

    钩子函数参数: el、binding
    19.2 说出至少 4 种 vue 当中的指令和它的用法
    v-if(判断是否隐藏)、v-for(把数据遍历出来)、v-bind(绑定属性)、v-model(实现双向绑定)
  20. axios
    20.1 axios 是什么?怎么使用?描述使用它实现登录功能的流程
    Note
    思路:使用Vue的router.beforeEach钩子函数结合axios的拦截器功能来实现。
    20.2 axios与ajax, fetch的区别和优缺点?

    参考文章:https://blog.csdn.net/qq_36407875/article/details/846420600
相关文章
|
7月前
|
存储 负载均衡 Java
第九章 SpringCloud框架
Nacos实现服务注册与发现,支持心跳检测、负载均衡及配置管理;Eureka功能类似但仅限注册中心。两者均支持AP模式集群,而Nacos提供更灵活的分级存储模型。OpenFeign结合LoadBalancer实现服务调用,Sentinel用于限流熔断,Gateway则通过路由断言与过滤器实现请求路由、鉴权、限流等网关功能。
157 0
|
7月前
|
存储 人工智能 JSON
Agent系统
大模型Agent是具备自主规划、推理、工具调用与记忆能力的智能系统,能分解任务、反思调整并持续交互。核心架构含大脑(LLM)、感知、行动与记忆模块,支持函数调用与多Agent协作,广泛应用于复杂任务场景,区别于传统Chatbot,更具主动性与执行力。
301 0
|
7月前
|
缓存 算法 C++
模型推理加速
大模型推理加速关键技术包括KV-Cache优化、连续批处理、投机解码与模型并行等,涵盖算法、系统与硬件协同优化。vLLM等框架通过PagedAttention提升效率,助力高并发、低延迟场景落地。
409 0
|
7月前
|
自然语言处理
主流大模型结构
本文系统梳理主流大模型架构:Encoder-Decoder(如T5)、Decoder-Only(如GPT)、Encoder-Only(如BERT)和Prefix-Decoder(如GLM),详解GPT、LLaMA及中文模型发展,对比参数、上下文与特性,助力理解架构差异与选型策略,涵盖面试核心要点。
580 0
|
7月前
|
机器学习/深度学习 算法 关系型数据库
强化学习
强化学习(RL)是一种通过智能体与环境交互来学习最优策略的机器学习方法,核心是最大化长期累积奖励。其关键概念包括状态、动作、奖励、策略与价值函数,依赖试错和延迟奖励机制。常用方法有基于值的Q-learning、基于策略的Policy Gradient,以及结合两者的Actor-Critic框架。PPO、DPO等算法在实际中广泛应用,尤其在RLHF中优化语言模型。该领域持续发展,追求高效、稳定与实用的决策智能。
605 0
|
7月前
|
机器学习/深度学习 缓存 关系型数据库
注意力机制详解
注意力机制是Transformer核心,实现动态关注关键信息。包括自注意力、交叉注意力、多头、分组、多查询及潜在注意力等类型,各有优势与权衡,广泛应用于序列建模、多模态融合等场景,是大模型设计与面试考察重点。
349 0
|
7月前
|
机器学习/深度学习 存储 数据采集
高频面试题汇总
本文系统梳理大模型核心技术,涵盖Transformer自注意力机制、多头注意力、位置编码原理,详解LLaMA与GPT架构差异,解析LoRA、ZeRO优化策略,介绍FlashAttention内存优化,并提供显存与训练时间估算方法,覆盖训练、推理、部署全流程关键技术点。
1163 0
|
7月前
|
存储 机器学习/深度学习 编解码
预训练技巧
预训练是大模型能力的核心,涵盖混合精度、分布式训练等关键技术。混合精度通过FP16/BF16加速计算并节省显存;分布式训练采用数据、模型、流水线并行提升效率,结合All-Reduce等通信策略实现高效同步;DeepSpeed的ZeRO技术分区优化器状态、梯度与参数,显著降低显存占用;FlashAttention优化注意力机制,提升速度与内存效率;学习率策略如warmup与余弦退火助力稳定收敛。
523 0
|
7月前
|
存储 人工智能 NoSQL
RAG技术
RAG(检索增强生成)通过结合外部知识库与大模型,提升回答准确性,缓解知识过时与幻觉问题。核心架构含检索器、生成器与向量数据库,支持密集、混合检索,常用FAISS、Pinecone等工具,广泛应用于问答系统与AI面试场景。(238字)
245 0
|
7月前
|
机器学习/深度学习 存储 知识图谱
知识蒸馏
知识蒸馏是一种模型压缩技术,通过将大模型(教师)的知识迁移到小模型(学生)中,在降低计算成本的同时提升小模型性能。核心思想是让学生模仿教师的输出分布或中间特征。常用方法包括基于软标签的Hinton蒸馏(引入温度提升泛化信息)、特征蒸馏(对齐中间层表示)。按信息访问程度分为黑盒(仅输出)与白盒(含内部结构)。广泛用于加速推理与模型轻量化。
377 0