Vue监视数据的原理详解

 更新时间:2022年02月24日 16:49:39   作者:Tree_wws  
这篇文章主要为大家详细介绍了Vue监视数据的原理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

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过滤器实现日期格式化的案例分析

    vue过滤器实现日期格式化的案例分析

    这篇文章主要介绍了vue过滤器实现日期格式化的案例分析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 关于Vue虚拟dom问题

    关于Vue虚拟dom问题

    这篇文章主要介绍了Python合成Excel表的实现代码(多sheet),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • vue中使用ts配置的具体步骤

    vue中使用ts配置的具体步骤

    这篇文章主要介绍了vue中使用ts配置的具体步骤,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Element Card 卡片的具体使用

    Element Card 卡片的具体使用

    这篇文章主要介绍了Element Card 卡片的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 详解VUE Element-UI多级菜单动态渲染的组件

    详解VUE Element-UI多级菜单动态渲染的组件

    这篇文章主要介绍了VUE Element-UI多级菜单动态渲染的组件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Vue+axios使用FormData方式向后端发送数据

    Vue+axios使用FormData方式向后端发送数据

    在前后端分离的项目中经常使用到Vue+axios通过FormData的方式向后端发送表单数据,下面就来介绍一下如何实现,感兴趣的可以了解一下
    2023-09-09
  • vue登录页面设置验证码input框的方法

    vue登录页面设置验证码input框的方法

    这篇文章主要为大家详细介绍了vue登录页面设置验证码input框的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Vue的移动端多图上传插件vue-easy-uploader的示例代码

    Vue的移动端多图上传插件vue-easy-uploader的示例代码

    这篇文章主要介绍了Vue的移动端多图上传插件vue-easy-uploader的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 源码剖析Vue3中如何进行错误处理

    源码剖析Vue3中如何进行错误处理

    错误处理是框架设计的核心要素之一,框架的错误处理好坏,直接决定用户应用程序的健壮性以及用户开发应用时处理错误的心智负担,本文将从源码入手,剖析一下Vue3中是如何进行错误处理的,需要的可以参考下
    2024-01-01
  • vue生命周期四个阶段created和mount详解

    vue生命周期四个阶段created和mount详解

    这篇文章主要介绍了vue生命周期四个阶段created和mount,本文给大家介绍的非常详细,补充介绍了什么是实例,什么是实例被挂载到DOM,什么是dom,dao操作又是什么,感兴趣的朋友跟随小编一起看看吧
    2024-02-02

最新评论