Swiper和Vue配合使用的问题——Vue的异步更新DOM

Swiper是很常用的库,用于实现触摸滑动效果,为了让Swiper生效,需要执行类似下面的代码(摘自Swiper官方示例)

var mySwiper = new Swiper(‘.swiper-container‘, {
    autoplay: true,//可选选项,自动滑动
})

而该代码的执行时机必须在DOM渲染完成之后,因此Swiper的官方文档要求在window.onload或$(document).ready()(使用JQuery或Zepto时)调用。

但显然,这只适用于静态页面。

如果Swiper中的数据是动态渲染的,且可能会通过Ajax请求获得最新的值而不断变化,那我们在什么时机去调用呢?

是不是数据被修改了就可以调用呢?因为Vue.js的双向绑定特性,数据被修改页面就会被重新渲染。

答案是否定的。

可能你还没有注意到,Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的。然后,在下一个的事件循环“tick”中,Vue 刷新队列并执行实际 (已去重的) 工作。Vue 在内部对异步队列尝试使用原生的 Promise.thenMutationObserver 和 setImmediate,如果执行环境不支持,则会采用 setTimeout(fn, 0) 代替。

例如,当你设置 vm.someData = ‘new value‘,该组件不会立即重新渲染。当刷新队列时,组件会在下一个事件循环“tick”中更新。多数情况我们不需要关心这个过程,但是如果你想基于更新后的 DOM 状态来做点什么,这就可能会有些棘手。虽然 Vue.js 通常鼓励开发人员使用“数据驱动”的方式思考,避免直接接触 DOM,但是有时我们必须要这么做。为了在数据变化之后等待 Vue 完成更新 DOM,可以在数据变化之后立即使用 Vue.nextTick(callback)。这样回调函数将在 DOM 更新完成后被调用。

——摘自Vue.js官方文档


因此我们就可以把Swiper的初始化放在Vue.nextTick(callback)接收的回调函数中去。

如果你的Ajax请求直接在当前Vue示例的方法中调用(没有使用Vuex),那么可以在Ajax请求成功的回调中注册nextTick事件。

axios.get("/api/xxx").then(res=>{
   this.$nextTick(()=>{
        var mySwiper = new Swiper(‘.swiper-container‘, {
            autoplay: true,//可选选项,自动滑动
        })
    }) //this指当前Vue实例
})

这样就能确保调用时页面的DOM已经被更新。

如果使用了Vuex,那么Ajax的操作一般会放在Vuex中的action里,因此我们在当前页面中就不能使用上面那种方法了。

需要给对应的数据加上一个watcher,这样action通过mutation更改数据时,我们的watcher监视器也会被调用,

我们可以在watcher里面去注册this.$nextTick事件,方法同上。

原文地址:https://www.cnblogs.com/flamestudio/p/12151024.html

时间: 2024-10-26 02:40:24

Swiper和Vue配合使用的问题——Vue的异步更新DOM的相关文章

从Vue.js源码看异步更新DOM策略及nextTick

写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出.文章的原地址:https://github.com/answershuto/learnVue.在学习过程中,为Vue加上了中文的注释https://github.com/answershuto/learnVue/tree/master/vue-src,希望可以对其他想学习Vue源码的小伙伴有所帮助.可能会有理解存在偏差的地方,欢迎提issue指出,共同学

【Vue】详解Vue生命周期

Vue实例的生命周期全过程(图) (这里的红边圆角矩形内的都是对应的Vue实例的钩子函数) 在beforeCreate和created钩子函数间的生命周期 在beforeCreate和created之间,进行数据观测(data observer) ,也就是在这个时候开始监控data中的数据变化了,同时初始化事件 created钩子函数和beforeMount间的生命周期 对于created钩子函数和beforeMount间可能会让人感到有些迷惑,下面我就来解释一下: el选项的有无对生命周期过程

vue实战(一):利用vue与ajax实现增删改查

vue实战(一):利用vue与ajax实现增删改查: <%@ page pageEncoding="UTF-8" language="java" %> <%@ include file="../commons/taglib.jsp" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.

vue使用ECharts时的异步更新与数据加载

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 24.0px "Helvetica Neue"; color: #404040 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px "Helvetica Neue"; color: #737373 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco

【Vue】详解Vue组件系统

Vue渲染的两大基础方式 new 一个Vue的实例 这个我们一般会使用在挂载根节点这一初始化操作上: new Vue({ el: '#app' }) 注册组件并使用 通过Vue.component()去注册一个组件,你就可以全局地使用它了,具体体现在每个被new的 Vue 实例/注册组件, 的template选项属性或者对应的DOM模板中,去直接使用 注册组件 全局注册 例如,放在通过new创建的Vue实例当中: Vue.component('my-component', { template:

vue之理解异步更新 --- nextTick

默认情况下,vue中DOM的更新是异步执行的,理解这一点非常重要. 当侦测到数据变化时,Vue会打开一个队列,然后把在同一个事件循环(event loop)当中观察到的数据变化的watcher推送进入这个队列,加入一个watcher在一个事件循环中被触发了多次,它只会被推送到队列中一次, 然后在进入下一次的事件循环时,Vue会清空队列并进行必要的DOM更新,.在内部,Vue 会使用 MutationObserver 来实现队列的异步处理,如果不支持则会回退到 setTimeout(fn, 0).

vue+vuex+axios+echarts画一个动态更新的中国地图

一. 生成项目及安装插件 # 安装vue-cli npm install vue-cli -g # 初始化项目 vue init webpack china-map # 切到目录下 cd china-map # 安装项目依赖 npm install # 安装 vuex npm install vuex --save # 安装 axios npm install axios --save # 安装 ECharts npm install echarts --save 二. 项目结构 ├── ind

Vue.js根据列表某列值更新filter

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script src="../Scripts/jquery-1.10.2.min.js"></script> </head> <body> <div id="matchList"

vue之旅:初识vue

vue是一个mvvm框架(库),和angular类似比较容易上手.小巧 mvc:Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写 而vue是mvvm,m有了,v有了,vm相当于c vue指令  v-xxx 其实vue就是一片html代码配合上json,再new出来vue实例 适合:移动端项目,小巧 目前vue的发展势头很猛,github上的start数量已经超越angular 注意:与angular的共同点:不兼容低版本ie