当前位置: 代码网 > it编程>前端脚本>Vue.js > vue elementui异步给dom赋值无效问题

vue elementui异步给dom赋值无效问题

2024年06月10日 Vue.js 我要评论
vue elementui异步给dom赋值无效最近在研究el-admin,角色管理里面有个功能是点击左侧的表格里面的一个角色,右侧的树就会自动初始化。于是我在点击的方法里面,去后台异步调用了一下接口,

vue elementui异步给dom赋值无效

最近在研究el-admin,角色管理里面有个功能是点击左侧的表格里面的一个角色,右侧的树就会自动初始化。

于是我在点击的方法里面,去后台异步调用了一下接口,然后返回数据并把数据赋值给menuids,但是我发现这个异步请求获取到的数据压根就不能让树控件刷新。

代码如下:

我是在handlecurrentchange里面操作的,网上说通过push方法能够起作用,但是根本没用,最后我的解决方法如下,先将ids都存储起来,然后再在nexttick方法里面去给menuids赋值。

async initmenus(val) {
      this.menuids = []
      const av = window.av
      const role = av.object.createwithoutdata('role', val.objectid);
      const rolemenuquery = new av.query('rolemenu');
      rolemenuquery.equalto("role", role)
      rolemenuquery.include("menu")
      var rolemenus = await rolemenuquery.find()
      var ids = [];
      rolemenus.foreach(rolemenu => {
        var rolemenujson = rolemenu.tojson()
        ids.push(rolemenujson.menu.menuid)
      })
      this.$nexttick(() => {
        this.menuids = ids;
      })
      // https://blog.csdn.net/xudalin/article/details/103158941
      // 这个代码解决了树控件的半选问题。参考链接如上
      /*ids.foreach((i, n) => {
        var node = this.$refs.menu.getnode(i);
        console.log(node.isleaf)
        if (node.isleaf) {
          this.$refs.menu.setchecked(node, true);
        }
      });*/
    },
    // 触发单选
    handlecurrentchange(val) {
      console.log("handlecurrentchange")
      if (val) {
        const _this = this
        // 清空菜单的选中
        this.$refs.menu.setcheckedkeys([])
        // 保存当前的角色id
        this.currentid = val.id
        // this.showbutton = this.level <= val.level
        // 初始化
        this.initmenus(val)
        // 菜单数据需要特殊处理
        /*val.menus.foreach(function (data, index) {
          _this.menuids.push(data.id)
        })*/
      }
    },

vue elementui前端异步方法转同步

elementui的表单验证功能

表单验证方法如果传入回调函数时是异步的

// 子组件的方法
validateform(){
      this.$refs.jsoneditor.getref("form").validate((valid, hints) => {
        return {valid: valid, hints: hints}
      })
}
 
// 父组件调用,会发现校验结果,hints为undefine
submitall(){
      this.$refs.resourceeditorref.foreach((item, index) => {
        console.log(item.validateform())
      })
}

修改成同步的

// 子组件方法
validateform(){
      // this.$refs.jsoneditor.getref("form").validate((valid, hints) => {
      //   return {valid: valid, hints: hints}
      // })
      // return new promise((resolve, reject) => {
      //   this.$refs.jsoneditor.getref("form").validate((valid, hints) => {
      //     resolve({valid, hints})
      //   })
      // })
      //或者根据官网文档说明可以不传入回调函数,直接validate
      return this.$refs.jsoneditor.getref("form").validate
    },
 
// 父组件调用
submitall(){
      // this.$refs.resourceeditorref.foreach((item, index) => {
      //   console.log("校验结果", item.validateform())
      // })
      this.$refs.resourceeditorref.foreach(async (item, index) => {
        let {valid, hints} = await item.validateform()
        console.info(valid, hints)
        console.log("校验结果", hints)
      })
}

但是其实上面 submitall 的 foreach 是有问题, 需要改成传统的for遍历, 因为 foreach 的入参是一个回调函数 , 简单的说就是执行 foreach 后会马上执行foreach后面的代码

所以修改成普通的for , 使用普通 for 循环的时候有需要多包一层

// 子组件方法
validateform(){
      //或者根据官网文档说明可以不传入回调函数,直接validate
      return this.$refs.jsoneditor.getref("form").validate
    }
 
//父组件调用
submitall(){
      (async () => {
        let submitallform = {};
        for (let index = 0; index < this.$refs.resourceeditorref.length; index++) {
          const item = this.$refs.resourceeditorref[index]
          await item.validateform().then(res => {
            console.log("表单校验",res)
          }).catch(res => {
            console.log("表单校验catch",res)
            if(res == false){
              this.$message({ type: "error", message: "表单校验失败" });
              // 有一个校验失败则直接返回
              return;
            }
          })
        }
        //后续操作
        
      })()
}

或者

// 子组件方法
validateform(){
      return new promise((resolve, reject) => {
        this.$refs.jsoneditor.getref("form").validate((valid, hints) => {
          resolve({valid, hints})
        })
      })
}
 
// 父调用
submitall(){
      (async () => {
        let submitallform = {};
        for (let index = 0; index < this.$refs.resourceeditorref.length; index++) {
          const item = this.$refs.resourceeditorref[index]
          let {valid, hints} = await item.validateform();
          console.log("表单校验valid",valid)
          console.log("表单校验hints",hints)
          debugger
        }
        //后续操作
        debugger
      })()
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com