欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vue双向绑定原理(Proxy)

程序员文章站 2022-04-18 20:52:33
...

vue 3.0将使用proxy 来实现 双向绑定 于是简单做了个 双向绑定的demo

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>双向绑定</title>
    <script src="https://code.jquery.com/jquery-3.4.1.min.js" crossorigin="anonymous"></script>
</head>
<div id="scope">
    <div>
        <input type="text" v-model="test1">
        <input type="text" v-model="test1">
    </div>
    <div>
        <input type="text" v-model="test2">
        <input type="text" v-model="test2">
    </div>
    <div>
        <input type="text" v-model="test3">
        <input type="text" v-model="test3">
    </div>
</div>
<button οnclick="app.test1 = 'haha'">点击改变value</button>

<body>
    <script>
        const scope = $("#scope");
        const length = scope.find('input').length;
        scope.find('input').keyup(function (event) {
            const key = $(this).attr("v-model");
            app[key] = $(this).val();
        })

        const vue = new class Vue {
            constructor() {
                this.test1 = '';
                this.test2 = '';
                this.test3 = '';
            }
        }

        let app = new Proxy(vue, {
            get: function (target, key, receiver) {
                return Reflect.get(target, key, receiver);
            },
            set: function (target, key, value, receiver) {
                for (let i = 0; i < length; i++) {
                    if (scope.find('input').eq(i).attr("v-model") === key) {
                        scope.find('input').eq(i).val(value);
                    }
                }
                return Reflect.set(target, key, value, receiver);
            }
        });
    </script>
</body>

</html>

 

相关标签: 双向绑定