一、基本面试考点
参考链接:
1. vue 是什么?
- vue 是一套用于构建用户界面的渐进式js框架,严格来讲它是针对视图的一种解决方案。
- 渐进式js框架
- vue.js只提供了vue-cli生态中最核心的组件系统和双向数据绑定。
- vuex、vue-router都属于围绕vue.js开发的库
- 渐进式js框架
- 核心库只关注视图层
2. 指令、插值
- 插值、表达式vue
# 插值 {{}} # 表达式 {{ flag? '是': '否'}}
- 指令
- 条件渲染
- v-if v-else 的用法
- v-if 和 v-show 区别
- v-if 和 v-show 的使用场景
- 列表循环
- v-for
- key值问题,是否可以使用下标【发散理解 diff 算法】
- 与 v-if 的优先级问题,在 vue3 已经调整
- v-for
- v-bind 动态属性
- 简写 :
- 事件
v-on 简写 @
event 参数,自定义参数
vue<template> <div> <p>{{num}}</p> <button @click="increment1">+1</button> <button @click="increment2(2, $event)">+2</button> </div> </template> <script> export default { data() { return { num: 0 } }, methods: { increment1(event) { // 是原生的 event 对象 console.log('event', event, event.__proto__.constructor) // 挂载事件的目标元素 console.log(event.target) // 事件是被注册到当前元素的 console.log(event.currentTarget) this.num++ // 结论: // 1. event 是原生的 // 2. 事件被挂载到当前元素 // 和 DOM 事件一样 }, increment2(val, event) { console.log(event.target) this.num = this.num + val }, loadHandler() { // do some thing } }, mounted() { window.addEventListener('load', this.loadHandler) }, beforeDestroy() { //【注意】用 vue 绑定的事件,组建销毁时会自动被解绑 // 自己绑定的事件,需要自己销毁!!! window.removeEventListener('load', this.loadHandler) } } </script>
事件修饰符,按键修饰符
- 事件修饰符 详解官方文档html
<!-- 阻止单击事件继续传播 --> <a v-on:click.stop="doThis"></a> <!-- 提交事件不再重载页面 --> <form v-on:submit.prevent="onSubmit"></form> <!-- 修饰符可以串联 --> <a v-on:click.stop.prevent="doThat"></a> <!-- 只有修饰符 --> <form v-on:submit.prevent></form> <!-- 添加事件监听器时使用事件捕获模式 --> <!-- 即内部元素触发的事件先在此处理,然后才交由内部元素进行处理 --> <div v-on:click.capture="doThis">...</div> <!-- 只当在 event.target 是当前元素自身时触发处理函数 --> <!-- 即事件不是从内部元素触发的 --> <div v-on:click.self="doThat">...</div> <!-- 点击事件将只会触发一次 --> <a v-on:click.once="doThis"></a> <!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发 --> <!-- 而不会等待 `onScroll` 完成 --> <!-- 这其中包含 `event.preventDefault()` 的情况 --> <div v-on:scroll.passive="onScroll">...</div>
- 按键修饰符,详解官方文档html
<!-- 只有在 `key` 是 `Enter` 时调用 `vm.submit()` --> <input v-on:keyup.enter="submit"> <!-- 即使 Alt 或 Shift 被一同按下时也会触发 --> <button v-on:click.ctrl="onClick">A</button> <!-- 有且只有 Ctrl 被按下的时候才触发 --> <button v-on:click.ctrl.exact="onCtrlClick">A</button> <!-- 没有任何系统修饰符被按下的时候才触发 --> <button v-on:click.exact="onClick">A</button>
- 事件修饰符 详解官方文档
事件被绑定到哪里
- 当前元素
- v-html
- 会有 XSS 风险,会覆盖子组件vue
<template> <div> <p v-html="rawHtml"> <span>【注意】使用 v-html 之后,将会覆盖子元素</span> </p> </div> </template> <script> export default { data() { return { rawHtml: '指令 - 原始 html <b>加粗</b> <i>斜体</i>', } } } </script>
- 会有 XSS 风险,会覆盖子组件
- v-model
- 常见的表单项
- input textarea checkbox radio select
- 修饰符 lazy number trimvue
<template> <div> <p>输入框: {{name}}</p> <input type="text" v-model.trim="name"/> <input type="text" v-model.lazy="name"/> <input type="text" v-model.number="age"/> <p>多行文本: {{desc}}</p> <textarea v-model="desc"></textarea> <!-- 注意,<textarea>{{desc}}</textarea> 是不允许的!!! --> <p>复选框 {{checked}}</p> <input type="checkbox" v-model="checked"/> <p>多个复选框 {{checkedNames}}</p> <input type="checkbox" id="jack" value="Jack" v-model="checkedNames"> <label for="jack">Jack</label> <input type="checkbox" id="john" value="John" v-model="checkedNames"> <label for="john">John</label> <input type="checkbox" id="mike" value="Mike" v-model="checkedNames"> <label for="mike">Mike</label> <p>单选 {{gender}}</p> <input type="radio" id="male" value="male" v-model="gender"/> <label for="male">男</label> <input type="radio" id="female" value="female" v-model="gender"/> <label for="female">女</label> <p>下拉列表选择 {{selected}}</p> <select v-model="selected"> <option disabled value="">请选择</option> <option>A</option> <option>B</option> <option>C</option> </select> <p>下拉列表选择(多选) {{selectedList}}</p> <select v-model="selectedList" multiple> <option disabled value="">请选择</option> <option>A</option> <option>B</option> <option>C</option> </select> </div> </template> <script> export default { data() { return { name: '张三', age: 18, desc: '自我介绍', checked: true, checkedNames: [], gender: 'male', selected: '', selectedList: [] } } } </script>
- 常见的表单项
- 条件渲染
3. computed、 watch 的区别
- computed 有缓存,data 不变则不会重新计算
- watch 如何深度监听
- deep
- watch 监听引用类型,是拿不到旧值的。因为指针相同,此时已经指向了新的 val
4. class 和 style
- 使用动态属性
- 使用驼峰式写法vue
<template> <div> <p :class="{ black: isBlack, yellow: isYellow }">使用 class</p> <p :class="[black, yellow]">使用 class (数组)</p> <p :style="styleData">使用 style</p> </div> </template> <script> export default { data() { return { isBlack: true, isYellow: true, black: 'black', yellow: 'yellow', styleData: { fontSize: '40px', // 转换为驼峰式 color: 'red', backgroundColor: '#ccc' // 转换为驼峰式 } } } } </script> <style scoped> .black { background-color: #999; } .yellow { color: yellow; } </style>