IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> v-if遇到setTimeout(() => {emit(‘xxx‘)}0) -> 正文阅读

[JavaScript知识库]v-if遇到setTimeout(() => {emit(‘xxx‘)}0)

v-if遇到setTimeout(() => {emit(‘xxx’)},0)

  • 一个例子

    • 当我们需要在父子组件间通信时候,我们需要使用emit

    • 子组件

      setup(props,{emit}){
        function handleClick(){
          emit('XXX')
        }
      }
      

      这时当子组件中触发了点击事件,调用handleClick函数之后,将会发送自定义事件XXX到父组件

    • 父组件

      <SubComponent v-if="isVisblie" @XXX="onSubClick" v-click-outside="handleClickOutside">
      </SubComponent>
      ...
      function handleClickOutside(){
        this.isVisblie = false
      }
      function onSubClick(){
        console.log('ok')
      }
      

      父组件会调用onSubClick方法,打印出 ok

  • 当这个例子中子组件使用了setTimeout

    • 子组件

      setup(props,{emit}){
        function handleClick(){
          setTiemout(() => {emit(XXX)},0)
        }
      }
      

      这时将emit放入setTimeout中,将会在下轮事件循环中emit出这个自定义事件XXX

    • 父组件

      <SubComponent v-if="isVisblie" @XXX="onSubClick" v-click-outside="handleClickOutside">
      </SubComponent>
      ...
      function handleClickOutside(){
        this.isVisblie = false
      }
      function onSubClick(){
        console.log('ok')
      }
      

      由于存在v-click-outside,而子组件中的点击事件会出发clickoutside,所以在本轮事件循环结束之前,SubComponent已经被销毁了,所以自定义事件XXX的处理函数也就无法执行

  • 为什么不加setTimeout就可以正常执行

    • 首先我们回顾一下Vue的异步更新队列

      • Vue在观察到数据变化时并不会直接更新DOM,而是会开启一个队列,并将同一事件循环中发生的所有数据改变放入这个队列

        • 为什么需要这个队列

          Vue会在同一事件循环中不断维护这个队列,以此去除重复的改变,避免进行不必要的DOM操作和计算。

      • 等到本轮事件循环末尾,或下一轮事件循环开启的时候(这取决于Vue采用哪种方法,Vue优先采用Promise.then,但是如果浏览器不支持,Vue会采用setTimeout)

    • 异步更新队列如何解释上面的错误

      • 当没有在子组件中加入setTimeout的时候,emit方法将在本轮事件循环中执行,这时,虽然触发emit的点击事件虽然已经将isVisblie更改为false,但是Vue会将销毁SubComponent放入异步更新队列,所以当emit被触发的时候SubComponent还没有被销毁。
      • 当在子组件中加入setTimeout的时候,emit方法将在作为宏任务被放入宏任务队列,将在下一次的事件循环开始时被主线程取出放入执行栈执行,而这时异步更新队列中的销毁SubComponent的操作已经被执行,所以在emit方法被调用的时候,SubComponent已经不存在了。
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 12:53:24  更:2022-03-06 12:55:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:14:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码