模拟Vue数据的双向绑定

简介: Vue的数据双向绑定功能一直为人称道, Vue数据的双向数据绑定主要依赖了Object.defineProperty,这里尝试用最简单的代码, 实现数据的双向绑定DemoMVVMViewModel基本实现原理Gi...

Vue的数据双向绑定功能一直为人称道, Vue数据的双向数据绑定主要依赖了Object.defineProperty,这里尝试用最简单的代码, 实现数据的双向绑定Demo

MVVM

ViewModel基本实现原理

Gif动态效果:

数据双向绑定
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>数据双向绑定的实现</title>

    <style>

        section{
            text-align: center;
        }

        input{

            width: 800px;
            height: 100px;
            font-size: 90px;
            color: #d46f17;
        }

        div, label{

            width: 500px;
            height: 110px;
            font-size: 90px;
            color: #c03035;
            text-align: center;


        }

        body{

            align-content: center;


        }


    </style>
    <script>
        window.onload = function(){
            // 创建数据对象
            window.data = {};
            // 创建数据键值对
            let _name = "";
            let my_input = document.getElementById('myInput');
            let desc = document.getElementById("desc");

            Object.defineProperty(window.data, "name", {
                // 返回数据
                get: function(){
                    return _name;
                },
                // 设置数据
                set: function(value){
                    _name = value;
                    // 将新数据添加到input和div元素内
                    my_input.value = value;
                    desc.innerHTML = value;

                }
            });
            // 获取input按钮, 并为其绑定事件
            my_input.addEventListener('input', function (ev) {
                new_data = ev.target.value;
                console.log("当前输入框内的数据为:",new_data);
                // 将框内的数据赋值给, data
                window.data.name = new_data
            })
        }
    </script>

</head>
<body>
    <section>
        <label for="myInput">双向绑定Demo</label><input type="data" id="myInput">
        <div id="desc"></div>
    </section>

</body>
</html>
目录
相关文章
|
3天前
|
JavaScript API
vue使用hook:声明周期来监听子组件的声明周期
本文介绍了如何在Vue中使用生命周期钩子来监听子组件的生命周期事件,包括在子组件内部监听和在父组件中监听子组件的生命周期钩子。
19 0
|
1天前
|
JavaScript
Vue使用element中table组件实现单选一行
如何在Vue中使用Element UI的table组件实现单选一行的功能。
12 5
Vue使用element中table组件实现单选一行
|
1天前
|
JavaScript
Vue实现按钮级别权限
文章介绍了在Vue中实现按钮级别权限的两种方法:使用自定义Vue指令和使用v-if指令配合自定义方法。
11 4
Vue实现按钮级别权限
|
1天前
|
JavaScript
Vue+element_Table树形数据与懒加载报错Error in render: “RangeError: Maximum call stack size exceeded“
本文讨论了在使用Vue和Element UI实现树形数据和懒加载时遇到的“Maximum call stack size exceeded”错误,指出问题的原因通常是因为数据中的唯一标识符`id`不唯一,导致递归渲染造成调用栈溢出。
9 1
Vue+element_Table树形数据与懒加载报错Error in render: “RangeError: Maximum call stack size exceeded“
|
2天前
|
JavaScript
vue知识点
vue知识点
12 4
|
2天前
|
存储 JavaScript
vue页面跳转取消上一个页面请求
本文介绍了在Vue中如何取消上一个页面的请求,以避免页面跳转时请求未完成导致的数据错误。核心方法是使用axios的请求拦截器设置请求的取消令牌(cancelToken),并在vuex中存储这些取消令牌的引用。当进行路由跳转时,通过路由守卫清除这些请求,达到取消上一个页面请求的目的。
13 2
在 Vue3 中,如何使用 setup 函数创建响应式数据?
在 Vue3 中,如何使用 setup 函数创建响应式数据?
|
1天前
|
JavaScript
vue第一个项目之音乐播放器
vue第一个项目之音乐播放器
|
8天前
|
JavaScript
vue 函数化组件
vue 函数化组件
|
5天前
|
JavaScript
vue异步渲染
vue异步渲染