Vue监视数据的原理详解


Posted in Vue.js onFebruary 24, 2022

1. Vue监视数据的原理(set方法)

1.1 Vue监视不同类型数据的原理

特点:vue会监视data中所有层级的数据,并且如果他检测到是对象那么就会给对象里面所有的属性配置getter和setter函数

1.1.1 如何监测对象中的数据?

通过setter实现监视,且要在new Vue时就传入要监测的数据

​(1).对象中后追加的属性,Vue默认不做响应式处理(就是没有配置getter和setter函数)

(2).如需给后添加的属性做响应式,请使用如下API:

​ Vue.set(target,propertyName/index,value) 

​ vm.$set(target,propertyName/index,value)

1.1.2 如何监测数组中的数据?

通过包裹数组更新元素的方法实现,本质就是做了两件事:

(1). 调用原生对应的方法对数组进行更新。

		(2). 重新解析模板,进而更新页面。

在Vue修改数组中的某个元素一定要用如下方法:

​ (1). 使用这些API:push()pop()shift()unshift()splice()sort()reverse()

​ (2). Vue.set() 或 vm.$set()

1.1.3 小案例

<div id="root">
        <h2>人员信息</h2>
        <button @click="updatep">点击更新马东梅的信息</button>
        <ul>
            <li v-for='p in person' :key="p.id">
                {{p.name}} -- {{p.age}} -- {{p.gender}}
            </li>
        </ul>
        <button @click="addNew">在结尾添加一个人的信息</button>
    </div>

    <script>
        Vue.config.productionTip = false
        let vm = new Vue({
            el: '#root',
            data: {
                person: [
                    { id: "001", name: "马冬梅", age: 20, gender: "女" },
                    { id: "002", name: "夏洛特", age: 33, gender: "男" },
                    { id: "003", name: "沈腾", age: 50, gender: "男" },
                    { id: "004", name: "贾玲", age: 45, gender: "女" },
                ]
            },
            methods: {
                updatep() {            
                    // 但是下面方法不奏效,此方法Vue检测不到,
                    // 原因是因为数组上面没有getter和setter方法所以检测不到数据发生改变
                    // this.person[0] = {id:"001",name:"李焕英",age:66,gender:"女"}

                    // 下面方法奏效,是因为属性上面已经配置了getter和setter方法
                    // this.person[0].name = "李焕英"
                    // this.person[0].age = "66"
                    // this.person[0].gender = "女"

                    //  this.person.splice(0, 1, { id: "001", name: "李焕英", age: 66, gender: "女" }) 

                    this.$set(this.person, 0, { id: "001", name: "李焕英", age: 66, gender: "女" })
                },
                addNew() {
                    this.person.push({id: "005", name: "老妹啊", age: 99, gender: "女"})
                }
            },

        })
    </script>

1.1.4 set()小案例

<div id="root">
        <h2>学生信息</h2>
        <p>姓名:{{student.name}}</p>

        <!-- 
            一个很重要的点:如果是查找对象中不存在的属性,返回的是一个undefined
            不管v-show或者是v-if,如果等到undefined的就不显示
         -->
        <p v-show="student.sex">性别:{{student.sex}}</p>
        <p>年龄:{{student.age}}</p>
        <p>地址:{{student.address}}</p>
        <p>联系方式:{{student.contact}}</p>
        朋友:<p v-for="(v,index) in student.friends" :key="index">{{v.name}} -- {{v.age}}</p>
        <button @click="add">点击添加性别</button>
    </div>

    <script>
        Vue.config.productionTip = false
        let vm = new Vue({
            el: '#root',
            data: {
                student: {
                    name: "Jack",
                    age: 18,
                    address: "北京",
                    contact: "13xxxxxxx56",
                    friends: [
                        { name: 'Mark', age: 12 },
                        { name: 'Lisa', age: 52 },
                        { name: 'Guli', age: 25 },
                    ]
                }
            },
            methods: {
                add() {
                两种写法都可以
                    // this.$set(vm.student,"sex","男")
                    Vue.set(this.student,"sex","男")
                }
            },
        })
    </script>

总结

以上就是今天要讲的内容,本文介绍了Vue监视数据的原理和set方法,该部分很重要需要好好理解,希望对大家有所帮助!

Vue.js 相关文章推荐
vue使用vant中的checkbox实现全选功能
Nov 17 Vue.js
Vue实现购物小球抛物线的方法实例
Nov 22 Vue.js
在Vue中使用CSS3实现内容无缝滚动的示例代码
Nov 27 Vue.js
Vue实现手机号、验证码登录(60s禁用倒计时)
Dec 19 Vue.js
如何使用vue3打造一个物料库
May 08 Vue.js
vue实现可拖拽的dialog弹框
May 13 Vue.js
如何用vue实现网页截图你知道吗
Nov 17 Vue.js
Vue全局事件总线你了解吗
Feb 24 Vue.js
VUE使用draggable实现组件拖拽
Apr 06 Vue.js
vue3.0 数字翻牌组件的使用方法详解
Apr 20 Vue.js
vue ant design 封装弹窗表单的使用
Jun 01 Vue.js
Vue 打包后相对路径的引用问题
Jun 05 Vue.js
Vue的列表之渲染,排序,过滤详解
Vue3如何理解ref toRef和toRefs的区别
Feb 18 #Vue.js
Vue h函数的使用详解
Feb 18 #Vue.js
详解Vue中$props、$attrs和$listeners的使用方法
Feb 18 #Vue.js
前端vue+express实现文件的上传下载示例
一篇文章告诉你如何实现Vue前端分页和后端分页
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 #Vue.js
You might like
php 中文处理函数集合
2008/08/27 PHP
php MessagePack介绍
2013/10/06 PHP
php中strtotime函数用法详解
2014/11/15 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
2020/10/30 PHP
理解JavaScript中的事件
2006/09/23 Javascript
javascript delete 使用示例代码
2010/03/29 Javascript
基于jQuery的实现简单的分页控件
2010/10/10 Javascript
网页加载时页面显示进度条加载完成之后显示网页内容
2012/12/23 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
2013/04/15 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
2013/12/17 Javascript
通过url查找a元素应用案例
2014/04/29 Javascript
js使用post 方式打开新窗口
2015/02/26 Javascript
js实现简单的可切换选项卡效果
2015/04/10 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
JavaScript中的继承之类继承
2016/05/01 Javascript
jQuery 3.0中存在问题及解决办法
2016/07/15 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
详解koa2学习中使用 async 、await、promise解决异步的问题
2018/11/13 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
[01:00:30]TFT vs VGJ.T Supermajor 败者组 BO3 第一场 6.5
2018/06/06 DOTA
Python实现过滤单个Android程序日志脚本分享
2015/01/16 Python
在Python程序中操作文件之isatty()方法的使用教程
2015/05/24 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
css3.0新属性效果在ie下的解决方案
2010/05/10 HTML / CSS
利用 Canvas实现绘画一个未闭合的带进度条的圆环
2019/07/26 HTML / CSS
国际象棋商店:The Chess Store
2018/07/09 全球购物
C,C++的几个面试题小集
2013/07/13 面试题
办公文员的工作岗位职责
2013/11/12 职场文书
2014年小学元旦活动方案
2014/02/12 职场文书
写求职信有什么意义
2014/02/17 职场文书
市场营销管理毕业生自荐信
2014/03/03 职场文书
读书活动总结
2014/04/28 职场文书
政府信息公开实施方案
2014/05/09 职场文书
面试自我评价范文
2014/09/17 职场文书
Windows server 2003卸载和安装IIS的图文教程
2022/07/15 Servers