前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Vue2.X是如何利用Object.defineProperty()实现数据绑定的

Vue2.X是如何利用Object.defineProperty()实现数据绑定的

原创
作者头像
伯约同学
发布于 2022-02-15 13:46:18
发布于 2022-02-15 13:46:18
48900
代码可运行
举报
运行总次数:0
代码可运行

Vue2.X是如何利用Object.defineProperty()实现数据绑定的

上一篇文章写到了Object.defineProperty的使用,这篇文章说一下Vue是如何利用这个方法实现数据绑定的。

首先把Vue中的核心方法defineReactive做一些简化

代码语言:javascript
代码运行次数:0
运行
复制
function defineReactive (obj, key, val, cb) {
    var dep = new Dep();
​
    Object.defineProperty(obj, key, {
        enumerable: true,
        configurable: true,
        get: ()=>{
            /*....依赖收集等....*/  
            dep.depend()
            return val
        },
        set:newVal=> {
            val = newVal;
            /*触发回调*/
            dep.notify()
        }
    })
}

Vue通过defineReactive方法实现对需要观察的对象的每个属性进行监控。

dep对象就相当于一个调度中心的作用,如果有数据用到这个属性,它就会自动收集该属性到调度中心,如果某属性发生了改变,那就会通知调度中心来更新视图。

再看看dep方法和它的功能。相对比较简单:1、存储订阅者2、添加订阅者

代码语言:javascript
代码运行次数:0
运行
复制
function Dep () {
  // 所有的watcher 放进这里统一管理
  this.subs = []
}
Dep.target = null;
// 通知视图更新dom的 notify的方法
Dep.prototype.notify  = function () {
  // this.subs 存储 watcher
  this.subs.forEach(sub => {
    // sub 是某个Watcher 具体调用某个Watcher的update 方法
    sub.update()
  })
}
// 添加订阅者的方法
Dep.prototype.addSub = function (sub) {
  this.subs.push(sub)
}

订阅器主要也是了两个方法;1、触发一下属性的获取,顺便把自己加到调度中心去 2、update更新视图

代码语言:javascript
代码运行次数:0
运行
复制
// 具体的订阅器Watcher
// 传入一个vue 的示例, 监听的属性, 以及处理的回调函数
function Watcher (vm,prop,callback) {
  this.vm = vm;
  this.$prop = prop;
  this.value = this.get();
  this.callback = callback;
 }
// 添加watcher 获得属性的get 方法,当有属性访问/设置 的时候,就产生订阅者 将这个订阅者放进调度中心
Watcher.prototype.get = function () {
  Dep.target = this;
  // 获得属性值
  const value = this.vm.$data[this.$prop];
  return value
}
// 添加watcher的更新视图的方法
Watcher.prototype.update = function () {
  // 当属性值有变化的时候,执行方法,更新试图
  const value = this.vm.$data[this.$prop];
  this.callback(this.value)
}

于是乎

当外界读取数据时会调用watcher,会触发getter把watcher添加到Dep依赖中。(也就是编译过程收集依赖)

当数据发生了变化,会触发setter,从而想Dep中的依赖(watcher)发送通知。(交互过程,调度中心去通知订阅器抓紧更新)。

Watcher 接收到通知后,会向外界发送通知,变化通知到外界可能触发试图更新,也有可能触发用户的某个回调函数等。(订阅器修改对应的值,页面参数随之相应,实现响应)

当然,这才只是单向绑定,双向绑定就是说视图更改数据,这个就比较简单,在编译过程中将标签绑定input方法,修改对应的数据即可。

有来有回,实现了双向绑定。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
使用Selenium与Requests模拟登陆
注意两个地方,cookies和参数,先来看看参数,稍微特别的就是authenticity_token,感觉是验证。Ctrl+Shift+F打开搜索,最终在返回的html中找到
小歪
2018/07/25
1.5K0
使用Selenium与Requests模拟登陆
实战项目二: 实现CSDN自动点赞
环境: Python3.6.5 编译器: Sublime Text 3 代码: GitHub 联系方式: ke.zb@qq.com 第三方库: selenium
K同学啊
2019/01/22
1.5K0
Python模拟登陆万能法-微博|知乎
Python模拟登陆让不少人伤透脑筋,今天奉上一种万能登陆方法。你无须精通HTML,甚至也无须精通Python,但却能让你成功的进行模拟登陆。本文讲的是登陆所有网站的一种方法,并不局限于微博与知乎,仅用其作为例子来讲解。
周小董
2019/03/25
6.2K0
用Python写网页的自动签到
2.下载chromedriver驱动; 找到符合自己浏览器版本的chromedriver驱动,下载解压后,将chromedriver.exe文件放到Python目录下的Scripts目录下,也可以添加环境变量到Path中。
用户2590762
2021/08/11
2.5K0
017:Opencv+Selenium模拟QQ邮箱滑块操作
之前发了一个国航的滑块模拟操作,没有计算滑块到缺口的位置。 本篇则是用opencv+selenium来对QQ邮箱的滑块进行模拟测试。
李玺
2021/11/22
1.2K0
017:Opencv+Selenium模拟QQ邮箱滑块操作
利用 Python 爬取 QQ 空间说说和相册
QQ 空间在 2005 年被腾讯开发,已经经历了 15 个年头,在还没有微信的年代,看网友发表的心情、心事、照片大多都在 QQ 空间的里。它承载了80、90 后的大量青春,下面我们一起用 selenium 模块导出说说和相册回忆青春吧。
张俊红
2021/06/25
3.2K0
利用 Python 爬取 QQ 空间说说和相册
饮料配方研发网站自动发布代码
# from selenium.webdriver.support.select import Select
用户4393181
2021/12/22
5100
用python操作浏览器的三种方式
第一种:selenium导入浏览器驱动,用get方法打开浏览器,例如: import time from selenium import webdriver def mac():     driver = webdriver.Firefox()     driver.implicitly_wait(5)     driver.get("http://huazhu.gag.com/mis/main.do") 第二种:通过导入python的标准库webbrowser打开浏览器,例如: >>> import webbrowser >>> webbrowser.open("C:\\Program Files\\Internet Explorer\\iexplore.exe") True >>> webbrowser.open("C:\\Program Files\\Internet Explorer\\iexplore.exe") True  第三种:使用Splinter模块模块 一、Splinter的安装 Splinter的使用必修依靠Cython、lxml、selenium这三个软件。所以,安装前请提前安装 Cython、lxml、selenium。以下给出链接地址: 1)http://download.csdn.net/detail/feisan/4301293 2)http://code.google.com/p/pythonxy/wiki/AdditionalPlugins#Installation_no 3)http://pypi.python.org/pypi/selenium/2.25.0#downloads 4)http://splinter.cobrateam.info/ 二、Splinter的使用   这里,我给出自动登录126邮箱的案例。难点是要找到页面的账户、密码、登录的页面元素,这里需要查看126邮箱登录页面的源码,才能找到相关控件的id.   例如:输入密码,密码的文本控件id是pwdInput.可以使用browser.find_by_id()方法定位到密码的文本框, 接着使用fill()方法,填写密码。至于模拟点击按钮,也是要先找到按钮控件的id,然后使用click()方法。 #coding=utf-8   import time   from splinter import Browser  def splinter(url):   browser = Browser()      #login 126 email websize    browser.visit(url)       #wait web element loading   time.sleep(5)      #fill in account and password   browser.find_by_id('idInput').fill('xxxxxx')  browser.find_by_id('pwdInput').fill('xxxxx')      #click the button of login    browser.find_by_id('loginBtn').click()       time.sleep(8)       #close the window of brower       browser.quit()   if __name__ == '__main__':       websize3 ='http://www.126.com'       splinter(websize3)  WebDriver简介 selenium从2.0开始集成了webdriver的API,提供了更简单,更简洁的编程接口。selenium webdriver的目标是提供一个设计良好的面向对象的API,提供了更好的支持进行web-app测试。从这篇博客开始,将学习使用如何使用python调用webdriver框架对浏览器进行一系列的操作 打开浏览器 在selenium+python自动化测试(一)–环境搭建中,运行了一个测试脚本,脚本内容如下: from selenium import webdriver import time driver = webdriver.Chrome() driver.get("http://www.baidu.com") print(driver.title) driver.find_element_by_id("kw").send_keys("s
py3study
2020/01/06
8.5K0
用python操作浏览器的三种方式
爬虫遇到头疼的验证码?Python实战讲解弹窗处理和验证码识别
在我们写爬虫的过程中,目标网站常见的干扰手段就是设置验证码等,本就将基于Selenium实战讲解如何处理弹窗和验证码,爬取的目标网站为某仪器预约平台
刘早起
2020/07/29
2.3K0
爬虫遇到头疼的验证码?Python实战讲解弹窗处理和验证码识别
Python网络爬虫之模拟登陆
Python网络爬虫应用十分广泛,但是有些网页需要用户登陆后才能获取到信息,所以我们的爬虫需要模拟用户的登陆行为,在登陆以后保存登陆信息,以便浏览该页面下的其他页面。
刀刀老高
2019/03/06
5950
Python网络爬虫之模拟登陆
windows下实现黑客派自动签到
需要翻墙,地址为 http://chromedriver.chromium.org/downloads,找到符合自己浏览器版本的 chromedriver 驱动,下载解压后,将 chromedriver.exe 文件放到 Python 目录下的 Scripts 目录下。我已下载 75 版本
cuijianzhe
2022/06/14
6790
windows下实现黑客派自动签到
携程 爬虫_python自动化和爬虫先学哪个
二、下载传送门 url:http://chromedriver.storage.proxy.ustclug.org/index.html 根据自己的版本进行下载
全栈程序员站长
2022/11/15
5580
携程 爬虫_python自动化和爬虫先学哪个
Amazon后台模拟登陆
本文基于python3.4的selenium库打开浏览器,并将浏览器中的登陆cookie保存到本地,那么下次登陆就可以直接利用cookie了:
机器学习和大数据挖掘
2019/07/02
4.1K0
Amazon后台模拟登陆
微信公众号爬虫 微信公众号爬虫
爬取步骤: 1. get_cookie.py用selenium登陆,获取cookie,其中你需要勾选“记住”选项,还需要微信扫描二维码,确定顺利登陆
尾尾部落
2018/09/04
8.4K0
从登陆到爬取:Python反反爬获取某宝成千上万条公开商业数据
chrom浏览器的驱动器下载地址:http://npm.taobao.org/mirrors/chromedriver/
荣仔_最靓的仔
2021/02/02
1.2K0
从登陆到爬取:Python反反爬获取某宝成千上万条公开商业数据
Python + Selenium 自动发布文章(三):CSDN
  这是本系列的第三篇文章,主要介绍如何用Python+Selenium 自动发布CSDN博客,一些必要的条件在之前的文章里面已经提到过,这里也不再重复。
happyJared
2018/09/20
7160
Python + Selenium 自动发布文章(三):CSDN
使用chatgpt编写公众号订推文的脚本
这个脚本首先打开Chrome浏览器,然后打开微信公众号平台登录页面。在登录后,它会跳转到发布文章页面,填写文章标题和正文,并点击发布按钮。最后,它会等待一段时间以确保文章发布成功,然后关闭浏览器。
Tom2Code
2023/08/31
5590
使用chatgpt编写公众号订推文的脚本
七、Selenium与phantomJS----------动态页面模拟点击、网站模拟登录 每天一个小实例1(动态页面模拟点击,并爬取你想搜索的职位信息) 每天一个小实例2(模拟网站登录)我用的是
每天一个小实例1(动态页面模拟点击,并爬取你想搜索的职位信息) 1 from selenium import webdriver 2 from bs4 import BeautifulSoup 3 4 # 调用环境变量指定的PhantomJS浏览器创建浏览器对象 5 driver = webdriver.PhantomJS() 6 7 #访问的网址,我这里是登录的boss直聘 8 driver.get('https://www.zhipin.com/') 9 10 #模拟在搜索框输入
酱紫安
2018/04/16
2.4K0
七、Selenium与phantomJS----------动态页面模拟点击、网站模拟登录
		每天一个小实例1(动态页面模拟点击,并爬取你想搜索的职位信息) 每天一个小实例2(模拟网站登录)我用的是
用 Python 找出并拉黑那些 QQ 空间屏蔽我的塑料好友们
最近发现有人QQ空间对我展开了屏蔽,咱们也不知道怎么惹到人家了,一气之下写了一个小爬虫看看到底谁把我屏蔽了。写小本本记下来!!!
Crossin先生
2021/12/01
4330
用 Python 找出并拉黑那些 QQ 空间屏蔽我的塑料好友们
Python + Selenium 自动发布文章(一):开源中国
  还是说说出这个系列的起因吧。之前写完或是修改了Markdown文章,我还分别需要在多个平台进行发布或是更新维护这些内容,这些平台目前包括我的博客、简书、开源中国和CSDN,其实早就想过用比较自动化的形式来解决,无奈有技术、时间、精力等各方面原因的限制。废话不多说吧,直奔今天的主题,本文主要介绍如何用Python和Selenium写(发)开源中国的博客。
happyJared
2018/09/20
7040
Python + Selenium 自动发布文章(一):开源中国
推荐阅读
相关推荐
使用Selenium与Requests模拟登陆
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档