vue的相关
1.vue的钩子函数 Vue-Router 中导航守卫有哪些?其他的有什么作用?如何鉴权?
- 1.全局守卫 全局守卫一般来说全局前置守卫、全局后置钩子 每个钩子方法接收三个参数:
- to: Route : 即将要进入的目标 [路由对象]
- from: Route : 当前导航正要离开的路由
- next: Function : 继续执行函数
- next():继续执行
- next(false):中断当前的导航。
- next(‘/‘) 或 next({ path: ‘/‘ }):跳转新页面,常用于登陆失效跳转登陆
// 定义路由配置
const router = new VueRouter({ ... })
// 全局路由拦截-进入页面前执行
router.beforeEach((to, from, next) => {
// 这里可以加入全局登陆判断
// 继续执行
next();
});
// 全局后置钩子-常用于结束动画等
router.afterEach(() => {
//不接受next
});
export default router;
实用结合鉴权
import Vue from 'vue'
import Router from 'vue-router'
import { getStore } from 'js/store'
// vue路由懒加载 异步加载
const Index = resolve => require(['@/pages/index/Index'], resolve)
const Login = resolve => require(['@/pages/login/Login'], resolve)
// const Register = resolve => require(['@/pages/register/Register'], resolve)
// 用户个人信息
const UserInfo = resolve => require(['@/pages/user/UserInfo'], resolve)
const CompanyInfo = resolve => require(['@/pages/user/CompanyInfo'], resolve)
// 新闻与通知
const News = resolve => require(['@/pages/system/news/News'], resolve)
const Notice = resolve => require(['@/pages/system/news/Notice'], resolve)
// 待办列表
const ToDoList = resolve => require(['@/pages/workflow/ToDoList'], resolve)
// 签约页面
const Sign = resolve => require(['@/pages/trade/sign/Sign'], resolve)
Vue.use(Router)
var router = new Router({
routes: [
{
path: '*',
redirect: '/index'
},
{
path: '/',
redirect: '/login'
},
{
path: '/index',
name: 'index',
component: Index,
meta: {
title: '首页',
requireAuth: true // 只要此字段为true,必须做鉴权处理
}
},
{
path: '/userInfo',
name: 'userInfo',
component: UserInfo,
meta: {
title: '个人信息',
requireAuth: true
}
},
{
path: '/companyInfo',
name: 'companyInfo',
component: CompanyInfo,
meta: {
title: '企业信息',
requireAuth: true
}
},
{
path: '/news',
name: 'news',
component: News,
meta: {
title: '新闻',
requireAuth: true
}
},
{
path: '/notice',
name: 'notice',
component: Notice,
meta: {
title: '公告',
requireAuth: true
}
},
{
path: '/login',
name: 'login',
component: Login,
meta: {
showNav: false // 不显示nav
}
},
{
path: '/sign',
name: 'sign',
component: Sign,
meta: {
showNav: false // 不显示nav
}
},
{
path: '/toDoList',
name: 'toDoList',
component: ToDoList,
meta: {
title: '我的待办',
requireAuth: true
}
}
]
})
let indexScrollTop = 0
router.beforeEach((to, from, next) => {
// 路由进入下一个路由对象前,判断是否需要登陆
// 在路由meta对象中由个requireAuth字段,只要此字段为true,必须做鉴权处理
if (to.matched.some(res => res.meta.requireAuth)) {
const token = getStore({ name: 'access_token', type: "string" });
// 未登录
if (!token) {
next({
path: '/login',
query: {
redirect: to.path // 将跳转的路由path作为参数,登录成功后再跳转到该路由
}
})
} else {
next()
/* // 用户信息是否过期
let overdueTime = token.overdueTime;
let nowTime = +new Date();
// 登陆过期和未过期
if (nowTime > overdueTime) {
// 登录过期的处理,君可按需处理之后再执行如下方法去登录页面
// 我这里没有其他处理,直接去了登录页面
next({
path: '/login',
query: {
redirect: to.path
}
})
} else {
next()
} */
}
} else {
next()
}
if (to.path !== '/index') {
// 记录现在滚动的位置
indexScrollTop = document.body.scrollTop
}
// 修改网页title(暂时无意义)
// document.title = to.meta.title || document.title
})
router.afterEach(route => {
if (route.path !== '/index') {
document.body.scrollTop = 0
} else {
Vue.nextTick(() => {
// 回到之前滚动位置
document.body.scrollTop = indexScrollTop
})
}
})
export default router
- 2.路由守卫 使用:在路由配置中单独加入钩子,在src/router/index.js中使用,代码如下:
{
path:'/home/one', // 子页面1
component: One,
// 路由内钩子
beforeEnter: (to, from, next) => {
console.log('进入前执行');
next();
}
}
- 3.组件守卫 使用:在路由组件内定义钩子函数:
- beforeRouteEnter:进入页面前调用
- beforeRouteUpdate (2.2 新增):页面路由改变时调用,一般需要带参数
- beforeRouteLeave:离开页面调用
<script>
export default {
name: 'Two',
data () {
return {
msg: 'Hi, I am Two Page!'
}
},
// 进入页面前调用
beforeRouteEnter(to, from, next) {
console.log('进入enter路由钩子')
next()
},
// 离开页面调用
beforeRouteLeave(to,from, next){
console.log('进入leave路由钩子')
next()
},
// 页面路由改变时调用
beforeRouteUpdate(to, from, next) {
console.log('进入update路由钩子')
console.log(to.params.id)
next()
}
}
</script>
2.父子组件数据流向?
数据单向流动
所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解
// 简述:加载的时候:先父后子
// 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted
// 简述:子组件更新过程
// 父beforeUpdate->子beforeUpdate->子updated->父updated
// 简述:父组件更新过程
// 父beforeUpdate->父updated
// 简述:销毁过程
// 父beforeDestroy->子beforeDestroy->子destroyed->父destroyed
3.keep-alive keep-alive可以实现组件的缓存?
优秀的回答: juejin.cn/post/684490…
- 简述:keep-alive是一个内置抽象组件(它自身不会渲染一个 DOM 元素,也不会出现在父组件链中,abstract: true 属性值决定)。包裹动态组件时,会缓存不活动的组件实例。而不是销毁它们。 其主要用于保留组件状态(保留在内存中),避免重新渲染。 常用场景:
- 从列表进入详情页面,再回到列表页面,不需要刷新列表页面
- 填写表单,进入下一步,返回上一步数据不会清空
- 填写表单,进入下一步,返回上一步数据不会清空
4.nextTick的作用 dom更新之后延迟回调,事件循环?
- 作用: nextTick 可以让我们在下次 DOM 更新循环结束之后执⾏延迟回调,⽤于获 得更新后的 DOM
- 原理 nextTick方法主要是使用了宏任务和微任务,定义了一个异步方法.多次调用nextTick 会将方法存入队列中,通过这个异步方法清空当前队列。
- 常用处 需要在视图更新之后,基于新的视图进行操作。
5.mvc和mvvm的相同和区别?
6.vue的优点?
- vue的优势:轻量级框架、简单易学、双向数据绑定、组件化、数据和结构的分离、虚拟DOM、运行速度快。
7.Vue.js 中实现 hash路由和history路由?
- 形式上:hash模式url里面永远带着#号,开发当中默认使用这个模式。如果用户考虑url的规范那么就需要使用history模式,因为history模式没有#号,是个正常的url,适合推广宣传;
- 功能上:比如我们在开发app的时候有分享页面,那么这个分享出去的页面就是用vue或是react做的,咱们把这个页面分享到第三方的app里,有的app里面url是不允许带有#号的,所以要将#号去除那么就要使用history模式,但是使用history模式还有一个问题就是,在访问二级页面的时候,做刷新操作,会出现404错误,那么就需要和后端人配合,让他配置一下apache或是nginx的url重定向,重定向到你的首页路由上就ok了
8.diff算法和key?
9.slot 作用域插槽?
插槽,也就是slot,是组件的一块HTML模板,一个slot最核心的两个问题是显示不显示和怎样显示
10.Vue中相同逻辑如何抽离? Vue.mixin?
11.虚拟dom的理解?
-
概念: 虚拟 DOM 的解决方式是通过状态生成一个虚拟节点树,然后使用虚拟节点树进行渲染。在渲染之前,先缓存新生成的虚拟节点树,然后使用新生成的虚拟节点树和上一次生成的虚拟节点树进行对比,只渲染不同的部分。
-
虚拟 DOM 做了哪些事?
1.提供与真实 DOM 节点所对应的虚拟节点 vnode;(如何创建虚拟节点 vnode)
2.将虚拟节点 vnode 和旧虚拟节点 vnode 进行比对,然后更新视图。( patch 算法)。
2.js
1. es
3.工程相关
1.如何管理git
-
- github上创建一个远程仓库,名字自己取
-
- 一般都有个主干,不会在主干上开发,在项目中生成一个分支 dev git checkout -b dev 和 git push origin dev
-
- 在这个分支的基础上,创建多一个新的dev(dev1),这个dev就是我们要开发的任务,开发完毕后,在合成到dev上 (git checkout -b +你这个分支的名字,可以随便取)
-
- 完成任务之后 查看 status ,add, commit,
- 5.切换到dev上,合并demo到dev上
- 6.push 到远程仓库
4.其他
1.大文件上传 ,断点上传
- 大文件上传 转化格式二进制流(ArrayBuffer)--切割流 --组装分割相同数量的块,并行或串行发出 -- 请求发送成功后,再给服务器发送一个信号
- 断点续传 文件设置标识--当上传成功的之后,记录上传成功的标识 --当我们暂停或者发送失败后,可以重新发送没有上传成功的切割文件