Vue部分
常见题目
- 简述Vue生命周期
- Vue中如何做权限管理
- 双绑使用和原理
- 组件通信
- Vue3优化
- 刷新后vuex状态丢失怎么解?
- Vue3为什么用Proxy替代defineProperty?
- 路由懒加载
- History和Hash模式有何区别?
- nextTick
- v-for和v-if优先级
- 如何监听vuex状态变化?
- 你觉得vuex有什么缺点?
- ref和reactive异同
- Vue中如何扩展一个组件
- vue-loader是什么
- 子组件能否修改父组件数据
- 动态路由怎么使用
- 说说对Vue数据响应式的理解
- 从template到render做了什么
- 如何缓存和更新组件
- 虎拟DOM
- 什么是异步组件?
- 说说Vue长列表优化思路
- computed & watch
- SPA和SSR
- diff算法
- 如何从0到1架构一个Vue项目
- 你如何实现一个vue-router
- vuex module
- 单根节点
- v-once使用场景有哪些?
- 什么场景使用嵌套路由?
- 如何监听vuex状态变化?
- Vue实例挂载过程发生了什么
- key的作用
- watch和watchEffect
- 父子组件创建、挂载顺序
- 说说你对vuex的理解
- 什么是递归组件?使用场景有哪些?
- 你写过自定义指令吗?
- vue3新特性
- vue3设计目标和优化点
- Vue3性能提升提现在哪些方面?
- listeners是做什么的?
- Composition API和Options API有何不同?
- 你知道哪些Vue最佳实践
- 从0到1实现vuex?
vue响应式原理(数据双向绑定原理)
数据劫持
vue2 Object.defineProperty
<body>
<div>
<p>数据改变视图</p>
<input type="text" id="val1" />
</div>
<div>
<p>视图改变数据</p>
<input type="text" id="val2" />
</div>
</body>
<script>
let data = {
msg: "示例初始化"
}
let txt1 = {}
let txt2 = {}
//通过Object.property监听txt的msg属性,改变视图
Object.property(txt1, "msg",{
set: function(val) {
data["msg"] = val;
//更改视图
document.getElementById("val1").value = val;
},
get: function() {
return data["msg"];
}
})
//视图改变数据
document.getElementById("val2").oninput = function() {
txt2.msg = this.value;
}
</script>
vue3 Proxy
const p = new Proxy(person, {//创建代理
// 查
get(target,propName){
console.log(`有人读取了p身上的${propName}`)
return target[propName];
//反射
return Reflect.get(target,propName)
},
// 改、增
set(target, propName, value){
console.log(`有人修改了p身上的${propName}属性`);
target[propName] = value;
},
// 删
deleteProperty(target, propName){
console.log(`有人删除了p身上的${propName}属性`)
return delete target[propName];
},
});
依赖收集
Dep(订阅者收集依赖、删除依赖、向依赖发送消息)
发布订阅模式
Watcher(观察者)
vue中$nextTick的原理
- 宏任务和微任务 执行顺序:同步任务->微任务->宏任务
- 常见宏任务包括:setTimeout、setInterval、I/O、script(整体代码块)、postMessage
- 常见微任务包括:MutationObserver、promise.then/catch/finally、process.nextTick(node环境)
vue和react的区别
- 设计思想不同vue采用MVVM双向数据绑定 react单向数据流
- react fiber useMemo useCallback useLaoutEffect useEffect redux 、react-redux的区别
vue3 和 vue2区别?
- vue3支持碎片组件中可以拥有多个根节点
- API不一样vue2采用选项类型api,vue3采用组合式api setup函数即刻执行
- 生命周期函数不同 vue3中setup替代vue2中的beforeCreate和created
- 父子组件通信方式不一样
- block tree (vue3标记静态节点和动态节点,仅对比动态节点)
响应式原理不同
- vue2采用的es5的Object.defineProperty()对数据劫持结合发布订阅模式的方式来实现
- vue3采用的es6的Proxy API对数据进行代理,通过Proxy监听属性变化
Proxy优势:
- defineProperty只能监听某个属性,不能对全对象监听
- Proxy完美支持对数组的监听无需像vue2对数组对象做特异操作
- Proxy调用时递归,性能优于defineProperty
- Proxy不兼容IE,defineProperty不兼容IE8及以下
vue-router
路由懒加载的原理
componment: "/A" => componment: ()=> important("/A")
路由守卫的原理
hash和history的区别
- hash路由中带#
- hash核心原理,通过监听hashChange事件 history通过监听popstate事件
- hash支持低版本浏览器兼容性好,history是H5新增API
- hash#后值的改变不进行http请求,不会重新加载页面
- history使用时需要服务器配合,防止出现页面404
vue通信方式
- 父子 props/parent/$children
- 隔代 provide/inject listeners
- 共享 vuex Bus localStorage/sessionStorage
vuex
- 核心选项配置 state getters mountions actions modules
- 刷新数据丢失如何解决?localStorage存储、vuex-presitedState持久化存储插件
axios和fetch的区别
- axios底层还是xhr fetch浏览器原生支持的API 都通过promise封装
- fetch返回的数据需要手动转换为json,axios会自动转换
TS的优势
- 相对于JS弱类型语言,TS静态标记语言提前声明类型减少报错、代码更严谨
- 可以使用最新的ES版本语法并转换es5,代码提示更智能错误提示