写在前面
CSDN话题挑战赛第1期
活动详情地址:https://marketing.csdn.net/p/bb5081d88a77db8d6ef45bb7b6ef3d7f参赛话题:前端面试宝典话题描述:欢迎各位加入话题创作得小伙伴,如果我没有猜错得话,我觉得你是应该同我一样是一位前端人。如今前端在IT事业中的占比越来越重,已经成为不可缺少的部分,前端技术也是层出不穷,各种技术类、技术框架也蜂拥而出,前端面试的难度也随之增加,如果我们拥有一套前端面试宝典。如果你是应聘者:你就可以从容的solo面试官,如果你是面试官:你就可以将应聘者拷问到骨子里!总之我们大家一起将自己的面试经验以及学习到的知识点汇聚于此,形成一套体系的前端面试宝典。让读者无论是面试还是学习都能够有非常大的收获。就让我们携手共筑前端面试宝典吧!!! 携手共筑前端面试宝典 Vue面试题汇总简单的聊聊new Vue以后发生的事答案 vue中,HashRouter和HistoryRouter的区别和原理答案拓展 mutation和action有什么区别?答案拓展 聊聊Vue2双向绑定的缺陷答案拓展delete和Vue.delete删除数组的区别答案 Vue面试题汇总 简单的聊聊new Vue以后发生的事 答案
new Vue
会调用Vue原型链上的_init
方法对Vue实例进行初始化首先initLifecycle
初始化声明周期,对Vue实例
的内部的一些属性(如children
、parent
、isMount
)进行初始化initEvents
,初始化当前实例上的一些自定义事件(Vue.$on
)initRender
,解析slots
绑定在Vue实例上,绑定createElement
方法实例上完成对生命周期、自定义事件等一系列属性的初始化后,触发生命周期钩子beforeCreate
initInjections
,在初始化data
和props
之前完成依赖注入(类似于React.Content
)initState
,完成对data
和props
的初始化,同时对属性完成数据劫持内部,启用监听者对数据进行监听(更改)initProvide
,对依赖注入进行解析完成对数据(state
状态)的初始化后,触发生命周期钩子created
进入挂载阶段,将Vue模板语法通过vue-loader
解析成虚拟DOM树,虚拟DOM树与数据完成双向绑定,触发生命周期钩子beforeMount
将解析好的虚拟DOM
树通过vue渲染成真实的DOM,触发生命周期钩子mounted
vue中,HashRouter和HistoryRouter的区别和原理
答案
vue-router
是 Vue官方的路由管理器。它和Vue.js的核心深度集成,让构建单页面应用变得易如反掌。vue-router默认hash
模式,还有一种是history
模式。
hash
模式的工作原理是hashchange
事件,可以在window
监听hash
的变化。我们在url
后面随便添加一个#xx
触发这个事件。vue-router
默认的是hash
模式—使用URL
的hash
来模拟一个完整的URL
,于是当URL
改变的时候,页面不会重新加载,也就是单页应用了,当#
后面的hash
发生变化,不会导致浏览器向服务器发出请求,浏览器不发出请求就不会刷新页面,并且会触发hasChange
这个事件,通过监听hash
值的变化来实现更新页面部分内容的 *** 作对于
hash
模式会创建hashHistory
对象,在访问不同的路由的时候,会发生两件事:
HashHistory.push()
将新的路由添加到浏览器访问的历史的栈顶,HasHistory.replace()替换到当前栈顶的路由 history路由主要使用
HTML5
的pushState()
和replaceState()
这两个api结合window.popstate
事件(监听浏览器前进后退)来实现的,pushState()
可以改变url
地址且不会发送请求,replaceState()
可以读取历史记录栈,还可以对浏览器记录进行修改区别
hash模式较丑,history模式较优雅pushState
设置的新URL
可以是与当前URL
同源的任意URL
;而hash
只可修改#
后面的部分,故只可设置与当前同文档的URL
pushState
设置的新URL
可以与当前URL
一模一样,这样也会把记录添加到栈中;而hash设置的新值必须与原来不一样才会触发记录添加到栈中pushState
通过stateObject
可以添加任意类型的数据到记录中;而hash
只可添加短字符串pushstate
可额外设置title
属性供后续使用hash
兼容IE8
以上,history
兼容IE10以上history
模式需要后端配合将所有访问都指向index.html,否则用户刷新页面,会导致404错误
mutation和action有什么区别?
答案
mutation更改
Vuex
的store
中的状态的唯一方法是提交 mutation
。Vuex
中的 mutation
非常类似于件:每个mutation
都有一个字符串的事件类型(type
)和一个回调函数(handler
)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受state
作为第一个参数
const store = new Vuex.Store({
state: {
count: 1
},
mutations: {
increment (state) {
// 变更状态
state.count++
}
}
})
不能直接调用一个mutation handler
。这个选项更像是事件注册:“当触发一个类型为increment
的mutation
时,调用此函数。"要唤醒一个mutationhandler
,你需要以相应的type
调用store.commit
方法:
store.commit('increment')
ActionAction
类似于mutation
,不同在于:Action
提交的是mutation
,而不是直接变更状态。Action
可以包含任意异步 *** 作。注册一个简单的
action
:
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment (state) {
state.count++
}
},
actions: {
increment (context) {
context.commit('increment')
}
}
})
拓展
vuex
真正限制你的只有mutation
必须是同步的这一点(在redux
里面就好像reducer
必须同步返回下一个状态一样)。
同步的意义在于这样每一个mutation
执行完成后都可以对应到一个新的状态(和reducer
一样),这样devtools就可以打个snapshot
存下来,然后就可以随便time-travel
了。如果你开着devtool调用一个异步的action
,你可以清楚地看到它所调用的 mutation
是何时被记录下来的,并且可以立刻查看它们对应的状态。
使用方法
// hash路由原理
// 监听hashchange方法
window.addEventListener('hashchange',()=>{
div.innerHTML = location.hash.slice(1)
})
// history路由原理
// 利用html5的history的pushState方法结合window.popstate事件(监听浏览器前进后退) function routerChange (pathname){ history.pushState(null,null,pathname) div.innerHTML = location.pathname
}
window.addEventListener('popstate',()=> {
div.innerHTML = location.pathname
})
聊聊Vue2双向绑定的缺陷
答案
vue 实例创建后,无法检测到对象属性的新增或删除,只能追踪到数据是否被修改不能监听数组的变化
拓展
解决方案:
使用$set
给侦听属性
*对数组使用其数组方法 push
/pop
/shift
/unshift
/splice
/sort
/reverse
重写数组方法的原理
const methods = ['pop', 'shift', 'unshift', 'sort', 'reverse', 'splice', 'push'];
// 复制Array.prototype,并将其prototype指向
Array.prototypelet proto = Object.create(Array.prototype);methods.forEach(met
hod => {
proto[method] = function () {
// 重写proto中的数组方法
Array.prototype[method].call(this, ...arguments);
viewRender()
// 视图更新
function observe(obj) {
if (Array.isArray(obj)) {
// 数组实现响应式
obj.__proto__ = proto; // 改变传入数组的prototype
return;
}
if (typeof obj === 'object') {
... // 对象的响应式实现
}
}
}})
delete和Vue.delete删除数组的区别
答案
delete
只是被删除的元素变成了empty/undefined
其他的元素的键值还是不变。
vue.delete
直接删除了数组改变了数组的键值。
var a = [1, 2, 3, 4]
var b = [1, 2, 3, 4]
delete a[0]
console.log(a)
//[empty,2,3,4]
this.$delete(b,0)
console.log(b) //[2,3,4]
写在最后
CSDN话题挑战赛第1期
活动详情地址:https://marketing.csdn.net/p/bb5081d88a77db8d6ef45bb7b6ef3d7f欢迎分享,转载请注明来源:内存溢出
评论列表(0条)