持续更新中...css
面试传送门:html
即Model-View-ViewModel。前端
Vue是以数据为驱动的,Vue自身将DOM和数据进行绑定,一旦建立绑定,DOM和数据将保持同步,每当数据发生变化,DOM会跟着变化vue
ViewModel是Vue的核心,它是Vue的一个实例。Vue实例时做用域某个HTML元素上的,这个HTML元素能够是body,也能够是某个id所指代的元素。react
DOM Listeners和Data Bindings是实现双向绑定的关键。DOM Listeners监听页面全部View层DOM元素的变化,当发生变化,Model层的数据随之变化;Data Bindings监听Model层的数据,当数据发生变化,View层的DOM元素随之变化。jquery
条件渲染指令,与v-if不一样的是,不管v-show的值为true或false,元素都会存在于HTML代码中;而只有当v-if的值为true,元素才会存在于HTML代码中。v-show指令只是设置了元素CSS的style值webpack
在vue-router写着keep-alive,keep-alive的含义:若是把切换出去的组件保留在内存中,能够保留它的状态或避免从新渲染。为此能够添加一个keep-alive指令es6
路由嵌套会将其余组件渲染到该组件内,而不是进行整个页面跳转。
router-view自己就是将组件渲染到该位置,web
有时候咱们想就像使用jquery那样去访问一个元素,此时就可使用v-el指令,去给这个元素注册一个索引,方便经过所属实例的$el访问这个元素。面试
注: HTML不区分大小写,因此v-el:someEl将转换为全小写。能够用v-el:some-el而后设置this.$el.someEl。
示例:
<span v-el:msg>hello</span>
<span v-el:other-msg>world</span>
this.$els.msg.textContent //-> "hello"
this.$els.otherMsg.textContent// -> "world"
this.$els.msg//-><span>hello</span>
复制代码
在vuejs中,咱们常常要绑定一些事件,有时候给DOM元素绑定,有时候给组件绑定。绑定事件在HTML中用v-on:click="event",能够简写为:@click="event"
Vue.js(是一套构建用户界面的 渐进式框架。与其余重量级框架不一样的是,Vue 采用自底向上增量开发的设计。
Vue 的核心库只关注视图层,而且很是容易学习,很是容易与其它库或已有项目整合。
另外一方面,Vue 彻底有能力驱动采用单文件组件和Vue生态系统支持的库开发的复杂单页应用。
Vue.js 的目标是经过尽量简单的 API 实现响应的数据绑定和组合的视图组件
route是“路由信息对象”,包括path,params,hash,query,fullPath,matched,name等路由信息参数。
router是“路由实例对象”,包括了路由的跳转方法(push、replace),钩子函数等。
mvc和mvvm其实区别并不大。都是一种设计思想。主要就是mvc中Controller演变成mvvm中的viewModel。mvvm主要解决了mvc中大量的DOM 操做使页面渲染性能下降,加载速度变慢,影响用户体验。
区别:vue数据驱动,经过数据来显示视图层而不是节点操做。
场景:数据操做比较多的场景,更加便捷
低耦合。视图(View)能够独立于Model变化和修改,一个ViewModel能够绑定到不一样的"View"上,当View变化的时候Model能够不变,当Model变化的时候View也能够不变。
可重用性。你能够把一些视图逻辑放在一个ViewModel里面,让不少view重用这段视图逻辑。
独立开发。开发人员能够专一于业务逻辑和数据的开发(ViewModel),设计人员能够专一于页面设计。
可测试。界面素来是比较难于测试的,而如今测试能够针对ViewModel来写。
(1)vuex是什么?
vue框架中状态管理。
(2)vuex有哪几种属性?
有五种,分别是 State、 Getters、Mutations 、Actions、 Module
vuex的State特性
A、Vuex就是一个仓库,仓库里面放了不少对象。其中state就是数据源存放地,对应于通常Vue对象里面的data
B、state里面存放的数据是响应式的,Vue组件从store中读取数据,如果store中的数据发生改变,依赖这个数据的组件也会发生更新
C、它经过mapState把全局的 state 和 getters 映射到当前组件的 computed 计算属性中
vuex的Getters特性
A、getters 能够对State进行计算操做,它就是Store的计算属性
B、 虽然在组件内也能够作计算属性,可是getters 能够在多组件之间复用
C、 若是一个状态只在一个组件内使用,是能够不用getters
vuex的Mutations特性
Actions 相似于 mutations,不一样在于:Actions 提交的是 mutations,而不是直接变动状态;Actions 能够包含任意异步操做。
(3)不用Vuex会带来什么问题?
可维护性会降低,想修改数据要维护三个地方;
可读性会降低,由于一个组件里的数据,根本就看不出来是从哪来的;
增长耦合,大量的上传派发,会让耦合性大大增长,原本Vue用Component就是为了减小耦合,如今这么用,和组件化的初衷相背。
将当前组件的<style>修改成<style scoped>
首先,咱们都知道在前端性能优化的一个秘诀就是尽量少地操做DOM,不只仅是DOM相对较慢,更由于频繁变更DOM会形成浏览器的回流或者重回,这些都是性能的杀手,所以咱们须要这一层抽象,在patch过程当中尽量地一次性将差别更新到DOM中,这样保证了DOM不会出现性能不好的状况.
其次,现代前端框架的一个基本要求就是无须手动操做DOM,一方面是由于手动操做DOM没法保证程序性能,多人协做的项目中若是review不严格,可能会有开发者写出性能较低的代码,另外一方面更重要的是省略手动DOM操做能够大大提升开发效率.
当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略。若是数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每一个元素,而且确保它在特定索引下显示已被渲染过的每一个元素。key 的做用主要是为了高效的更新虚拟DOM。
使用Object.assign(),vm.options.data能够获取到组件初始化状态下的data。
Object.assign(this.$data, this.$options.data())
Vue 是异步修改 DOM 的而且不鼓励开发者直接接触 DOM,但有时候业务须要必须对数据更改--刷新后的 DOM 作相应的处理,这时候就可使用 Vue.nextTick(callback)这个 api 了。
关于Vue 3.0,大体说了三个点,第一个是关于提出的新API setup()函数,第二个说了对于Typescript的支持,最后说了关于替换Object.defineProperty为 Proxy 的支持。
详细说了下关于Proxy代替带来的性能上的提高,由于传统的原型链拦截的方法,没法检测对象及数组的一些更新操做,但使用Proxy又带来了浏览器兼容问题。
vue 实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,经过 Object.defineProperty() 来劫持各个属性的 setter,getter,在数据变更时发布消息给订阅者,触发相应监听回调
nextTick,则能够在回调中获取更新后的 DOM
由于js自己的特性带来的,若是 data 是一个对象,那么因为对象自己属于引用类型,当咱们修改其中的一个属性时,会影响到全部Vue实例的数据。若是将 data 做为一个函数返回一个对象,那么每个实例的 data 属性都是独立的,不会相互影响了
咱们能够将同一函数定义为一个 method 或者一个计算属性。对于最终的结果,两种方式是相同的
不一样点:
Vue中watch、computed与methods的联系和区别
优势:
缺点:
vue的生命周期主要分为beforeCreate,created,beforeMount,mounted,beforeUpdate,updated,beforeDestroy,destroyed
建立先后、载入先后、更新先后、销毁先后
Vue 生命周期与钩子函数
全局的
单个路由独享的
组件级的
前端配置vue.config.js
后端配置
jsonp(只能解决get)
步骤:
1).去建立一个script标签
2).script的src属性设置接口地址 3).接口参数,必需要带一个自定义函数名,要否则后台没法返回数据 4).经过定义函数名去接受返回的数据
hash模式从新加载的时候只加载#后面的
history模式则是整个地址从新加载,不过他能够保存历史记录,方便前进后退
vue-router 有 3 种路由模式:hash、history、abstract
v-if v-show区别
v-for
v-model
v-bind
v-on
Vue 的父组件和子组件生命周期钩子函数执行顺序?
能够在钩子函数 created、beforeMount、mounted 中进行调用,由于在这三个钩子函数中,data 已经建立,能够将服务端端返回的数据进行赋值。可是本人推荐在 created 钩子函数中调用异步请求,由于在 created 钩子函数中调用异步请求有如下优势:
由于组件是用来复用的,且 JS 里对象是引用关系,若是组件中 data 是一个对象,那么这样做用域没有隔离,子组件中的 data 属性值会相互影响。
若是组件中 data 选项是一个函数,那么每一个实例能够维护一份被返回对象的独立的拷贝,组件实例之间的 data 属性值不会互相影响;而 new Vue 的实例,是不会被复用的,所以不存在引用对象的问题。
Proxy 的优点以下:
优势:
缺点:
虚拟 DOM 的实现原理主要包括如下 3 部分:
默认插槽
具名插槽
做用域插槽
vue-router模块的router-link组件。
在router目录下的index.js文件中,对path属性加上/:id。使用route对象的params.id。
vue文件的一个加载器。
用途:js能够写es六、style样式能够scss或less、template能够加jade等根据官网的定义,
vue-loader 是 webpack 的一个 loader,用于处理 .vue 文件.
当Vue 处理指令时,v-for 比 v-if 具备更高的优先级,这意味着v-if将分别重复运行于每一个v-for循环中。经过v-if 移动到容器元素,不会再重复遍历列表中的每一个值。取而代之的是,咱们只检查它一次,且不会在 v-if 为否的时候运算 v-for。
全部的 prop 都使得其父子 prop 之间造成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,可是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而致使你的应用的数据流向难以理解。
额外的,每次父级组件发生更新时,子组件中全部的 prop 都将会刷新为最新的值。这意味着你不该该在一个子组件内部改变 prop。若是你这样作了,Vue 会在浏览器的控制台中发出警告。子组件想修改时,只能经过 $emit 派发一个自定义事件,父组件接收到后,由父组件修改。
因为 JavaScript 的限制,Vue 不能检测到如下数组的变更:
assets文件夹是放静态资源;
components是放组件;
router是定义路由相关的配置;
view视图;
app.vue是一个应用主组件;
main.js是入口文件;
单页面应用(SPA),通俗一点说就是指只有一个主页面的应用,浏览器一开始要加载全部必须的 html, js, css。全部的页面内容都包含在这个所谓的主页面中。但在写的时候,仍是会分开写(页面片断),而后在交互的时候由路由程序动态载入,单页面的页面跳转,仅刷新局部资源。多应用于pc端。
多页面(MPA),就是指一个应用中有多个页面,页面跳转时是整页刷新
单页面的优势:
用户体验好,快,内容的改变不须要从新加载整个页面,基于这一点spa对服务器压力较小
先后端分离
页面效果会比较炫酷(好比切换页面内容时的专场动画)
单页面缺点:
初次加载时耗时多
页面复杂度提升不少
导航不可用,若是必定要导航须要自行实现前进、后退。
在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换。路由模块的本质 就是创建起url和页面之间的映射关系。
至于为啥不能用a标签,这是由于用Vue作的都是单页应用,就至关于只有一个主的index.html页面,因此你写的标签是不起做用的,必须使用vue-router来进行管理。
使用Proxy 使用当即执行函数