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 相关文章推荐
vue3.0实现插件封装
Dec 14 Vue.js
Vue在H5 项目中使用融云进行实时个人单聊通讯
Dec 14 Vue.js
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
Dec 30 Vue.js
vue-cli4.0多环境配置变量与模式详解
Dec 30 Vue.js
Vue仿Bibibili首页的问题
Jan 21 Vue.js
详解vite+ts快速搭建vue3项目以及介绍相关特性
Feb 25 Vue.js
vue使用v-model进行跨组件绑定的基本实现方法
Apr 28 Vue.js
vue+element ui实现锚点定位
Jun 29 Vue.js
Vue的过滤器你真了解吗
Feb 24 Vue.js
浅谈Vue的computed计算属性
Mar 21 Vue.js
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 Vue.js
vue判断按钮是否可以点击
Apr 09 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 获取客户端的真实ip
2009/11/30 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
2010/05/15 PHP
php获取'/'传参的值简单方法
2017/07/13 PHP
ExtJS[Desktop]实现图标换行示例代码
2013/11/17 Javascript
js与jQuery 获取父窗、子窗的iframe
2013/12/20 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
2014/08/27 Javascript
JavaScript实现按Ctrl键打开新页面
2014/09/04 Javascript
jquery实现兼容IE8的异步上传文件
2015/06/15 Javascript
浅析Node.js的Stream模块中的Readable对象
2015/07/29 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
JS实现侧边栏鼠标经过弹出框+缓冲效果
2017/03/29 Javascript
使用vs code开发Nodejs程序的使用方法
2017/09/21 NodeJs
jQuery length 和 size()区别总结
2018/04/26 jQuery
vue中的watch监听数据变化及watch中各属性的详解
2018/09/11 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
vue-cli 目录结构详细讲解总结
2019/01/15 Javascript
Python爬取读者并制作成PDF
2015/03/10 Python
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
Python获取二维矩阵每列最大值的方法
2018/04/03 Python
Python将文本去空格并保存到txt文件中的实例
2018/07/24 Python
Python之变量类型和if判断方式
2020/05/05 Python
基于html5 DeviceOrientation 实现微信摇一摇功能
2015/09/25 HTML / CSS
前端实现背景虚化但内容清晰且自适应 的实例代码
2019/08/01 HTML / CSS
中东地区为妈妈们提供一切的头号购物目的地:Sprii
2018/05/06 全球购物
不同浏览器创建XMLHttpRequest方法有什么不同
2014/11/17 面试题
医院办公室主任职责
2013/12/29 职场文书
英语专业学生个人求职信
2014/01/28 职场文书
大学新生军训方案
2014/05/03 职场文书
植树节标语
2014/06/27 职场文书
党支部书记四风问题整改措施
2014/09/24 职场文书
弘扬焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
酒店销售经理岗位职责
2015/04/02 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
《我要的是葫芦》教学反思
2016/02/18 职场文书
2019年幼儿园管理条例范本!
2019/07/17 职场文书