vue数据双向绑定实现


1.vue2.0数据劫持defineProperty之后,结合发布订阅这模式

缺点:不能监听数组变化,必须遍历对象的每个属性,必须深层遍历嵌套的对象

2.vue3.0数据代理proxy 可以直接监听对象,数组(而非属性)

简单实现,通过Object对象的 defineProperty属性,重写data的get和set方法

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>Documenttitle>
head>
<body>
    
    <div id="app">
        <h1>{{msg}}h1>
    div>
    <script>
        // 模板
        let data = {
            msg: 'hello msg',
            _data: {}
        }
    // 设置特性
    Reflect.defineProperty(data, 'msg', {
        // 取值器
        get() {
            console.log('get', this, arguments);
            // 获取备份对象
            return this._data.msg;
        },
        // 赋值器
        set(val) {
            console.log('set', this, arguments);
            // 设置备份对象
            this._data.msg = val;
            //视图显示
            updataView(this._data);

        }
    })  
    let tpl  = document.getElementById('app').innerHTML;
    function updataView(data) {
        let html = tpl.replace(/{{(\w+)}}/, (match, $1) => {
            return data[$1];
        })

        document.getElementById('app').innerHTML = html;

    }
    // 设置 触发赋值器
    data.msg = 'hello world';
    // 读取 触发取值器
    console.log(data.msg);

    script>
body>
html>