zoukankan      html  css  js  c++  java
  • 关于vue中的nextTick深入理解

    一、定义[nextTick、事件循环]

      nextTick的由来:
        由于VUE的数据驱动视图更新,是异步的,即修改数据的当下,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新。
      nextTick的触发时机:
        在同一事件循环中的数据变化后,DOM完成更新,立即执行nextTick(callback)内的回调。
      应用场景:
        需要在视图更新之后,基于新的视图进行操作。
      以上出现了事件循环的概念,其涉及到JS的运行机制,包括主线程的执行栈、异步队列、异步API、事件循环的协作,此处不展开之后再总结。大致理解:主线程完成同步环境执行,查询任务队列,提取队首的任务,放入主线程中执行;执行完毕,再重复该操作,该过程称为事件循环。而主线程的每次读取任务队列操作,是一个事件循环的开始。异步callback不可能处在同一事件循环中。
      简单总结事件循环:
        同步代码执行 -> 查找异步队列,推入执行栈,执行callback1[事件循环1] ->查找异步队列,推入执行栈,执行callback2[事件循环2]...
      即每个异步callback,最终都会形成自己独立的一个事件循环。
      结合nextTick的由来,可以推出每个事件循环中,nextTick触发的时机:
        同一事件循环中的代码执行完毕 -> DOM 更新 -> nextTick callback触发
       tips:本文的任务队列、消息队列、异步队列指同一个东西,均指macrotask queue。
           事件循环详解:http://www.cnblogs.com/hity-tt/p/6733062.html 
     
    上面这些内容纯属是从网上搬运过来的,接下来说说在项目中遇到的问题
        还是用文字啰嗦点说吧!代码实在不好展示我想表现的,因为我认为这种问题会在其他地方还会有类似问题;
         项目中用到了bootstrap-select.js插件(带搜索功能的下拉框),类似这样的插件在vue渲染完数据后肯定需要初始化,大概如下
    mounted: function () {
        $('#select').selectpicker();
     }

    我的业务需求是上面还有一个下拉框需要先选择上面的,来决定下面显示哪个模块,这时问题就来了,数据发生改变了,我的下拉框就变成如下图

    然后我很机智呀!果断去watch里面再初始化一下插件呀!但是发现无效,这下彻底懵逼了,后面经过各种打印,各种百度发现了这个东东

    watch:{
         type: function (val, oldVal) {
             if(val==2){
                 Vue.nextTick(function () {   //或者用 this.$nextTick 
                     $('#select').selectpicker();
                  })
          } } }

    最后总结:只怪自己太菜了,js基础不够NB,什么都不想说了,努力吧!

     
     
     
     
     
  • 相关阅读:
    【大数据】Hadoop的伪分布式安装
    【运维】什么是EPEL?
    【架构】RESTful的架构思想
    【python】有关python的异或操作的分析
    【Python】有关os.path.dirname(__file__)的注意事项
    Python中字符串前添加r ,b, u, f前缀的含义
    【Confluence】在CentOS7上的安装小记(下)
    Redis应用场景
    spring的context:exclude-filter 与 context:include-filter
    Spring的<context:annotation-config>和<annotation-driven>
  • 原文地址:https://www.cnblogs.com/duanyue/p/7458340.html
Copyright © 2011-2022 走看看