Vue学习 -- 双向数据绑定(一)

news/2024/7/10 3:04:34 标签: vue, MVVM, defineProperty, 双向数据绑定

前面咱们学习vue的路由,今天咱们学习一下vue的另一大神技:双向数据绑定

双向数据绑定

什么是双向数据绑定

Vue是三大MVVM框架之一,数据绑定简单来说,就是当数据发生变化时,相应的视图会进行更新,当视图更新时,数据也会跟着变化。

那么它是如何做到的呢?

是通过Object.defineProperty()数据劫持实现的。

defineProperty_10">Object.defineProperty()

大家可能第一次看到 Object.defineProperty() ,不理解它到底有什么用,这里我们需要了解一下,它可以来控制一个对象属性的一些特有操作,比如读写权、是否可以枚举,这里我们主要先来研究下它对应的两个描述属性getset

普通对象

var obj ={};
console.group('普通打印对象 =======================')
console.log(obj)

在这里插入图片描述

大家可以看到,什么也没有,只有一个 _ proto _ ,(对于原型不了解的小伙伴只能自行学习了,这里就不多说了)

劫持后的对象

var obj ={};
    
    Object.defineProperty(obj,'name',{
      get :function(){
      	//这里 return 了值,如果不写的话,name 会显示 undefined。
        return '张三'
      },
      set :function(){
        
      }
    })

    console.group('劫持后对象 =======================')
    console.log(obj)

在这里插入图片描述

到这里大家不难发现,对象多了getset两个方法,这就有意思了,那他们到底有什么作用呢?咱们继续搞。。。

get 和 set 的作用

var obj ={};

    var name ='张三';

    Object.defineProperty(obj,'name',{
      get :function(){
        console.log('触发get方法')
        return name
      },
      set :function(val){
        console.log(val,'触发set方法')
        name = val
      }
    })

    console.group('首先获取name =======================')
    console.log(obj.name)

    console.group('然后设置name =======================')
    obj.name ='李四'

    console.group('再次获取name =======================')
    console.log(obj.name)

在这里插入图片描述
通过上边的打印情况,我们好像大体明白了。

get 功能应该就是 获取

set 功能应该就是 设置

思路分析

了解了Object.defineProperty( )的能力,那么我们就要开始分析。怎么通过它实现双向数据绑定的呢?或者说实现双向数据绑定的难点在哪里?

MVVM_85">MVVM流程图

在这里插入图片描述

关键点在于data如何更新view,因为view更新data其实可以通过事件监听即可,比如input标签监听 ‘input’ 事件就可以实现了。

所以重点在于,当数据改变,如何更新视图的。结合我们上边的分析可以想到,数据变更会触发set函数,所以我们只要将一些需要更新的方法放在这里面就可以实现data更新view了。

验证一下

<div>
    <input id="inputId" placeholder="请输入"/>
    <div>
      这是内容:
      <p id="txtId"></p>
    </div>
  </div>
  <script>
    var obj ={};
    var txtId = document.getElementById('txtId');

    Object.defineProperty(obj,'name',{
      get :function(){
        console.log('触发get方法')
        return name
      },
      set :function(val){
        //name 改变,触发了set方法
        console.log(val,'触发set方法')
        name = val;
        //使用innerHTML 变更view视图
        txtId.innerHTML = name;
      }
    })

    //input输入时,获得他的value
    inputId.oninput =function(e){
      var val = e.target.value;
      console.log(val,'input的值')
      //赋值给obj.name
      obj.name = val;
    }

  </script>

双向数据绑定(二)

github代码地址


http://www.niftyadmin.cn/n/1558176.html

相关文章

2018春招前端面试: 闯关记(精排精校) | 掘金技术征文

前言 去年年末研发组解散失业, so选择回去学车了,也顺利拿到了驾照 最近回归大深圳....开始踏上漫漫的找工作之路; "拉勾上吊一百年不匹配!!!","BOSS直聘日夜没反应!!!" 题目范围涵盖我最近遇到的笔试题和面谈的(CSS/JS/HTTP/Node/Hybrid/Vue/NG/React) em…

Vue学习 -- 双向数据绑定(二)

上一章双向数据绑定&#xff08;一&#xff09;主要讲解了Object.defineProperty() 的作用及用法。 github代码地址 现在咱们一起实现一个MyVue MyVue封装初始化htmlmyVue.js分析DocumentFragment使用方式将子节点劫持到文档compilenodeType 1 &#xff1a;元素nodeType 3 …

线程--理论篇

线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念&#xff0c;程序并不能单独运行&#xff0c;只有将程序装载到内存中&#xff0c;系统为它分配资源才能运行&#xff0c;而这种执行的程序就称之为进程。程序和进程的区别就在于&#xff1a;程序是指令的集合&a…

前端--video大视频播放(m3u8)

m3u8视频播放区别mp4m3u8ffmpeg安装homebrew安装ffmpegMP4 转 m3u8第一种第二种常用命令demo目录index.htmlgulpfile.jspackage.jsongithub地址区别 视频播放是前端非常常见的一个功能需求&#xff0c;一般使用mp4格式&#xff0c;通过video标签播放就好。 网上对于视频播放的…

在未来,AI式物流将“消灭”快递小哥

当前&#xff0c;快递小哥是个庞大的就业人群&#xff0c;但随着人工智能技术的发展&#xff0c;他们终将被人工智能所取代。 近日&#xff0c;世界最大快递承运商与包裹递送公司UPS又和另一家初创无人机制造公司CyPhy Works合作&#xff0c;并于上周四测验了无人机快运的可行性…

复制内容到剪切板 -- 换行

我们应该都遇到过这样一个需求&#xff0c;将某一段内容、ID、地址等&#xff0c;复制到粘贴板需求。 除了使用clipboard插件外&#xff0c;单纯的使用js也可以非常容易实现。 execCommand execCommand方法是执行一个对当前文档&#xff0c;当前选择或者给出范围的命令。 C…

修改 process.env 值

前端对于webpack构建工具肯定都不会陌生&#xff0c;最常见的便是通过process.env 判断当前环境。 那么如何修改&#xff0c;以及获取呢&#xff1f; Vue二级目录部署&多环境打包部署&#xff08;一&#xff09; Vue二级目录部署&多环境打包部署&#xff08;二&…

Codeforces Round #466 (Div. 2) E. Cashback

Codeforces Round #466 (Div. 2) E. Cashback(dp 贪心) 题意&#xff1a; 给一个长度为\(n\)的序列\(a_i\),给出一个整数\(c\) 定义序列中一段长度为k的区间的贡献为区间和减去前\(\lfloor \frac{k}{c} \rfloor\)小数的和 现在要给序列\(a_i\)做一个划分&#xff0c;使得贡献的…