• vue学习(二)


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

    二、Computed和watch

    相同点:都可以观察属性的变化从而做出响应

    不同点:

    计算属性computed更多是作为缓存功能的观察者,它可以将一个或者多个data的属性进行复杂的计算生成一个新的值,提供给渲染函数使用,当依赖的属性变化时,computed不会立即重新计算生成新的值,而是先标记为脏数据,当下次computed被获取时候,才会进行重新计算并返回。

    监听器watch并不具备缓存性,监听器watch提供一个监听函数,当监听的属性发生变化时,会立即执行该函数

    三、nextick实现原理是什么?

      在下次 DOM 更新循环结束之后执行延迟回调。nextTick主要使用了宏任务和微任务。根据执行环境分别尝试采用
       Promise (微任务)
       MutationObserver(微任务)
       setImmediate(宏任务)
       如果以上都不行则采用setTimeout(宏任务)
       定义了一个异步方法,多次调用nextTick会将方法存入队列中,通过这个异步方法清空当前队列。
      //  优先级 
      //   微任务process.nextTick>Promise>MutationObserve 
      //   宏任务:整体代码script>setTimeout>setInterval>setImmediate
     setImmediate(function () {
        console.log(1);
      }, 0);
      setTimeout(function () {
        console.log(2);
      }, 0);
      newPromise(function (resolve) {
        console.log(3);
        resolve();
        console.log(4);
      }).then(function () {
        console.log(5);
      });
      console.log(6);
      process.nextTick(function () {
        console.log(7);
      });
      console.log(8); //输出结果是3 4 6 8 7 5 2 1

    四、v-model的原理
      v-model本质就是一个语法糖,可以看成是value + input方法的语法糖。
      //可以通过model属性的prop和event属性来进行自定义。
      原生的v-model,会根据标签的不同生成不同的事件和属性。

    如下代码<input v-model="test">本质上是<input :value="test" @input="test = $event.target.value">
    在自定义组件中
    <my-component v-model="inputValue"></my-component>
    相当于
    <my-component :value="inputValue" @input="inputValue = argument[0]"></my-component>
    
    这个时候,inputValue接受的值就是input事件的回调函数的第一个参数,所以在自定义组件中,要实现数据绑定,还需要$emit去触发input的事件。
    this.$emit('input', value)

    五、Vue事件绑定原理说一下

      原生事件绑定是通过addEventListener绑定给真实元素的,组件事件绑定是通过Vue自定义的$on实现的。

    六.Vue模版编译原理

     简单说,Vue的编译过程就是将template转化为render函数的过程。会经历以下阶段:
    生成AST树:使用大量的正则表达式对template字符串进行解析,将标签、指令、属性等转化为抽象语法树AST
    优化::遍历AST,找到其中的一些静态节点并进行标记,方便在页面重渲染的时候进行diff比较时,直接跳过这一些静态节点,优化runtime的性能
    codegen:将最终的AST转化为render函数字符串

  • 相关阅读:
    NSIS 资料
    git 强制刷新,放弃更改
    Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 8
    …gen already exists but is not a source folder. Convert to a source folder or rename it [closed]
    eclipse
    Timeout in android httpclient
    git command
    L1-032. Left-pad
    L1-030. 一帮一
    L1-028. 判断素数
  • 原文地址:https://www.cnblogs.com/freefy/p/13642815.html
Copyright © 2020-2023  润新知