美文网首页
60行代码写个双向绑定

60行代码写个双向绑定

作者: Vijay_ | 来源:发表于2017-12-23 01:18 被阅读9次

不说废话,上菜!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div v-bind="name" v-click="changeName(Math.max.apply(null,[1,2,3]))" style="padding: 100px"></div>
<div v-bind="age" v-click="changeAge" style="padding: 100px"></div>
</body>
<script>
    var store = {
        data: {
            name: "abc",
            age: 0
        },
        methods: {
            changeName: function (val) {
                this.data.name = val;
                console.log(this.data.name);
            },
            changeAge: function () {
                this.data.age = 10;
                console.log(this.data.age);
            }
        }
    };


    void function () {
        function bindIvar(key, val) {
            var eleList = document.querySelectorAll('[v-bind="' + key + '"]');
            for (var i = 0; i < eleList.length; i++) {
                eleList[i].innerText = val;
            }
        }
        function bindProperty() {
            for (var key in store.data) {
// 创建一个闭包函数,让define中的get set函数引用的都是每次遍历到的key,
// 不然当get set触发时获取到的就是最外层的proxyKey而此时的proxyKey已经变成了遍历的最后一个值
// 因为js中的for是没有块级作用域的
                void function () {
                    var proxyKey = "$$" + key;
                    //        保存原本的值
                    store.data[proxyKey] = store.data[key];
                    //        调用时才触发,但是当调用时proxyKey已经变成了data里最后一个参数
//            注意 ! 在defineProperty的get set方法里千万不能调用this.正在define的key 会死循环!!
                    var Pkey = key;
                    Object.defineProperty(store.data, key, {
                        get: function () {
                            bindIvar(Pkey, this[proxyKey]);
                            return this[proxyKey];
                        },
                        set: function (val) {
//             不必担心每次修改(调用set)只给proxyKey修改值而没有给原本key修改值
//             key的值是根据get来定的,也就是说修改了proxyKey的值后原本key调用get方法时
//             获取的就是proxyKey,那key的值也就是proxyKey的值了!
//             千万不能给原本key修改值,那样就会进行死循环
                            this[proxyKey] = val;
                            bindIvar(Pkey, this[proxyKey]);
                        }
                    });
//            触发所有属性的get方法 刷新页面数据
                    store.data[key];
                }();
            }
        }
        //    获取绑定的事件方法
        function bindEvent(){
        var funcNodeList = document.querySelectorAll("[v-click]");
        for (var i = 0; i < funcNodeList.length; i++) {
            void function () {
                var node = funcNodeList[i];
                var funcStr = node.getAttribute("v-click");
                param = "";
//            捕获函数传入内容(实际要考虑两个括号的情况)
//            var regExp = /\(([^\(\)]*)\)/;
                var regExp = /\((.*)\)/;
                var result = regExp.exec(funcStr);

                if (result) {

                    var param = eval(result[1]);
//            判断字符串是否为数字字符串(实际需要判断是否对象,数组等等)
                    param = isNaN(+param) ? param : +param;
                    funcStr = funcStr.substring(0, result.index);
                }
                var method = store.methods[funcStr];
                node.addEventListener("click", function () {
                    method.call(store, param); 
                }, false);
            }(); 
        }}
        bindProperty();
        bindEvent();
    }();

</script>
</html>

如有献丑,多多包涵,成长的道路一起加油🍻!

相关文章

  • 60行代码写个双向绑定

    不说废话,上菜! 如有献丑,多多包涵,成长的道路一起加油?!

  • [转] DataBinding 数据绑定

    数据绑定分为单项绑定和双向绑定两种。单向绑定上,数据的流向是单方面的,只能从代码流向 UI;双向绑定的数据是双向的...

  • 剖析Vue原理&实现双向绑定MVVM

    1、了解vue的双向数据绑定原理以及核心代码模块 2、缓解好奇心的同时了解如何实现双向绑定 几种实现双向绑定的做法...

  • angular 自定义组件中实现双向绑定

    在自定义中,常常要使用到自定义双向绑定,那么要怎么做呢?其实代码也很简单,先直接来看代码定义双向绑定代码: 使用 ...

  • 2 数据绑定

    1 通过以下代码体验Vue.js最核心的功能——数据的双向绑定 双向绑定v-mod...

  • Vue双向数据绑定原理

    剖析Vue实现原理 - 如何实现双向绑定mvvm 本文能帮你做什么?1、了解vue的双向数据绑定原理以及核心代码模...

  • 关于双向绑定的问题

    剖析Vue实现原理 - 如何实现双向绑定mvvm 本文能帮你做什么?1、了解vue的双向数据绑定原理以及核心代码模...

  • vue的双向绑定原理及实现(转)

    vue的双向绑定原理及实现 前言 代码: 效果图...

  • Vue 响应式 / 双向数据绑定

    一、关于双向数据绑定 数据模型和视图之间的双向绑定 Vue 中的 MVVM 通常,我们需要编写代码,将从服务器获取...

  • Vue工作原理&实现双向绑定MVVM

    本文能帮你做什么? 1、了解vue的双向数据绑定原理以及核心代码模块 2、缓解好奇心的同时了解如何实现双向绑定 为...

网友评论

      本文标题:60行代码写个双向绑定

      本文链接:https://www.haomeiwen.com/subject/mmdfgxtx.html