Skip to content

一、基本面试考点

参考链接:

1. vue 是什么?

  • vue 是一套用于构建用户界面的渐进式js框架,严格来讲它是针对视图的一种解决方案。
    • 渐进式js框架
      • vue.js只提供了vue-cli生态中最核心的组件系统和双向数据绑定。
      • vuex、vue-router都属于围绕vue.js开发的库
  • 核心库只关注视图层

2. 指令、插值

  • 插值、表达式
    vue
    # 插值
    {{}}
    # 表达式
    {{ flag? '是': '否'}}
  • 指令
    • 条件渲染
      • v-if v-else 的用法
      • v-if 和 v-show 区别
      • v-if 和 v-show 的使用场景
    • 列表循环
      • v-for
        • key值问题,是否可以使用下标【发散理解 diff 算法】
        • 与 v-if 的优先级问题,在 vue3 已经调整
    • 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>
    • v-model
      • 常见的表单项
        • input textarea checkbox radio select
        • 修饰符 lazy number trim
          vue
          <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>

Released under the MIT License.