今天工作不是很忙,简单做下Vue总结。
1.vue全家桶指定的是什么?
答:vue(整体架构)+vuex(状态管理)+vue-router(路由)+vue_resource || axios(数据交互)+各种ui。
pc端ui:antd-vue || element-ui等.
移动端ui:mint-ui || Vant 等.
2.v-model是什么?如何使用?vue中标签怎么绑定事件?
答:
v-model可以实现数据的双向绑定,基础指令(v-class、v-for、v-if、v-show、v-on)。
绑定事件使用v-bind 或 @click @blur等
3.数据双向绑定的原理
答 :vue.js 是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
v-model的实现具体步骤共分为四步:
步骤 | 内容 |
---|---|
第一步 | 需要observe的数据对象进行递归遍历,包括子属性对象的属性,都加上 setter和getter这样的话,给这个对象的某个值赋值,就会触发setter,那么就能监听到了数据变化 |
第二步 | compile解析模板指令,将模板中的变量替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动,收到通知,更新视图 |
第三步 | Watcher订阅者是Observer和Compile之间通信的桥梁,主要做的事情是: 1、在自身实例化时往属性订阅器(dep)里面添加自己。 2、自身必须有一个update()。 方法3、待属性变动dep.notice()通知时,能调用自身的update()方法,并触发Compile中绑定的回调,则功成身退。 |
第四步 | MVVM作为数据绑定的入口,整合Observer、Compile和Watcher三者,通过Observer来监听自己的model数据变化,通过Compile来解析编译模板指令,最终利用Watcher搭起Observer和Compile之间的通信桥梁,达到数据变化 -> 视图更新;视图交互变化(input) -> 数据model变更的双向绑定效果。 |
4.简述Vue的生命周期
答:
1.vue生命周期共分为四个阶段。
阶段 | 名称 |
---|---|
1 | 实例创建 |
2 | DOM渲染 |
3 | 数据更新 |
4 | 销毁实例 |
2.共有八个基本钩子函数。
函数名 | 行为 |
---|---|
beforeCreate(创建前) | vue实例的挂载元素$el和数据对象data都为undefined,还未初始化。在此阶段可以做的事情:加loading事件。 |
created(创建后) | vue实例的数据对象data有了,$el还没有。在此阶段可以做的事情:解决loading,请求ajax数据为mounted渲染做准备。 |
beforeMount(渲染前) | vue实例的$el和data都初始化了,但还是虚拟的dom节点,具体的data.filter还未替换。 |
mounted(渲染后) | vue实例挂载完成,data.filter成功渲染。 |
beforeUpdate(更新前) | data更新时触发。 |
updated(更新后) | data更新时触发。在此阶段可以做的事情:数据更新时,做一些处理。 |
beforeDestroy(销毁前) | 组件销毁时触发,在此阶段可以做的事情:可向用户询问是否销毁。 |
destroyed(销毁后) | 组件销毁时触发,vue实例解除了事件监听以及和dom的绑定(无响应了),但DOM节点依旧存在在此阶段可以做的事情:组件销毁时进行提示。 |
5.active-class是那个组件的属性?vue嵌套路由怎么定义?
答:
active-class:vue-router模块的router-link组件。
嵌套路由是在VueRouter 的参数中使用 children 配置实现路由嵌套。
例:
const routes = [
{ path: "/", redirect: "/home" },//重定向,指向了home组件
{
path: "/home", component: home,
children: [
{ path: "/home/game", component: game }
] //此处为嵌套路由。
}
]
6.怎么定义vue-router的动态路由?怎么获取传过来的动态参数?
答:
在router目录下的index.js文件中,对path属性加上/:id。使用router对象的params.id获取参数。
路由传参时也可通过路由跳转后加参数/:id或’/path?id=’+id。使用router对象的params.id或query.id获取数据。
7.vue-router有哪些导航钩子
答:三种。
序号 | 内容 |
---|---|
1 | 全局导航钩子:router.beforeEach(to,from,next),作用:跳转前进行判断拦截 |
2 | 组件内的钩。 |
3 | 单独路由独享组件 |
8.iframe的优缺点?
答:iframe也称作嵌入式框架,类似嵌入式框架和框架网页,它可以把一个网页的框架和内容嵌入在现有的网页中。
优点 |
---|
1.解决加载缓慢的第三方内容如图标和广告等的加载问题 |
2.Security sandbox |
3.并行加载脚本 |
4.方便制作导航栏 |
缺点 |
---|
1.iframe会阻塞主页面的Onload事件 |
2.即使内容为空,加载也需要时间 |
3.没有语意 |
9.请讲讲你对axios或者其他请求方式的使用。
答:内容较多,请查看axios封装-api统一管理。
10.axios+tp5进阶中,调用axios.post(‘api/user’)是进行的什么操作?axios.put(‘api/user/8′)呢?
答:跨域,添加用户操作,更新操作。
11.vuex是什么?怎么使用?哪种功能场景使用它?
答:vuex是vue框架中状态管理。
状态 | 描述 |
---|---|
state | 存储状态(变量) |
getters | 对数据获取之前的再次编译,可以理解为state的计算属性。我们在组件中使用 $sotre.getters.fun() |
mutations | 修改状态,并且是同步的。在组件中使用$store.commit(’’,params)。这个和我们组件中的自定义事件类似。 |
actions | 异步操作。在组件中使用是$store.dispath(’’) |
modules | store的子模块,为了开发大型项目,方便状态管理而使用的。这里我们就不解释了,用起来和上面的一样。 |
使用:
新建store.js引入vuex
在main .js中引入store
用途:主要用于保存用户登录状态,购物车或组件间状态。
12.请说下封装 vue 组件的过程?
答:
首先,组件可以提升整个项目的开发效率。能够把页面抽象成多个相对独立的模块,解决了我们传统项目开发:效率低、难维护、复用性等问题。
然后,使用Vue.extend方法创建一个组件,然后使用Vue.component方法注册组件。子组件需要数据,可以在props中接受定义。而子组件修改好数据后,想把数据传递给父组件。可以采用emit方法。
13.dom是在哪一个生命周期完成渲染的?第一次页面加载会触发哪几个生命周期?vue生命周期的作用是什么?
答:
- 在 mounted 中就已经完成了。
- 第一次页面加载时会触发 beforeCreate, created, beforeMount, mounted 这几个生命周期。
- 它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻辑。
14.为什么会出现vue修改数据后页面没有刷新这个问题?如何解决?
答:
- 受 ES5 的限制,Vue.js 不能检测到对象属性的添加或删除。因为 Vue.js 在初始化实例时将属性转为 getter/setter,所以属性必须在 data 对象上才能让 Vue.js 转换它,才能让它是响应的。
- 第一种:
this.$set
第二种:给数组、对象赋新值
第三种:使用this.$forceupdate
强制刷新