网站改版 影响网站 工信部备案 收回

张小明 2025/12/27 23:16:18
网站改版 影响,网站 工信部备案 收回,淘宝网站网页图片怎么做,响应式框架Vue常见面试题 Vue的优点说说你对SPA单页面的理解#xff0c;它的优缺点分别是什么#xff1f;SPA首屏加载速度慢的怎么解决#xff1f;Vue初始化过程中#xff08;new Vue(options)#xff09;都做了什么#xff1f;对MVVM的理解#xff1f;Vue数据双向绑定原理Vue的响…Vue常见面试题Vue的优点说说你对SPA单页面的理解它的优缺点分别是什么SPA首屏加载速度慢的怎么解决Vue初始化过程中new Vue(options)都做了什么对MVVM的理解Vue数据双向绑定原理Vue的响应式原理Vue3.x响应式数据原理Vue3.0 里为什么要用 Proxy API替代 defineProperty APIProxy 与 Object.defineProperty 优劣对比vue中组件的data为什么是一个函数而new Vue 实例里data 可以直接是一个对象vue中data的属性可以和methods中方法同名吗为什么vue中created与mounted区别Vue中computed与method的区别虚拟DOM中key的作用用index作为key可能会引发的问题Vue中watch用法详解vue中对mixins的理解和使用vue中的插槽为什么vue采用异步渲染Vue 的异步更新机制是如何实现的$nextTick的理解Vue中常用的一些指令vue的自定义指令你有写过自定义指令吗自定义指令的应用场景有哪些v-show和v-if指令的共同点和不同点为什么避免v-if和v-for一起使用vue为什么在 HTML 中监听事件Vue.set 改变数组和对象中的属性vm.$set(obj, key, val) 做了什么说说vue的生命周期的理解第一次页面加载会触发哪几个钩子Vue组件通信有哪些方式router和route的区别vue-router有几种钩子函数vue-router路由跳转方式vue-router路由传参keep-alive了解吗Vuex是什么怎么使用什么情况下使用 VuexVuex和单纯的全局对象有什么区别为什么 Vuex 的 mutation 中不能做异步操作axios 是什么其特点和常用语法对SSR有了解吗它主要解决什么问题Vue要做权限管理该怎么做控制到按钮级别的权限怎么做Vue项目前端开发环境请求服务器接口跨域问题做过哪些Vue的性能优化Vue3有了解过吗能说说跟Vue2的区别吗Vue 3.0 所采用的 Composition Api 与 Vue 2.x使用的Options Api 有什么区别element-ui中遇到的问题Vue的优点轻量级框架只关注视图层是一个构建数据的视图集合大小只有几十 kb 简单易学国人开发中文文档不存在语言障碍 易于理解和学习双向数据绑定保留了 angular 的特点在数据操作方面更为简单组件化保留了 react 的优点实现了 html 的封装和重用在构建单页面应用方面有着独特的优势视图数据结构分离使数据的更改更为简单不需要进行逻辑代码的修改只需要操作数据就能完成相关操作虚拟DOMdom 操作是非常耗费性能的 不再使用原生的 dom 操作节点极大解放 dom 操作但具体操作的还是 dom 不过是换了另一种方式运行速度更快相比较于 react 而言同样是操作虚拟 dom 就性能而言 vue 存在很大的优势。说说你对SPA单页面的理解它的优缺点分别是什么是什么SPA single page application 仅在 Web 页面初始化时加载相应的 HTML、JavaScript 和 CSS。一旦页面加载完成SPA 不会因为用户的操作而进行页面的重新加载或跳转而页面的变化是利用路由机制实现 HTML 内容的变换避免页面的重新加载。优点用户体验好内容的改变不需要重新加载整个页面避免了不必要的跳转和重复渲染减少了不必要的跳转和重复渲染这样相对减轻了服务器的压力前后端职责分离架构清晰前端进行交互逻辑后端负责数据处理缺点初次加载耗时多不能使用浏览器的前进后退功能由于单页应用在一个页面中显示所有的内容所以无法前进后退不利于搜索引擎检索由于所有的内容都在一个页面中动态替换显示所以在 SEO 上其有着天然的弱势。SPA首屏加载速度慢的怎么解决首屏时间First Contentful Paint指的是浏览器从响应用户输入网址地址到首屏内容渲染完成的时间此时整个网页不一定要全部渲染完成但需要展示当前视窗需要的内容加载慢的原因网络延时问题资源文件体积是否过大资源是否重复发送请求去加载了加载脚本的时候渲染内容堵塞了常见的几种SPA首屏优化方式减小入口文件积静态资源本地缓存UI框架按需加载图片资源的压缩组件重复打包开启GZip压缩使用SSR想要具体了解可以点击SPA单页应用首屏加载速度慢的解决详解Vue初始化过程中new Vue(options)都做了什么处理组件配置项初始化根组件时进行了选项合并操作将全局配置合并到根组件的局部配置上初始化每个子组件时做了一些性能优化将组件配置对象上的一些深层次属性放到 vm.$options 选项中以提高代码的执行效率初始化组件实例的关系属性比如 p a r e n t 、 parent、 parent、children、 r o o t 、 root、 root、refs 等处理自定义事件调用 beforeCreate 钩子函数初始化组件的 inject 配置项得到 ret[key] val 形式的配置对象然后对该配置对象进行响应式处理并代理每个 key 到 vm 实例上数据响应式处理 props、methods、data、computed、watch 等选项解析组件配置项上的 provide 对象将其挂载到 vm._provided 属性上调用 created 钩子函数如果发现配置项上有 el 选项则自动调用 $mount 方法也就是说有了 el 选项就不需要再手动调用 $mount 方法反之没提供 el 选项则必须调用 $mount接下来则进入挂载阶段// core/instance/init.js export function initMixin (Vue: ClassComponent) { Vue.prototype._init function (options?: Object) { const vm: Component this vm._uid uid // 如果是Vue的实例则不需要被observe vm._isVue true if (options options._isComponent) { // optimize internal component instantiation // since dynamic options merging is pretty slow, and none of the // internal component options needs special treatment. initInternalComponent(vm, options) } else { vm.$options mergeOptions( resolveConstructorOptions(vm.constructor), options || {}, vm ) } if (process.env.NODE_ENV ! production) { initProxy(vm) } else { vm._renderProxy vm } vm._self vm initLifecycle(vm) initEvents(vm) callHook(vm, beforeCreate) initInjections(vm) // resolve injections before data/props initState(vm) initProvide(vm) // resolve provide after data/props callHook(vm, created) if (vm.$options.el) { vm.$mount(vm.$options.el) } } }对MVVM的理解MVVM 由 Model、View、ViewModel 三部分构成Model 层代表数据模型也可以在Model中定义数据修改和操作的业务逻辑View 代表UI 组件它负责将数据模型转化成UI 展现出来ViewModel 是一个同步View 和 Model的对象。在MVVM架构下View 和 Model 之间并没有直接的联系而是通过ViewModel进行交互Model 和 ViewModel 之间的交互是双向的 因此View 数据的变化会同步到Model中而Model 数据的变化也会立即反应到View 上。ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来而View 和 Model 之间的同步工作完全是自动的无需人为干涉因此开发者只需关注业务逻辑不需要手动操作DOM 不需要关注数据状态的同步问题复杂的数据状态维护完全由 MVVM 来统一管理。Vue数据双向绑定原理实现mvvm的数据双向绑定是采用数据劫持结合发布者-订阅者模式的方式通过Object.defineProperty()来给各个属性添加settergetter并劫持监听在数据变动时发布消息给订阅者触发相应的监听回调。就必须要实现以下几点1、实现一个数据监听器Observer能够对数据对象的所有属性进行监听如有变动可拿到最新值并通知订阅者2、实现一个指令解析器Compile对每个元素节点的指令进行扫描和解析根据指令模板替换数据以及绑定相应的更新函数3、实现一个Watcher作为连接Observer和Compile的桥梁能够订阅并收到每个属性变动的通知执行指令绑定的相应回调函数从而更新视图Vue的响应式原理什么是响应式也即是说数据发生改变的时候视图会重新渲染匹配更新为最新的值。Object.defineProperty 为对象中的每一个属性设置 get 和 set 方法每个声明的属性都会有一个 专属的依赖收集器 subs当页面使用到 某个属性时触发 ObjectdefineProperty - get函数页面的 watcher 就会被 放到 属性的依赖收集器 subs 中在 数据变化时通知更新当数据改变的时候会触发Object.defineProperty - set函数数据会遍历自己的 依赖收集器 subs逐个通知 watcher视图开始更新Vue3.x响应式数据原理Vue3.x改用Proxy替代Object.defineProperty。因为Proxy可以直接监听对象和数组的变化并且有多达13种拦截方法。并且作为新标准将受到浏览器厂商重点持续的性能优化。Proxy只会代理对象的第一层Vue3是怎样处理这个问题的呢判断当前Reflect.get的返回值是否为Object如果是则再通过reactive方法做代理 这样就实现了深度观测。监测数组的时候可能触发多次get/set那么如何防止触发多次呢我们可以判断key是否为当前被代理对象target自身属性也可以判断旧值与新值是否相等只有满足以上两个条件之一时才有可能执行trigger。Vue3.0 里为什么要用 Proxy API替代 defineProperty API1.defineProperty API 的局限性最大原因是它只能针对单例属性做监听。Vue2.x中的响应式实现正是基于defineProperty中的descriptor对 data 中的属性做了遍历 递归为每个属性设置了 getter、setter。这也就是为什么 Vue 只能对 data 中预定义过的属性做出响应的原因。2.Proxy API的监听是针对一个对象的那么对这个对象的所有操作会进入监听操作 这就完全可以代理所有属性将会带来很大的性能提升和更优的代码。Proxy 可以理解成在目标对象之前架设一层“拦截”外界对该对象的访问都必须先通过这层拦截因此提供了一种机制可以对外界的访问进行过滤和改写。3.响应式是惰性的。在 Vue.js 2.x 中对于一个深层属性嵌套的对象要劫持它内部深层次的变化就需要递归遍历这个对象执行 Object.defineProperty 把每一层对象数据都变成响应式的这无疑会有很大的性能消耗。在 Vue.js 3.0 中使用 Proxy API 并不能监听到对象内部深层次的属性变化因此它的处理方式是在 getter 中去递归响应式这样的好处是真正访问到的内部属性才会变成响应式简单的可以说是按需实现响应式减少性能消耗。Proxy 与 Object.defineProperty 优劣对比1.Proxy 可以直接监听对象而非属性2.Proxy 可以直接监听数组的变化3.Proxy 有多达 13 种拦截方法,不限于 apply、ownKeys、deleteProperty、has 等等是 Object.defineProperty 不具备的4.Proxy 返回的是一个新对象,我们可以只操作新的对象达到目的,而 Object.defineProperty 只能遍历对象属性直接修改5.Proxy 作为新标准将受到浏览器厂商重点持续的性能优化也就是传说中的新标准的性能红利6.Object.defineProperty 的优势如下:兼容性好支持 IE9而 Proxy 的存在浏览器兼容性问题,而且无法用 polyfill 磨平因此 Vue 的作者才声明需要等到下个大版本( 3.0 )才能用 Proxy 重写。vue中组件的data为什么是一个函数而new Vue 实例里data 可以直接是一个对象我们知道Vue组件其实就是一个Vue实例。JS中的实例是通过构造函数来创建的每个构造函数可以new出很多个实例那么每个实例都会继承原型上的方法或属性。Vue的data数据其实是Vue原型上的属性数据存在于内存当中。Vue为了保证每个实例上的data数据的独立性规定了必须使用函数而不是对象。因为使用对象的话每个实例组件上使用的data数据是相互影响的这当然就不是我们想要的了。对象是对于内存地址的引用直接定义个对象的话组件之间都会使用这个对象这样会造成组件之间数据相互影响。使用函数后使用的是data()函数data()函数中的this指向的是当前实例本身就不会相互影响了。而 new Vue 的实例是不会被复用的因此不存在引用对象的问题。vue中data的属性可以和methods中方法同名吗为什么可以同名methods的方法名会被data的属性覆盖调试台也会出现报错信息但是不影响执行原因源码定义的initState函数内部执行的顺序propsmethodsdatacomputedwatch//initState部分源码 export function initState (vm: Component) { vm._watchers [] const opts vm.$options if (opts.props) initProps(vm, opts.props) if (opts.methods) initMethods(vm, opts.methods) if (opts.data) { initData(vm) } else { observe(vm._data {}, true /* asRootData */) } if (opts.computed) initComputed(vm, opts.computed) if (opts.watch opts.watch ! nativeWatch) { initWatch(vm, opts.watch) } }vue中created与mounted区别在created阶段实例已经被初始化但是还没有挂载至el上所以我们无法获取到对应的节点但是此时我们是可以获取到vue中data与methods中的数据的在mounted阶段vue的template成功挂载在$el中此时一个完整的页面已经能够显示在浏览器中所以在这个阶段可以调用节点了//以下为测试vue部分生命函数便于理解 beforeCreate(){ //创建前 console.log(beforecreate:,document.getElementById(first))//null console.log(data:,this.text);//undefined this.sayHello();//error:not a function }, created(){ //创建后 console.log(create:,document.getElementById(first))//null console.log(data:,this.text);//this.text this.sayHello();//this.sayHello() }, beforeMount(){ //挂载前 console.log(beforeMount:,document.getElementById(first))//null console.log(data:,this.text);//this.text this.sayHello();//this.sayHello() }, mounted(){ //挂载后 console.log(mounted:,document.getElementById(first))//p/p console.log(data:,this.text);//this.text this.sayHello();//this.sayHello() }Vue中computed与method的区别相同点:如果作为模板的数据显示二者能实现响应的功能唯一不同的是methods定义的方法需要执行不同点1.computed 会基于响应数据缓存methods不会缓存2.diff之前先看data里的数据是否发生变化如果没有变化computed的方法不会执行但methods里的方法会执行3.computed是属性调用而methods是函数调用虚拟DOM中key的作用简单的说key是虚拟DOM对象的标识在更新显示时key起着极其重要的作用。复杂的说当状态中的数据发生了变化时Vue会根据【新数据】生成【新的虚拟DOM】随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的diff比较比较规则如下旧虚拟DOM中找到了与新虚拟DOM相同的key1.若虚拟DOM中的内容没有变直接使用之前的真是DOM2.若虚拟DOM中内容变了则生成新的真实DOM随后替换掉页面中之前的真实DOM旧虚拟DOM中未找到与新虚拟DOM相同的key1.根据数据创建新的真实DOM随后渲染到页面用index作为key可能会引发的问题若对数据进行逆序添加/逆序删除等破坏顺序的操作会产生没有必要的真实DOM更新界面效果虽然没有问题但是数据过多的话会效率过低如果结构中还包含输入类的DOM会产生错误DOM更新界面有问题注意如果不存在对数据的逆序操作仅用于渲染表用于展示使用index作为key是没有问题的。Vue中watch用法详解在vue中使用watch来监听数据的变化1.监听的数据后面可以写成对象形式包含handler方法immediate和deep。2.immediate表示在watch中首次绑定的时候是否执行handler值为true则表示在watch中声明的时候就立即执行handler方法值为false则和一般使用watch一样在数据发生变化的时候才执行handler。3.当需要监听一个对象的改变时普通的watch方法无法监听到对象内部属性的改变只有data中的数据才能够监听到变化此时就需要deep属性对对象进行深度监听。watch: { name: { handler(newName, oldName) { }, deep: true, immediate: true } }vue中对mixins的理解和使用mixins是一种分发 Vue 组件中可复用功能的非常灵活的方式。混合对象可以包含任意组件选项。当组件使用混合对象时所有混合对象的选项将被混入该组件本身的选项。而mixins引入组件之后则是将组件内部的内容如data等方法、method等属性与父组件相应内容进行合并。相当于在引入后父组件的各种属性方法都被扩充了。可点击vue中对mixins的理解和使用的介绍作为参考vue中的插槽点击Vue中组件神兵利器插槽Slot查看详解为什么vue采用异步渲染vue是组件级更新当前组件里的数据变了它就会去更新这个组件。当数据更改一次组件就要重新渲染一次性能不高为了防止数据一更新就更新组件所以做了个异步更新渲染。核心的方法就是nextTick源码实现原理当数据变化后会调用notify方法将watcher遍历调用update方法通知watcher进行更新这时候watcher并不会立即去执行在update中会调用queueWatcher方法将watcher放到了一个队列里在queueWatcher会根据watcher的进行去重多个属性依赖一个watcher如果队列中没有该watcher就会将该watcher添加到队列中然后通过nextTick异步执行flushSchedulerQueue方法刷新watcher队列。flushSchedulerQueue中开始会触发一个before的方法其实就是beforeUpdate然后watcher.run() 才开始真正执行watcher执行完页面就渲染完成啦更新完成后会调用updated钩子。Vue 的异步更新机制是如何实现的Vue 的异步更新机制的核心是利用了浏览器的异步任务队列来实现的首选微任务队列宏任务队列次之。当响应式数据更新后会调用 dep.notify 方法通知 dep 中收集的 watcher 去执行 update 方法watcher.update 将 watcher 自己放入一个 watcher 队列全局的 queue 数组。然后通过 nextTick 方法将一个刷新 watcher 队列的方法flushSchedulerQueue放入一个全局的 callbacks 数组中。如果此时浏览器的异步任务队列中没有一个叫 flushCallbacks 的函数则执行 timerFunc 函数将 flushCallbacks 函数放入异步任务队列。如果异步任务队列中已经存在 flushCallbacks 函数等待其执行完成以后再放入下一个 flushCallbacks 函数。flushCallbacks 函数负责执行 callbacks 数组中的所有 flushSchedulerQueue 函数。flushSchedulerQueue 函数负责刷新 watcher 队列即执行 queue 数组中每一个 watcher 的 run 方法从而进入更新阶段比如执行组件更新函数或者执行用户 watch 的回调函数。$nextTick的理解用法在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法获取更新后的 DOM。为什么Vue 实现响应式并不是数据发生变化之后 DOM 立即变化而是按一定的策略进行 DOM 的更新。Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化Vue 将开启一个队列并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被多次触发只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的。然后在下一个的事件循环“tick”中Vue 刷新队列并执行实际 (已去重的) 工作。所以为了在数据变化之后等待 Vue 完成更新 DOM可以在数据变化之后立即使用 Vue.nextTick(callback)。这样回调函数将在 DOM 更新完成后被调用。使用场景在你更新完数据后需要及时操作渲染好的 DOM时Vue中常用的一些指令1.v-model指令用于表单输入实现表单控件和数据的双向绑定。2.v-on简写为基础事件绑定3.v-bind简写为动态绑定一些元素的属性类型可以是字符串、对象或数组。4.v-if指令取值为true/false控制元素是否需要被渲染5.v-else指令和v-if指令搭配使用没有对应的值。当v-if的值falsev-else才会被渲染出来。6.v-show指令指令的取值为true/false分别对应着显示/隐藏。7.v-for指令遍历data中存放的数组数据实现列表的渲染。8.v-once 通过使用 v-once 指令你也能执行一次性地插值当数据改变时插值处的内容不会更新vue的自定义指令Vue除了核心功能默认内置的指令 Vue 也允许注册自定义指令。自定义指令是用来操作DOM的。尽管Vue推崇数据驱动视图的理念但并非所有情况都适合数据驱动。自定义指令就是一种有效的补充和扩展不仅可用于定义任何的DOM操作并且是可复用的。添加自定义指令的两种方式全局指令 通过 Vue.directive() 函数注册一个全局的指令。局部指令通过组件的 directives 属性对该组件添加一个局部的指令。可以参考如何写一个Vue自定义指令或Vue.js官网关于自定义指令的详细讲解学习你有写过自定义指令吗自定义指令的应用场景有哪些可以参考如何写一个Vue自定义指令v-show和v-if指令的共同点和不同点相同点v-show和v-if都能控制元素的显示和隐藏。不同点1.实现本质方法不同:v-show本质就是通过设置css中的display设置为none;控制隐藏v-if是动态的向DOM树内添加或者删除DOM元素;2.v-show都会编译初始值为false只是将display设为none但它也编译了;v-if初始值为false就不会编译了总结v-show只编译一次后面其实就是控制css而v-if不停的销毁和创建如果要频繁切换某节点时故v-show性能更好一点。为什么避免v-if和v-for一起使用vue2.x版本中当 v-if 与 v-for 一起使用时v-for 具有比 v-if 更高的优先级vue3.x版本中当 v-if 与 v-for 一起使用时v-if 具有比 v-for 更高的优先级。官网明确指出避免 v-if 和 v-for 一起使用永远不要在一个元素上同时使用 v-if 和 v-for。可以先对数据在计算数据中进行过滤然后再进行遍历渲染操作和实现起来都没有什么问题页面也会正常展示。但是会带来不必要的性能消耗vue为什么在 HTML 中监听事件你可能注意到这种事件监听的方式违背了关注点分离 (separation of concern) 这个长期以来的优良传统。但不必担心因为所有的 Vue.js 事件处理方法和表达式都严格绑定在当前视图的 ViewModel 上它不会导致任何维护上的困难。实际上使用 v-on 或 有几个好处扫一眼 HTML 模板便能轻松定位在 JavaScript 代码里对应的方法。因为你无须在 JavaScript 里手动绑定事件你的 ViewModel 代码可以是非常纯粹的逻辑和 DOM 完全解耦更易于测试。当一个 ViewModel 被销毁时所有的事件处理器都会自动被删除。你无须担心如何清理它们。Vue.set 改变数组和对象中的属性在一个组件实例中只有在data里初始化的数据才是响应的Vue不能检测到对象属性的添加或删除没有在data里声明的属性不是响应的,所以数据改变了但是不会在页面渲染解决办法使用 Vue.set(object, key, value) 方法将响应属性添加到嵌套的对象上vm.$set(obj, key, val) 做了什么由于 Vue 无法探测对象新增属性或者通过索引为数组新增一个元素所以这才有了 vm. s e t 它是 V u e . s e t 的别名。 v m . set它是 Vue.set 的别名。 vm. set它是Vue.set的别名。vm.set 用于向响应式对象添加一个新的 property并确保这个新的 property 同样是响应式的并触发视图更新。为对象添加一个新的响应式数据调用 defineReactive 方法为对象增加响应式数据然后执行 dep.notify 进行依赖通知更新视图为数组添加一个新的响应式数据通过 splice 方法实现说说vue的生命周期的理解生命周期通俗说就是Vue实例从创建到销毁的过程就是生命周期。beforecreate 初始化界面前created 初始化界面后beforemount 渲染界面前mounted 渲染界面后beforeUpdate 更新数据前updated 更新数据后beforedestory 卸载组件前destroyed 卸载组件后注意面试官想听到的不只是你说出了以上八个钩子名称而是每个阶段做了什么可以收藏下图第一次页面加载会触发哪几个钩子第一次页面加载时会触发 beforeCreate, created, beforeMount, mounted 这几个钩子Vue组件通信有哪些方式1.父传子props父组件通过 props 向下传递数据给子组件。注组件中的数据共有三种形式data、props、computed2.父传子孙provide 和 inject父组件定义provide方法return需要分享给子孙组件的属性子孙组件使用 inject 选项来接收指定的我们想要添加在这个实例上的 属性3.子传父通过事件形式子组件通过 $emit()给父组件发送消息父组件通过v-on绑定事件接收数据。4.父子、兄弟、跨级eventBus.js这种方法通过一个空的 Vue 实例作为中央事件总线事件中心,用它来 e m i t 触发事件和 emit触发事件和 emit触发事件和on监听事件巧妙而轻量地实现了任何组件间的通信。5.通信插件PubSub.js6.vuexvuex 是 vue 的状态管理器存储的数据是响应式的。只需要把共享的值放到vuex中其他需要的组件直接获取使用即可router和route的区别router为VueRouter的实例相当于一个全局的路由器对象里面含有很多属性和子对象例如history对象。。。经常用的跳转链接就可以用this.$router.push和router-link跳转一样。route相当于当前正在跳转的路由对象。。可以从里面获取name,path,params,query等vue-router有几种钩子函数1.全局路由全局导航钩子主要有两种钩子前置守卫(beforeEach)、后置钩子(afterEach)2. 路由独享的钩子单个路由独享的导航钩子它是在路由配置上直接进行定义的routes: [ { path: /file, component: File, beforeEnter: (to, from ,next) { //do something } } ]组件内的导航钩子组件内的导航钩子主要有这三种beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave。他们是直接在路由组件内部直接进行定义的。ps:详细知识点可以点击路由导航守卫查看vue-router路由跳转方式声明式标签跳转router-link :to{name:home}/router-link router-link :to{path:/home}/router-link编程式 js跳转this.$router.push(/home) this.$router.push({name:home}) this.$router.push({path:/home})vue-router路由传参router-link 进行页面按钮式路由跳转传参this.$router.push进行编程式路由跳转传参keep-alive了解吗 keep-alive 是Vue的内置组件能在组件切换过程中将状态保留在内存中防止重复渲染DOM。 keep-alive 包裹动态组件时会缓存不活动的组件实例而不是销毁它们。Vuex是什么怎么使用Vuex是实现组件全局状态数据管理的一种机制可以方便实现组件数据之间的共享Vuex集中管理共享的数据易于开发和后期维护能够高效的实现组件之间的数据共享提高开发效率存储在Vuex的数据是响应式的能够实时保持页面和数据的同步Vuex重要核心属性包括state,mutations,action,getters,modules.stateVuex 使用单一状态树,即每个应用将仅仅包含一个store 实例但单一状态树和模块化并不冲突。存放的数据状态不可以直接修改里面的数据。mutationsmutations定义的方法动态修改Vuex 的 store 中的状态或数据。actionactions可以理解为通过将mutations里面处里数据的方法变成可异步的处理数据的方法简单的说就是异步操作数据。view 层通过 store.dispath 来分发 action。getters类似vue的计算属性主要用来过滤一些数据。modules项目特别复杂的时候可以让每一个模块拥有自己的state、mutation、action、getters,使得结构非常清晰方便管理。ps:详细使用和对其各属性的理解可以参考以下文章一文吃透Vuex3的状态管理什么情况下使用 Vuex如果应用够简单最好不要使用 Vuex一个简单的 store 模式即可需要构建一个中大型单页应用时使用Vuex能更好地在组件外部管理状态ps:详细使用和对其各属性的理解可以参考以下文章一文吃透Vuex3的状态管理Vuex和单纯的全局对象有什么区别Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候若 store 中的状态发生变化那么相应的组件也会相应地得到高效更新。不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化从而让我们能够实现一些工具帮助我们更好地了解我们的应用。ps:详细使用和对其各属性的理解可以参考以下文章一文吃透Vuex3的状态管理为什么 Vuex 的 mutation 中不能做异步操作每个mutation执行完成后都会对应到一个新的状态变更这样devtools就可以打个快照存下来然后就可以实现 time-travel 了。如果mutation支持异步操作就没有办法知道状态是何时更新的无法很好的进行状态的追踪给调试带来困难。ps:详细使用和对其各属性的理解可以参考以下文章一文吃透Vuex3的状态管理axios 是什么其特点和常用语法是什么Axios 是一个基于 promise 的 HTTP 库可以用在浏览器和 node.js 中。前端最流行的 ajax 请求库react/vue 官方都推荐使用 axios 发 ajax 请求特点:基于 promise 的异步 ajax 请求库支持promise所有的API浏览器端/node 端都可以使用浏览器中创建XMLHttpRequests支持请求响应拦截器支持请求取消可以转换请求数据和响应数据并对响应回来的内容自动转换成 JSON类型的数据批量发送多个请求安全性更高客户端支持防御 XSRF就是让你的每个请求都带一个从cookie中拿到的key, 根据浏览器同源策略假冒的网站是拿不到你cookie中得key的这样后台就可以轻松辨别出这个请求是否是用户在假冒网站上的误导输入从而采取正确的策略。常用语法axios(config): 通用/最本质的发任意类型请求的方式axios(url[, config]): 可以只指定 url 发 get 请求axios.request(config): 等同于 axios(config)axios.get(url[, config]): 发 get 请求axios.delete(url[, config]): 发 delete 请求axios.post(url[, data, config]): 发 post 请求axios.put(url[, data, config]): 发 put 请求axios.defaults.xxx: 请求的默认全局配置axios.interceptors.request.use(): 添加请求拦截器axios.interceptors.response.use(): 添加响应拦截器axios.create([config]): 创建一个新的 axios(它没有下面的功能)axios.Cancel(): 用于创建取消请求的错误对象axios.CancelToken(): 用于创建取消请求的 token 对象axios.isCancel(): 是否是一个取消请求的错误axios.all(promises): 用于批量执行多个异步请求axios.spread(): 用来指定接收所有成功数据的回调函数的方法对SSR有了解吗它主要解决什么问题Server-Side Rendering 我们称其为SSR意为服务端渲染指由服务侧完成页面的 HTML 结构拼接的页面处理技术发送到浏览器然后为其绑定状态与事件成为完全可交互页面的过程解决了以下两个问题seo搜索引擎优先爬取页面HTML结构使用ssr时服务端已经生成了和业务想关联的HTML有利于seo首屏呈现渲染用户无需等待页面所有js加载完成就可以看到页面视图压力来到了服务器所以需要权衡哪些用服务端渲染哪些交给客户端缺点复杂度整个项目的复杂度性能会受到影响服务器负载变大相对于前后端分离务器只需要提供静态资源来说服务器负载更大所以要慎重使用Vue要做权限管理该怎么做控制到按钮级别的权限怎么做具体详解查看Vue要做权限管理该怎么做控制到按钮级别的权限怎么做Vue项目前端开发环境请求服务器接口跨域问题对于vue-cli 2.x版本在config文件夹配置服务器代理对于vue-cli 3.x版本前端配置服务器代理在vue.config.js中设置服务器代理如下图target对应的属性值为你准备向后端服务器发送请求的主机端口含义为相当于把前端发送请求的主机端口自动替换成挂载的主机和端口这样前后端的主机端口都一一就不会存在跨域问题ws:表示WebSocket协议changeOrigin:true;表示是否改变原域名这个一定要选择为true;这样发送请求的时候就不会出现跨域问题了。做过哪些Vue的性能优化编码阶段尽量减少data中的数据data中的数据都会增加getter和setter会收集对应的watcherv-if和v-for不能连用如果需要使用v-for给每项元素绑定事件时使用事件代理SPA 页面采用keep-alive缓存组件在更多的情况下使用v-if替代v-showkey保证唯一使用路由懒加载、异步组件防抖、节流第三方模块按需导入长列表滚动到可视区域动态加载图片懒加载SEO优化服务端渲染SSR预渲染打包优化压缩代码Tree Shaking/Scope Hoisting使用cdn加载第三方模块多线程打包happypacksplitChunks抽离公共文件sourceMap优化Vue3有了解过吗能说说跟Vue2的区别吗具体详解请点击Vue3有了解过吗能说说跟Vue2的区别吗Vue 3.0 所采用的 Composition Api 与 Vue 2.x使用的Options Api 有什么区别Options Api包含一个描述组件选项data、methods、props等的对象 optionsAPI开发复杂组件同一个功能逻辑的代码被拆分到不同选项 使用mixin重用公用代码也有问题命名冲突数据来源不清晰Composition Apivue3 新增的一组 api它是基于函数的 api可以更灵活的组织组件的逻辑。解决options api在大型项目中options api不好拆分和重用的问题。element-ui中遇到的问题1.el-cascader多选在IE中样式不正常2.级联选择器高度问题3.Table 固定列下出现线条此文章会持续更新记录一些vue的知识点和常见问题防止迷路记得收藏哦文章来源于网上, 如有侵权请联系博主删除学习资源网上虽然也有很多的学习资源但基本上都残缺不全的这是我们和网安大厂360共同研发的的网安视频教程内容涵盖了入门必备的操作系统、计算机网络和编程语言等初级知识而且包含了中级的各种渗透技术并且还有后期的CTF对抗、区块链安全等高阶技术。总共200多节视频100多本网安电子书最新学习路线图和工具安装包都有不用担心学不全。这些东西我都可以免费分享给大家需要的可以点这里自取:网安入门到进阶资源
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

深圳搭建网站公司如何注册成立家族公司

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个极简版闪迪U盘量产工具,特点:1.三步完成基本量产操作 2.全中文向导式界面 3.自动识别常见闪迪U盘型号 4.内置详细图文教程 5.一键恢复出厂设置。使用…

张小明 2025/12/27 23:16:17 网站建设

网站如何做传输网盘免费连接附近wifi

第一章:Open-AutoGLM手机自动化入门解析Open-AutoGLM 是一款基于大语言模型驱动的手机自动化框架,旨在通过自然语言指令实现对移动设备的智能控制。该工具结合了语义理解与操作执行能力,使用户无需编写复杂脚本即可完成应用启动、界面点击、数…

张小明 2025/12/27 23:15:44 网站建设

网站开发实用吗做h5的app有哪些

这几天小白想着再入手一个OEC-T来玩一玩,结果打开一看,之前下单的链接已经下架了…… 当前段时间网上传出ARM版fnOS已经在开发当中,小白就觉得ARM架构的小盒子可能要开始涨价了,只是没想到这件事情来得这么快…… 小白在一个月前…

张小明 2025/12/27 23:15:11 网站建设

寿光做网站的公司七牛云动静分离wordpress

第一章:边缘Agent与Docker部署概述在现代分布式系统架构中,边缘Agent作为连接中心平台与终端设备的关键组件,承担着数据采集、本地决策和指令执行的核心职能。通过将计算能力下沉至网络边缘,边缘Agent显著降低了通信延迟&#xff…

张小明 2025/12/27 23:14:37 网站建设

泉州网站建设制作wordpress首页添加登录

LED电子看板作为实时数据展示的核心载体,通过直观呈现生产状态、产量、异常等信息,帮助管理者快速决策。本文结合安徽某材料加工厂与浙江某科技公司的实际案例,解析LED电子看板如何助力工厂实现智能生产管理。一、安徽某材料加工厂&#xff1…

张小明 2025/12/27 23:14:04 网站建设

做网站赤峰小说网站排名人气

TW Elements终极指南:500免费Tailwind CSS组件库完全解析 【免费下载链接】TW-Elements 项目地址: https://gitcode.com/gh_mirrors/twe/TW-Elements TW Elements 是一个基于Tailwind CSS的强大UI组件库,为开发者提供了500完全免费的现代化组件&…

张小明 2025/12/27 23:13:31 网站建设