Vue数据动态代理机制的实现以及响应式与数据劫持

简介: Vue数据动态代理机制的实现以及响应式与数据劫持

1.Object.defineProperty()

(1)这个方法是ES5新增的

(2)这个方法的作用是:给对象新增属性,或者设置对象原有的属性

(3)用法:Object.defineProperty(给哪个对象新增属性,‘新增的属性名是什么’,{给新增的属性设置相关的配置项key:value对})

补充:配置项有哪些?

①value配置项:给属性指定值

②writable配置项:设置该属性的值是否可以修改。true表示可以修改,false表示不能修改

③getter方法 配置项:不需要我们手动调用。当读取属性值的时候,getter方法被自动调用。

a.getter方法的返回值非常重要,这个返回值就代表这个属性它的值。

④setter方法 配置项:不需要我们手动调用。当修改属性值的时候,setter方法被自动调用。

a.setter方法上有一个参数,这个参数可以接收传过来的值

⑤当配置项当中有setter和getter的时候,value和writable配置项都不能写

<body>
    <script>
        //  一个普通对象 
        let phone = {}
        // 临时变量 
        let temp;
        // 给上面的phone对象新增一个color属性
        Object.defineProperty(phone, 'color', {
            // value: '太空侠',
            // writable: true,
            get: function () {
                console.log('getter方法执行了');
                return temp;
            },
            set: function (val) {
                console.log('setter方法执行了');
                temp = val;
            }
        })
    </script>
</body>

2.数据代理机制的实现

(1)什么是数据代理机制?

通过访问代理对象的属性来间接访问目标对象的属性。数据代理机制的实现需要依靠:Object.defineProperty()方法

(2)ES6新特性:在对象中的函数/方法 :function是可以省略的

<body>
    <script>
        //  目标对象 
        let target = {
            name : 'zhangsan'
        }
        // 代理对象 
        let proxy = {}
        // 如果要实现数据代理机制的话,就需要给proxy新增一个name属性
        // 注意:代理对象新增的这个属性的名字 和 目标对象的属性名要一致
        Object.defineProperty(proxy, 'name', {
            get: function () {
            //   间接访问目标对象的属性
                return target.name;
            },
            set: function (val) {
                target.name = val;
            }
        })
    </script>
</body>

(3)属性名有(…)的代表是代理对象

3.响应式与数据劫持

3.1什么是响应式?

(1)修改data后,页面自动改变/刷新。这就是响应式。就像我们在使用excel的时候,修改一个单元格中的数据,

其它单元格的数据会联动更新,这也是响应式。

(2)属性名有(…)的就是响应式

(3)数据代理中getter和setter对应着什么?

数据代理:getter

数据劫持:setter

3.2 Vue 的响应式是如何实现的?

(1)数据劫持:Vue底层使用了Object.defineProperty,配置了setter 方法,当去修改属性值时setter方法则被自

动调用,setter 方法中不仅修改了属性值,而且还做了其他的事情,例如:重新渲染页面。setter方法就像半路劫

持一样,所以称为数据劫持。

(2)Vue 会给data中所有的属性,以及data属性中的属性,都会添加响应式。

(3)后期给vue实例动态追加的属性并没有添加响应式处理

<body>
    <div id="app"></div>
    <script>
        const vm = new Vue({
            el: '#app',
            data: {
                msg: '响应式与数据劫持',
                name: 'jsckson',
                age: 20,
                a: {
                    b: {
                        c: 1
                    }
                }
            }
        })
        // 后期给vue实例动态追加的属性并没有添加响应式处理
        vm.$data.a.email = 'jackson@126.com' 
    </script>
</body>

(4)后期添加的属性,不会有响应式,怎么处理?

①Vue.set(目标对象,‘属性名’, 值)

②vm.$set(目标对象,‘属性名’, 值)

<body>
    <div id="app"></div>
    <script>
        const vm = new Vue({
            el: '#app',
            data: {
                msg: '响应式与数据劫持',
                name: 'jsckson',
                age: 20,
                a: {
                    b: {
                        c: 1
                    }
                }
            }
        })
        // Vue.set(vm.a,'email','3312@qq.com')
        vm.$set(vm.a,'email','331245@qq.com')
    </script>
</body>

(5)不能直接给vm追加响应式属性,如:Vue.set(vm,‘x’,‘1’)

(6) Vue 没有给数组下标0,1,2,3…添加响应式,怎么处理?

调用Vue提供的7个API:

push()

pop()

reverse()

splice()

shift()

unshift()

sort()

目录
相关文章
|
2天前
|
数据采集 JavaScript 前端开发
Vue框架的优缺点是什么
【7月更文挑战第5天】 Vue框架:组件化开发利于重用与扩展,响应式数据绑定简化状态管理;学习曲线平缓,生态系统丰富,集成便捷,且具性能优化手段。缺点包括社区规模相对小,类型支持不足(Vue 3.x改善),路由和状态管理需额外配置,SEO支持有限。随着发展,部分缺点正被克服。
8 1
|
2天前
|
JavaScript
Vue卸载eslint的写法,单独安装eslint,单独卸载eslint
Vue卸载eslint的写法,单独安装eslint,单独卸载eslint
|
2天前
|
JavaScript
青戈大佬安装Vue,无Eslint安装版,vue2安装,vue2无eslint,最简单配置Vue安装资料
青戈大佬安装Vue,无Eslint安装版,vue2安装,vue2无eslint,最简单配置Vue安装资料
|
2天前
|
JavaScript
This dependency was not found:* vue/types/umd in ./src/router/index.jsTo install it, you can run
This dependency was not found:* vue/types/umd in ./src/router/index.jsTo install it, you can run
This dependency was not found:* vue/types/umd in ./src/router/index.jsTo install it, you can run
|
2天前
|
JavaScript 前端开发 开发工具
如何学习vue框架
【7月更文挑战第5天】 - 先学HTML/CSS/JS基础和前端工程化工具(npm, webpack, Git)。 - 从Vue官方文档学习基础,包括指令、组件、响应式系统。 - 深入研究Vue Router和Vuex,掌握路由管理和状态管理。 - 学习自定义指令和Mixins,优化性能技巧。 - 实战项目练习,加入Vue社区,阅读相关资源,提升技能。 - 关注Vue生态,持续实践和创新,以适应不断发展的框架。
6 0
|
JavaScript 测试技术 容器
Vue2+VueRouter2+webpack 构建项目
1). 安装Node环境和npm包管理工具 检测版本 node -v npm -v 图1.png 2). 安装vue-cli(vue脚手架) npm install -g vue-cli --registry=https://registry.
1009 0
|
3天前
|
JavaScript 区块链
vue 自定义网页图标 favicon.ico 和 网页标题
vue 自定义网页图标 favicon.ico 和 网页标题
10 1
|
4天前
|
存储 JavaScript 数据安全/隐私保护
vue实战——登录【详解】(含自适配全屏背景,记住账号--支持多账号,显隐密码切换,登录状态保持)
vue实战——登录【详解】(含自适配全屏背景,记住账号--支持多账号,显隐密码切换,登录状态保持)
14 1
|
4天前
|
JavaScript
vue实战——404页面模板001——男女手电筒动画
vue实战——404页面模板001——男女手电筒动画
12 1
|
2天前
|
缓存 JavaScript 算法
vue 性能优化
vue 性能优化
12 0