Vue.set()和this.$set()介绍 && element progress实时更新

2023-05-16

在我们使用vue进行开发的过程中,可能会遇到一种情况:当生成vue实例后,当再次给数据赋值时,有时候并不会自动更新到视图上去; 当我们去看vue文档的时候,会发现有这么一句话:如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。
在使用el-progress组件实现实时进度条时遇到了这个问题。基本环境是,在el-table中有很多col列,其中有一列表示各行元素的进度条。实际上就是tableData存储了所有被表格展示的信息。通过改变该tableData数组来更新表格显示信息,问题在于更新的方式,如果直接使用下标tableData[i].progress = value来更新数据的值,确实能够修改值本身,但是Vue.js并不能感知到数据的变化,以至于其渲染的进度条不会发生动态改变,值得一提的是,如果修改的是vue渲染之外的普通列数据,比如一个文本,那么是可以看到实时变化的,同时,如果修改了表格的其他值成功了,那么vue会因为更新了表格,而去检查tableData进度条有关参数的改变,进而有了使用下标也能更新渲染进度条的效果,本质其实就是:
受 ES5 的限制,Vue.js 不能检测到对象属性的添加或删除。因为 Vue.js 在初始化实例时将属性转为 getter/setter,所以属性必须在 data 对象上才能让 Vue.js 转换它,才能让它是响应的。
正确写法:this.$set(this.data,”key”,value’)

data () {
  return {
    student: {
      name: '',
      sex: ''
    }
  }
}
mounted () { // ——钩子函数,实例挂载之后
  this.student.age = 24
}

必须用以下写法才能使vue感知到数据的变化。

mounted () {
  this.$set(this.student,"age", 24)
}

Vue 不允许动态添加根级响应式属性。

const app = new Vue({
  data: {
    a: 1
  }
  // render: h => h(Suduko)
}).$mount('#app1')
Vue.set(app.data, 'b', 2)

在这里插入图片描述
只可以使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式属性,例如

var vm=new Vue({
    el:'#test',
    data:{
        //data中已经存在info根属性
        info:{
            name:'小明';
        }
    }
});
//给info添加一个性别属性
Vue.set(vm.info,'sex','男');

参考原文链接https://juejin.im/post/6844903901175496711

至于element使用的进度条组件,我随机选了一个将进度文本值嵌入进度条的样式:

<el-progress :text-inside="true" :stroke-width="26" :percentage="70"></el-progress>
<el-progress :text-inside="true" :stroke-width="24" :percentage="100" status="success"></el-progress>
<el-progress :text-inside="true" :stroke-width="22" :percentage="80" status="warning"></el-progress>
<el-progress :text-inside="true" :stroke-width="20" :percentage="50" status="exception"></el-progress>

在这里插入图片描述
可以在代码中以及文档里看到各个参数的意义:
https://element.eleme.cn/#/zh-CN/component/progress
我们需要实时修改的可能就是color,根据进度程度改变进度条颜色,或是status,实际上这两个参数基本效果一致,只不过color更自由,可以选择更多颜色,而status则是懒人选择的直接根据状态修改颜色。

最重要的百分比参数是需要实时修改的,也是容器渲染需要感受更新的参数。

我们将百分比以及其他要显示的数据装入tableData,可以写一个函数向后端发出请求,获取当前时间点实时的进度比率或是其他可以表示进度的数值,比如一个函数updateProgress,然后调用setInterval(this.updateProgress, 1500)函数每隔一段时间进行一次请求,实现实时更新。该函数周期执行,第一个参数是被周期执行的函数,也就是我们的请求进度函数,第二个参数是周期实现,单位是毫秒,也就是说样例的意思是每1.5秒执行一次更新进度的请求函数。同时更新进度条百分比,注意这里的更新进度条百分比就是上面所说的更新方式,一定要用vue能感知到的方式进行更新,updateProgress函数大概长这样:

updateProgress: function() {
  axios.post('/v1/progress', this.getRunningTask(this.tableData)).then( (res) => {
       for(let i = 0; i < this.pageSize; i++){
           if(this.tableData[i].state === 'running'){
               let data = this.tableData[i]
               data.progress = res.data[this.tableData[i].task_id]
               if(data.progress >= 25 && data.progress < 50){
                   data.pro_status = "#E6A23C"
               }
               else if(data.progress >= 50 && data.progress < 75){
                   data.pro_status = "#409EFF"
               }
               else if(data.progress >= 75 && data.progress < 100){
                   data.pro_status = "#3AC2B0"
               }
               else if(this.tableData[i].progress === null){
                   data.progress = 100
                   data.state = "complete"
               }
               this.$set(this.tableData, i, data)
               console.log(data.progress, res.data[this.tableData[i].task_id], data.pro_status)
           }
       }
   })
},

该函数应该放在vue 的methods里,而周期更新的函数应该放在mounted里,在vue生命周期中表示在这段周期中开始不断请求
在这里插入图片描述

注意要在最后销毁清空掉该周期执行函数

beforeMount: function(){
 this.initiateProgress();
},
mounted: function() {
    console.log('this', this)
    this.timer = setInterval(this.updateProgress, 1500)
},
beforeDestroy: function () {
    clearInterval(this.timer);
},

最后放上vue官方文档作为重点,没注意时这才是最大的坑

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue.set()和this.$set()介绍 && element progress实时更新 的相关文章

  • Windows下Node多版本管理

    Windows下Node多版本管理 相关指令背景介绍GNVM 相关指令 查看node版本 node v 查看npm版本 span class token function npm span v 查看gnvm版本 gnvm version g
  • Notepad++与NodeJS

    文章目录 背景介绍理论分析实践操作结果展示 背景介绍 前段时间 xff0c 弄了张流量卡 xff0c 感觉线上查询太费劲了 不妙 xff0c 干脆通过NodeJS写个小软件来 xff0c 实时查询 程序员 xff0c 就是要方便自己嘛 哎
  • 傻瓜式Linpack安装(Mpich+Openblas+Hpl)

    Linpack安装 安装信息安装Mpich安装Openblas安装Hpl 参考资料 Linpack安装 安装信息 安装平台是Ubuntu16 04使用的是Mpich 43 Openblas 43 HplCPU架构为 Intel Nehale
  • [洛谷]P1591 阶乘数码 (#高精度 -1.2)

    题目描述 求n 中某个数码出现的次数 输入输出格式 输入格式 xff1a 第一行为t 10 xff0c 表示数据组数 接下来t行 xff0c 每行一个正整数n 1000 和数码a 输出格式 xff1a 对于每组数据 xff0c 输出一个整数
  • Ubuntu下Java安装(傻瓜式)

    准备安装Java xff0c 简单记录一下 xff1a 分为三步 Java安装Java环境配置测试Hello World xff01 小问题 Java安装 Ubuntu下很简单 xff0c 只需要 JAVA SE下载地址 选择自己的安装平台
  • 简单实现图片转彩色字符画

    在上次的教程中 xff0c 我们只是将图像转换为txt文本文件 xff0c 而txt文本文件是没有颜色的 在显示某些图片的时候 xff0c 我们往往希望可以包含颜色信息 这样图像便显得更加生动 接下来我便教大家如何将图像转换字符画的时候 x
  • 简单实现将GIF图片转换为字符画

    单单只是将静态图转换为字符画 xff0c 功能貌似太过单一 于是 xff0c 小编便想着 xff0c 既然静态图可以转换为字符画 xff0c 那么动态图是否也可以呢 毕竟 xff0c 动态图不也就是许多静态图拼凑在一起生成的吗 xff1f
  • win7/10 使用脱壳插件时 显示bad dos signature

    上次脱壳时使用插件进行脱壳时 xff0c 出现了以下问题 xff1a 出现的原因分析 xff1a 无法读取 xff08 00400000 0045CFFF xff09 内存 xff1a 由于这段内存为只读 权限不够 那么为何会出现上述错误
  • -bash: /usr/bin/cmake: No such file or directory错误

    成功安装cmake后 xff0c 如果出现 bash usr bin cmake No such file or directory xff0c 则可以手动添加 xff0c 找到安装的cmake文件 xff0c 进入cmake3 x文件夹中
  • poj 1716 Integer Intervals 差分约束

    Integer Intervals Time Limit 1000MS Memory Limit 10000K Total Submissions 9285 Accepted 3898 Description An integer inte
  • 机器学习(二)——贝叶斯分类器

    文章目录 1 贝叶斯决策论1 1 贝叶斯判定准则1 2 极大似然估计 2 朴素贝叶斯分类器2 1 拉普拉斯平滑2 2 示例 1 贝叶斯决策论 核心 xff1a 将最小化分类错误率转换为最大化先验概率和类条件概率 xff08 似然 xff09
  • SQLite SQL语句结构详解

    源自 xff1a http tiantian0521 blog 163 com blog static 4172088320109272217796 SQLite SQL语句结构详解 SELECT sql statement 61 SELE
  • conda命令说明

    conda命令说明 1 利用conda升级Anaconda及其包2 conda环境使用基本命令3 频道管理3 1 添加Conda代理和国内镜像3 2 设置Conda环境和缓存的路径3 3 通过pip来管理包 4 克隆环境到新的机器5 ana
  • 解决连接windows堡垒机,远程桌面一闪而逝的问题

    连接windows堡垒机 xff0c 远程桌面一闪而逝 问题分析 xff1a 1 其他机器连接没有问题 2 浏览器版本没有问题 3 直接使用win 10 远程连接出现 34 由于安全设置错误 客户端无法连接到远程计算机 确定你已登录到网络后
  • 新手小白安装aio小主机布置家庭网络-1-proxmox-ve安装

    1 xff0c 安装1 启动u盘 ventoy https www ventoy net cn index html 制作完启动u盘 xff0c 下载虚拟机proxmox 如果是新手小白 xff0c 家庭网络大概率上外网很慢的 用国内源 清
  • WIN10 驱动开发环境从0搭建 (内含调试程序下载 驱动开发必看)

    文章目录 必备调试程序下载 一 VS2019下载安装 二 下载WDK 三 安装WDK 1 下载离线版 2 安装 四 项目配置 1 创建新项目 2 driver c 3 配置 4 报错 1 第一次报错 2 第二次报错 五 VMware下载安装
  • 【kali】kali2020.2安装 超级详细教程

    kali2020 2安装教程 kali下载工作站配置选择类型配置安装客户机操作系统选择操作系统 xff0c 版本命名虚拟机和安装位置指定磁盘大小 xff08 一般是30个G之60个G xff09 编辑虚拟机设置硬件设置 安装kali安装方式
  • sorry,that didn‘t work.please try again 问题的解决

    问题 centos系统图形化界面登录的时候 xff0c 显示sorry xff0c that didnot work xff0c please try again 尝试途径 1 查询到的解决方法 xff0c 是因为大小写的问题 xff0c
  • 修改debian9 stretch源

    修改debian9 stretch源 修改配置文件 etc apt sources list 修改成163源 xff1a deb http span class hljs comment mirrors 163 com debian str
  • 2019年第十届蓝桥杯C/C++A组省赛 题面&部分题解

    前言 题目 amp 做法 第一题 平方和 第二题 数列求值 第三题 最大降雨量 第四题 迷宫 第五题 RSA 解密 第六题 完全二叉树的权值 第七题 外卖店优先级 第八题 修改数组 第九题 糖果 第十题 组合数问题 比赛总结 前言 原题链接

随机推荐