Vue在监听到数据改变或者dom元素渲染完之后执行的回调函数

在使用vue开发时遇到了一个问题,修改玩vue的data数据之后,操作dom,却发现没有改变,操作的dom还是之前的dom,后来在测试延时操作dom发现可以实现操作更新之后的dom了。

从网上查询资料发现是vue对象在更改完值之后然后去渲染dom元素,我执行的代码发生在了vue还没渲染完成的时候,因此会拿不到更新后的dom,解决办法为使用 $nextTick()方法,这是vue在值改变时进行dom渲染完成之后的回调函数。
在这里插入图片描述
在这里插入图片描述


var myVue = new Vue({
 el:'#app',
 data:{
  	// 最近浏览的项目列表
   historyProjects: []
 },
 methods:{
  reloadHistoryProjects() {
    let data;
    visitPhHisList(data).then(response => {
        if (response.status == 200) {
            this.historyProjects = response.data.data;
            this.$nextTick(function() {
                // 设置第一个历史项目菜单选中
                this.setFirstHistoryProjectMenuSelected()
            })
        } else {
            this.$coralMessage({msg: "读取最近浏览历史项目数据异常", type: "error"})
        }
    }).catch(error => {
        console.log(error);
    });
  },
  setFirstHistoryProjectMenuSelected(){
      let historyCnt = document.querySelectorAll("#historyProjectsGroup ul .el-menu-item").length;
       if (historyCnt > 0) {
           document.querySelectorAll("#historyProjectsGroup ul .el-menu-item").forEach(item =>
               item.classList.remove("is-active")
           )
       }
       // 选中第一个历史浏览项目菜单
       document.querySelector("#historyProjectsGroup>ul>div>li").classList.add("is-active");
   }
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用`watch`监听父组件传递给子组件的接口数据,当数据加载成后,触发一个回调函数,在回调函数中使用`$nextTick`获取DOM元素的`offsetWidth`。 具体实现可以参考以下代码: ```javascript // 子组件 export default { props: { apiData: { type: Object, required: true } }, data() { return { isApiDataLoaded: false // 标记接口数据是否已加载 } }, watch: { apiData: { handler(newVal, oldVal) { if (newVal && !oldVal) { // 数据从未加载到已加载成 this.isApiDataLoaded = true this.$nextTick(() => { const offsetWidth = this.$refs.myElement.offsetWidth console.log(offsetWidth) }) } }, deep: true // 深度监听对象数据的变化 } } } ``` 在上面的代码中,首先在子组件的`props`中定义了一个名为`apiData`的属性,该属性用于接收父组件传递过来的接口数据。然后在`data`中定义了一个名为`isApiDataLoaded`的属性,用于标记接口数据是否已加载。接下来,在`watch`中监听`apiData`属性的变化,并在数据从未加载到已加载成时触发一个回调函数。在回调函数中,首先将`isApiDataLoaded`属性设置为`true`,然后使用`$nextTick`获取DOM元素的`offsetWidth`,并输出到控制台中。 需要注意的是,由于DOM元素是在组件渲染成后才能获取到,因此需要在`$nextTick`中获取DOM元素的`offsetWidth`。同时,由于`$nextTick`是异步执行的,因此需要先将`isApiDataLoaded`属性设置为`true`,避免在数据加载成前就执行`$nextTick`的回调函数
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值