什么是 Vue及其响应式原理

0 阅读2分钟

vue官网:cn.vuejs.org/

Vue是一套用于构建用户界面的渐进式的、基于MVVM架构模式的JavaScript框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助我们高效地开发用户界面。

1.什么是MVVM架构模式

M:model 数据模型(通俗理解为前端操作的数据)const list = []

V:view 视图(界面)<div></div>

VM:视图模型(连接数据模型与视图,实现数据变化,界面自动更新)

image.png

其他架构模式:

MVC(M:model 数据模型,V:view 视图,C:controller控制器,连接M、V层,还可以处理页面业务逻辑,它接收并处理来自用户的请求,并将Model返回给用户。)java开发

image.png

MVP(M:model 数据模型,V:view 视图,P:presenter表示器,连接M、V层,还可以处理页面业务逻辑。)安卓开发

image.png

2.vue的两个核心功能

声明式渲染:允许使用简洁的模板语法声明式地将数据渲染进dom系统。

响应性:自动跟踪 JavaScript 状态并在其发生变化时响应式地更新 DOM。

3.响应式原理

vue2响应式原理:

采用数据劫持结合发布订阅者模式,通过“Object.defineProperty()”方法来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。

Object.defineProperty()方法的作用:给对象动态添加属性,并且设置getter,setter方法,当属性值改变时,触发getter,setter方法。

弊端:只能单独给一个属性设置getter,setter,如果有多个属性,要循环遍历,如果对象里面还有嵌套,还要递归。


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>响应式原理</title>
</head>

<body>

    <div id="app">
        <p></p>
        <button onclick="bindPlus()">加一</button>
    </div>

    <script>
        const data = {
            count: 0,
            message: 'hello',
            age: 20
        }
        const pEle = document.querySelector('p')
        pEle.innerHTML = data.count

        const vm = {}
        // 将data对象中的所有属性动态绑定到vm对象上,并且设置getter,setter方法
        for (var key in data) {
            // console.log('key ', key);
            Object.defineProperty(vm, key, {
                get() {
                    console.log('get >>.');
                    return data[key]
                },

                set(newValue) {
                    console.log('set>>>')
                    data[key] = newValue
                    pEle.innerHTML = data[key]
                }
            })
        }

        //闭包
        // Object.keys(data).forEach((key) => {
        //     Object.defineProperty(vm, key, {
        //         get() {
        //             console.log('get >>.');
        //             return data[key]
        //         },
        //         set(newValue) {
        //             console.log('set>>>')
        //             data[key] = newValue
        //             pEle.innerHTML = data[key]
        //         }
        //     })
        // })

        function bindPlus() {
            vm.count++
        }
    </script>
</body>
</html>

vue3响应式原理:

通过proxy代理对象,代理目标对象,同时对数据进行劫持,当数据变化自动触发getter,setter

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>响应式原理</title>
</head>

<body>
    <div id="app">
        <p></p>
        <button onclick="bindPlus()">加一</button>
    </div>

    <script>
        // 目标对象
        const data = {
            count: 0,
        }

        const pEle = document.querySelector('p')
        pEle.innerHTML = data.count

        // 创建代理对象,代理目标对象,同时对数据进行劫持,当数据变化自动触发getter,setter

        const proxy = new Proxy(data, {
            get(target, propery) {//target目标对象,propery属性
                return target[propery] //data[key]
            },

            set(target, propery, newValue) {//newValue新值
                target[propery] = newValue
                pEle.innerHTML = target[propery] // 自动更新界面
            }
        })

        function bindPlus() {
            proxy.count++
        }
    </script>
</body>
</html>
4.API风格
1>.选项式 API (Options API)

使用选项式 API,我们可以用包含多个选项的对象来描述组件的逻辑,例如 data、methods、template、components 和watch、 mounted。选项所定义的属性都会暴露在函数内部的 this 上,它会指向当前的组件实例。

2>.组合式 API (Composition API)