第二章
Vue
面试题
1.v-show
和v-if
的区别
2.为何v-for
中要用key
80%
3.描述Vue
组件生命周期(有父子组件的情况)
4.Vue
组件如何通讯 90% 【最常见的两三种即可】
5.描述组件渲染和更新的过程 【好问题】
6.双向数据绑定v-model
的实现原理
React
面试题
1.React
组件如何通讯
2.JSX
本质是什么 【经常问】
3.context
是什么,有何用途?
4.shouldComponentUpdate
的用途
5.描述redux
单项数据流
6.setState
是同步还是异步?(场景题)
框架综合应用
1.基于React
设计一个todolist
(组件结构,redux state
数据结构)
2.基于Vue
设计一个购物车(组件结构,vuex state
数据结构)
webpack
面试题
1.前端代码为何要进行构建和打包?
2.module chunk bundle
分别是什么意思,有何区别?
3.loader
和plugin
的区别?
4.webpack
如何实现懒加载?
5.webpack
常见性能优化 很多答案
6.babel-runtime
和babel-polyfill
的区别
第三章 Vue的使用
v-show
渲染还是会渲染,只不过通过display:none;
让元素没有显示出来而已,当需要频繁切换
的时候用v-show
,否则v-if
还要有dom
元素加载或销毁的成本
v-for
的优先级比v-if
的优先级高,如果它们同时使用,会导致每次都是先进行循环遍历再判断是否要显示。
{width=78%}
Vue
组件如何通讯,主要三点
1.Vue
父子组件如何通讯?
利用props
把数据从父组件传进子组件和this.$emit('xxx',参数)
调用父组件的事件
2.如何用自定义事件进行vue
组件间通讯?(比如组件间没有关系时)
3.利用Vuex
进行通讯
Vue
父子组件生命周期调用顺序【生命周期面试时很重要】
{width=83%}
参考官网生命周期图示
{width=83%}
留思考题,那beforeDestroy
和destroyed
的顺序呢?
平时v-model
是在类如input
上使用的,现在我们想在自定义组件上使用,就需要我们来自定义了。
model
是一个配置项,子组件里的input
使用:value
和model.prop
要和props
对应起来。
props
声明接收传进来的参数叫什么名字
change1
事件要和model.event
对应起来
$nextTick
重要
slot
作用域插槽
动态组件 不常考但是问到了能说出来也极好
{width=52%}
异步组件(vue
如何异步加载组件) 【常考】
{width=61%}
keep-alive
(vue
如何缓存组件)
比如tab切换时,频繁切换时因为有缓存就不用频繁销毁DOM元素。如果只是很简单的组件切换用v-show也可以
{width=61%}
mixins
如何抽离公共逻辑
{width=81%}
Vuex
知识点串讲 比较少考
Vue-router
使用
Vue3
的useRoute
相当于以前的this.$route
,而useRouter
相当于this.$router
{width=81%}
{width=81%}
第四章 Vue
原理-大厂必考
4-1
{width=81%}
{width=81%}
4-2 如何理解MVVM
{width=91%}
Model
就是组件里那个data
4-3 监听data
变化的核心API
是什么
这个方法接收三个参数:
- 属性所在的对象
- 属性的名字
- 一个描述符对象
能打印出来,说明这个函数的确监听得到变化
4-4 如何深度监听data变化【再次observe】
4-5 vue如何监听数组变化【数组原型】
// 触发更新视图
function updateView() {
console.log('视图更新')
}
// 重新定义数组原型
const oldArrayProperty = Array.prototype
// 创建新对象,原型指向 oldArrayProperty ,再扩展新的方法不会影响原型
const arrProto = Object.create(oldArrayProperty);
['push', 'pop', 'shift', 'unshift', 'splice'].forEach(methodName => {
arrProto[methodName] = function () {
updateView() // 触发视图更新
oldArrayProperty[methodName].call(this, ...arguments)
// Array.prototype.push.call(this, ...arguments)
}
})
// 重新定义属性,监听起来
function defineReactive(target, key, value) {
// 深度监听
observer(value)
// 核心 API
Object.defineProperty(target, key, {
get() {
return value
},
set(newValue) {
if (newValue !== value) {
// 深度监听
observer(newValue)
// 设置新值
// 注意,value 一直在闭包中,此处设置完之后,再 get 时也是会获取最新的值
value = newValue
// 触发更新视图
updateView()
}
}
})
}
// 监听对象属性
function observer(target) {
if (typeof target !== 'object' || target === null) {
// 不是对象或数组
return target
}
// 污染全局的 Array 原型
// Array.prototype.push = function () {
// updateView()
// ...
// }
if (Array.isArray(target)) {
target.__proto__ = arrProto
}
// 重新定义各个属性(for in 也可以遍历数组)
for (let key in target) {
defineReactive(target, key, target[key])
}
}
// 准备数据
const data = {
name: 'zhangsan',
age: 20,
info: {
address: '北京' // 需要深度监听
},
nums: [10, 20, 30]
}
// 监听数据
observer(data)
// 测试
// data.name = 'lisi'
// data.age = 21
// // console.log('age', data.age)
// data.x = '100' // 新增属性,监听不到 —— 所以有 Vue.set
// delete data.name // 删除属性,监听不到 —— 所有已 Vue.delete
// data.info.address = '上海' // 深度监听
data.nums.push(4) // 监听数组
4-6 虚拟DOM-面试里的网红
4-7
4-8 虚拟DOM-diff算法概述
4-9到4-13 深入diff算法源码 感觉挺烦
4-14 模板编译前置知识点-with语法
4-15 vue模板被编译成什么 后面再看吧
4-16 vue组件可用render代替template
4-17
{width=81%}
4-18 vue组件是如何渲染和更新的
4-19 vue组件是异步渲染的
4-20 如何用JS实现hash路由
4-21 如何用JS实现H5 history路由
{width=81%}