【VUE】语法相关问题

118 阅读2分钟

1. Vue 组件中 data 为什么必须是函数

  • 一个组件被复用多次的话,也就会创建多个实例。本质上,这些实例用的都是同一个构造函数。
  • 如果data是对象的话,对象属于引用类型,会影响到所有的实例。所以为了保证组件不同的实例之间data不冲突,data必须是一个函数,因为函数有自己的作用域

2. computed 、watch、method的区别⭐⭐⭐⭐⭐

通俗来讲,既能用 computed 实现又可以用 watch 监听来实现的功能,推荐用 computed

  • computed
    • 计算属性,依赖其他属性,当其他属性改变的时候下一次获取computed值时也会改变,computed的值会有缓存
  • watch
    • 类似于数据改变后的回调
    • 如果想深度监听的话,后面加一个deep:true
    • 如果想监听完立马运行的话,后面加一个immediate:true
  • method
    • 在使用 method 的时候,是这样使用的{{fn{xx}}},渲染的时候如果没有发生变化,这个也是会被执行的。
    • 而 computed 是有缓存的,如果没有变化就不用再去执行了

3. vue的$set是做什么的⭐⭐⭐

将新增的数据变成响应式

  • vue 中 data的数据,如果是对象的话,会把它的属性转为Object.defineProperty的getter和setter,使之变为响应式的。但是新增的属性不是响应式的。
  • 可以通过this.$set()将新增的数据变成响应式
    • this.$set(对象,key,值)
    • this.$set(数组,索引,值)
  • this.$forceUpdate():强制更新页面

4. @click.sync、native、stop、prevent、self分别是做什么的⭐⭐⭐

语法作用
@click.sync <comp :foo.sync="bar"></comp>
相当于 <comp :foo="bar" @update:foo="val => bar = val">
@click.native父组件的原生事件需要加上 native,否则不生效
@click.stop是阻止冒泡
@click.prevent是阻止默认行为
@click.self点击自己的时候才能触发

5. v-model 的原理⭐⭐⭐⭐⭐

  • v-model其实是—个语法糖,它的背后本质上是包含两个操作:
    1. v-bind绑定一个value属性: :value
    2. v-on指令给当前元素绑定input事件@input
  • 也就是说下面的两段代码是等同的
<input type="text" v-model="message">

等同于

<input type="text" v-bind:value="message" v-on:input="message = $event.target.value">

6. v-html 会导致什么问题⭐⭐⭐⭐⭐

  • 可能会造成 xss 攻击
  • v-html 会替换掉子标签

7. 为什么v-for和v-if不建议用在一起⭐⭐⭐⭐⭐

  • 当 v-for 和 v-if 处于同一个节点时,v-for 的优先级比 v-if 更高,这意味着 v-if 将分别重复运行于每个 v-for 循环中。如果要遍历的数组很大,而真正要展示的数据很少时,这将造成很大的性能浪费(Vue2.x)
  • 这种场景建议使用 computed,先对数据进行过滤
  • 注意:3.x 版本中 v-if 总是优先于 v-for 生效。由于语法上存在歧义,建议避免在同一元素上同时使用两者。比起在模板层面管理相关逻辑,更好的办法是通过创建计算属性筛选出列表,并以此创建可见元素。

8. nextTick⭐⭐⭐⭐⭐

下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

(1)应用

  • 想要在Vue生命周期函数中的created()操作DOM可以使用Vue.nextTick()回调函数
  • 在数据改变后要执行的操作,而这个操作需要等数据改变后而改变DOM结构的时候才进行操作,需要用到nextTick

(2)Vue中的nextTick是微任务还是宏任务⭐⭐⭐⭐

  • 根据执行环境分别尝试采用Promise、MutationObserver、setImmediate,如果以上都不行则采用 setTimeout
    • nextTick的内部实现如果支持 promise 那就使用 promise,
    • 没有就用MutationObserver(微任务),
    • 再没有就用 setImmediate(宏任务),
    • 还没有就用 setTimeOut;
  • 所以nextTick 有可能是宏任务,也有可能是微任务