首页 > 其他分享 >16-Vue数据监视

16-Vue数据监视

时间:2023-09-21 17:23:44浏览次数:48  
标签:Vue obj name 16 vm persons 监视 data

我们先探讨一个数据更新时的问题,假设在以下人员列表中,改变"马冬梅"的信息,可以通过什么方法

1)第一种方法(奏效)

数据更新时,方法奏效

this.persons[0].name = "马老师"
this.persons[0].age = 50
this.persons[0].sex = "男"

2)第二种方法(不奏效)

数据更新时,Vue不监听,模板不改变,但通过控制台命令,vm.persons[0].name  发现内部数据已经发生改变

this.persons[0] = {id:"001",name:"马老师",age:50,sex:"男"}

3)第三种方法

 

模拟一个数据监测

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>数据更新时的一个问题</title>
        <!--  引入Vue  -->
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>
    <body>
        <script type="text/javascript">
            // 阻止 vue 在启动时生成生产提示
            Vue.config.productionTip = false

            // 声明一个变量
            let data = {
                name:"马铃薯",
                address:"河北"
            }

            // // 声明一个中间变量
            // let tmp = ""
            // // 定时器方法,每隔一定时间就调用函数,方法或对象
            // setInterval(()=>{
            //     if(data.name !== tmp){
            //         tmp = data.name
            //         console.log("name正在被修改")
            //     }
            // },100)

            // 创建要给监视的实例对象,用于监视 data 中属性的变化
            const obs = new Observer(data)
            console.log(obs)

            // Observer 构造函数
            function Observer(obj){
                // 汇总对象中所有属性,形成一个数组
                const keys = Object.keys(obj)
                // 遍历,forEach() 方法对数组的每个元素执行一次提供的函数
                keys.forEach((k)=>{
                    // Object.defineproperty方法的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性
                    Object.defineProperty(this,k,{
                        get(){
                           return obj[k]
                        },
                        set(val){
                            obj[k] = val
                            console.log(`${k}正在被修改,进行解析模板,生成虚拟DOM...`)
                        }
                    })
                })
            }

            //准备一个 vm 实例对象
            let vm = {}
            vm._data = data = obs

        </script>
    </body>
</html>

 

标签:Vue,obj,name,16,vm,persons,监视,data
From: https://www.cnblogs.com/REN-Murphy/p/17720446.html

相关文章

  • PowerDotNet平台化软件架构设计与实现系列(16):财务平台
    不同行业基本都会有自己独特的业务,甚至同行的不同企业之间的业务逻辑也会相差千里,只有最大程度抽象出通用性、标准性和普适性的系统才能够成为平台系统,平台系统开发的成本和难度可想而知。个人深度参与或独立设计开发过的公共服务型平台系统,主要包括基础数据平台、支付平台、财务......
  • vue通过 v-for循环出来的数组给元素 加不同的颜色
    直接上代码:1<divv-for="(item,i)incolorList":key="i">2<divclass="cmn-color">3<div:style="{'background':item}"></div><span>开发{{i+1}}</span>4</d......
  • CentOS环境 nginx配置vue项目
    ps:这里使用ruoyi-vue-plus项目举例,官网:https://plus-doc.dromara.org/一、配置不带应用路径的vue项目1、打包。首先将vue项目生产配置文件的的应用访问路径设为'/',然后命令行输入runrunbuild:prod进行打包。2、导入环境。将打包文件(dist)拖入CentOS中/usr/local/nginx/html......
  • 9月16日总结
    数据库sql中判断时间冲突数据库现有数据其中两列:s-开始时间,e-结束时间.在新插入数据s',e'之前需要判断两个时间之间是否有重合因为使用mybatis-plus的缘故,结论都使用s或e在符号前面.s<e比如yyyy-MM-ddHH:mm:ss格式的数据,多用于判断预约时间和每日排班冲突......
  • nodejs+vue+element-ui安装
    1.nodejs安装https://www.runoob.com/nodejs/nodejs-install-setup.html2.vue安装nodejs安装以后,使用vue会报错:‘vue‘不是内部或外部命令,也不是可运行的程序解决办法:https://developer.aliyun.com/article/1093401配置vue的环境变量:查看到prefix的值以后,分别......
  • 若依 vue问题
    1.table列对布尔的处理<el-table-columnlabel="是否可见"align="center"prop="activityVisible":formatter="formatActivityVisible"/>formatActivityVisible:function(row,index){letres=''if(r......
  • vue+openlayers绘制线
    绘制线1<template>2<div></div>3</template>4<script>5importVectorLayerfrom'ol/layer/Vector.js';6importVectorSourcefrom'ol/source/Vector.js';7importFeaturefrom'ol/Feature&......
  • arc165F
    arc165F题目描述:给定\(n\)和一个长度为\(2n\)的序列\(a\),满足\([1,n]\)每个数恰好出现两次。每一次操作可以交换相邻的两个数,询问最少多少次操作可以使得序列\(a\)满足\(\foralli\in[1,n]\a_{2\timesi}=a_{2\timesi+1}\)。在保证为最小操作次数的前提下,输出所有......
  • 解析vue项目,scoped,ref属性,混入mixin,插件,Elementui
    0解析一下vue项目......
  • Odoo16.0 支付宝模块
    odoo16.0官方将支付宝模块弃用了,但是需求还在,我们也不太可能去使用推荐的asipay,因此,我们决定,自己手动实现它。安装与配置首先,我们在应用中安装我们的支付宝模块: 安装好之后,我们进入配置界面: 这里对各个参数简单介绍一下:支付宝APPID:我们在支付宝开放平台申请的应用......