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 相关文章推荐
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
Dec 02 Vue.js
实用的 vue tags 创建缓存导航的过程实现
Dec 03 Vue.js
Vue如何实现验证码输入交互
Dec 07 Vue.js
Vue解决移动端弹窗滚动穿透问题
Dec 15 Vue.js
vue 实现图片懒加载功能
Dec 31 Vue.js
jenkins自动构建发布vue项目的方法步骤
Jan 04 Vue.js
通过vue.extend实现消息提示弹框的方法记录
Jan 07 Vue.js
vue-resource 拦截器interceptors使用详解
Jan 18 Vue.js
Vue2.x-使用防抖以及节流的示例
Mar 02 Vue.js
Vue自定义铃声提示音组件的实现
Jan 22 Vue.js
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 Vue.js
vue中使用mockjs配置和使用方式
Apr 06 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中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
实测在class的function中include的文件中非php的global全局环境
2013/07/15 PHP
php阿拉伯数字转中文人民币大写
2015/12/21 PHP
PHP实现的二分查找算法实例分析
2017/12/19 PHP
js自带函数备忘 数组
2006/12/29 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
2013/11/22 Javascript
jquery用data方法获取某个元素上的事件
2014/06/23 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
2016/12/26 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
2017/06/13 Javascript
Three.js如何实现雾化效果示例代码
2017/09/27 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
2019/01/04 Javascript
js实现滚动条自动滚动
2020/12/13 Javascript
JavaScript实现手风琴效果
2021/02/18 Javascript
[01:03:22]LGD vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
举例讲解Python中的Null模式与桥接模式编程
2016/02/02 Python
python数据处理实战(必看篇)
2017/06/11 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
python处理“
2019/06/10 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
2019/06/19 Python
Python 函数绘图及函数图像微分与积分
2019/11/20 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
Ejb技术面试题
2015/04/29 面试题
职专应届生求职信
2013/11/16 职场文书
行政主管职责范本
2014/03/07 职场文书
六一儿童节主持词
2014/03/21 职场文书
图书室标语
2014/06/21 职场文书
中秋节国旗下演讲稿
2014/09/13 职场文书
领导干部作风建设剖析材料
2014/10/11 职场文书
企业党建工作总结2015
2015/05/26 职场文书
离婚律师函范本
2015/05/27 职场文书