vue 响应式原理 Object.defineProperty(obj,‘属性名A‘,options);

目录

  • self
    • 简单讲解
    • 1. 视图影响数据
    • 2. 数据影响视图
    • 3. 视图数据双向影响
    • 页面展示
  • 百度

self

简单讲解

get和set方法是ES5中提供的,因为是方法,所以可以进行判断,get 一般是要通过 return 返回的;而 set 是设置,不用返回

  • Object.defineProperty(obj,'属性名A',options);
  • options:{ set:function(){},get:function(){} }
  • 当获取 obj.'属性名A' 的时候,可以在设置或者获取的时候加一些行为
  • obj.属性名A = '1234'; //赋值会触发set函数
  • obj.属性名A; //获取会触发get函数

1. 视图影响数据

只有 视图影响数据

  • 在 键盘事件 中直接对 对象的属性 进行赋值 就可以 实现改变数据。
<body>
	<!-- 视图 -->
	<input type="text" id="ipt">
	<script>
		// 数据
		var store = {
			info: ''
		}
		var ipt = document.querySelector('#ipt')
		ipt.addEventListener('keyup', function(e) {
			// console.log(888);
			// console.log(e.target.value)
			store.info = e.target.value
			
		})
	</script>
</body>

2. 数据影响视图

只有 数据影响视图

  • 使用方法 Object.defineProperty() 配置项中 set 方法进行设置
  • 【因为】使用 方法对属性 进行 修改 时,当 属性的值 发生 改变,就会触发 set 方法
  • set 方法中对 input 进行 赋值
  • 就实现了 数据影响视图
<body>
	<!-- 视图 -->
	<input type="text" id="ipt">
	<script>
		// 数据
		var store = {
			info: ''
		}
		var ipt  = document.querySelector("#ipt")
		Object.defineProperty(store, "info", {
			set: function(newv) {
				// console.log(777)
				console.log(newv)
				ipt.value = newv
			}
		})
	</script>
</body>

3. 视图数据双向影响

  • 视图影响数据
    1. input 的 value 发生改变 —> 即 视图发生改变
    2. 触发键盘弹起事件,在键盘事件中对属性进行赋值,属性值发生改变,但其实属性值并未真正改变 (1 和 2 是数据响应实现的效果,不是原理)
    3. 【因为】用了 Object.defineProperty() 方法对属性值进行修改,就只能通过方法中配置项中的 get 方法的 return 对属性值进行修改,其他地方修改的属性值没用,只能是知道属性值变了触发 set 方法
    4. set 方法中 使用 中间量对属性改变的值进行保存(set 方法的参数就是改变的属性值)
    5. get 方法中 return 中间量
    6. 就实现了视图影响数据
  • 数据影响视图
    1. 数据发生改变 —> 即 对象的属性发生改变
    2. 触发 方法 Object.defineProperty() 中配置项中的 set 方法(set 方法的参数就是改变的属性值)
    3. set 方法中对 视图进行修改 —> 即 对 inputvalue 进行修改
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <!-- 视图 -->
    <input type="text" id="ipt" />
    <!-- <span id="content"></span> -->
    <script>
      /** ** 数据 ****/
      var store = {
        info: ''
      }
      var temp
      var ipt = document.querySelector('#ipt')
      var content = document.querySelector('#content')
      ipt.addEventListener('keyup', function(e) {
        console.log('"触发键盘事件"----', '触发键盘事件')
        store.info = e.target.value
        // content.innerText = 'input中数据:' + store.info
      })
      Object.defineProperty(store, 'info', {
        /**** set 方法 该属性值发生改变就会触发 ****/
        set: function(newv) {
          console.log('set方法调用------', 'set方法调用')
          console.log('set方法中 newv ------', newv)
          ipt.value = newv
          // store.info = newv
          temp = newv
        },
        /**** get 方法 用该属性的时候触发 ****/
        get: function() {
          console.log('get方法调用------', 'get方法调用')
          // getter 要有 return
          return temp
        }
      })
    </script>
  </body>
</html>

页面展示

在这里插入图片描述

百度

vue.js利用Object.defineProperty实现双向绑定

  • 在Vue.js中,可以使用Object.defineProperty来实现数据的响应式,从而实现双向绑定。以下是一个简单的示例,展示如何使用Object.defineProperty来创建一个简单的双向绑定输入框:
<!DOCTYPE html>
<html>
  <head>
    <title>Vue.js 双向绑定示例</title>
  </head>
  <body>
    <div id="app">
      <input v-model="message" placeholder="编辑我" />
      <p>输入的消息是: {{ message }}</p>
    </div>

    <script src="https://unpkg.com/vue@2.6.14/dist/vue.js"></script>
    <script>
      var vm = new Vue({
        el: '#app',
        data: {
          message: ''
        }
      })

      // 使用Object.defineProperty实现响应式
      let data = {}
      Object.defineProperty(data, 'message', {
        get() {
          return vm.message
        },
        set(newValue) {
          vm.message = newValue
        }
      })

      // 当输入框的值变化时,data.message也会更新
      // 当data.message更新时,Vue的响应式系统会更新视图
    </script>
  </body>
</html>

在这里插入图片描述

在这个例子中,我们创建了一个Vue实例,并通过v-model指令绑定了输入框到message数据属性。同时,我们使用Object.defineProperty监听data.message的变化,并在其发生变化时更新Vue实例的响应式数据。这样,无论是视图层的更新还是数据层的更新,都会同步到彼此,实现了所谓的双向绑定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/509160.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nexpose v6.6.244 for Linux Windows - 漏洞扫描

Nexpose v6.6.244 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, Release Mar 27, 2024 请访问原文链接&#xff1a;https://sysin.org/blog/nexpose-6/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.o…

Python抓取京东、淘宝商品数据(属性详情,sku价格抓取)

抓取京东、淘宝等电商平台的商品数据&#xff08;包括属性详情、SKU价格等&#xff09;通常涉及到网络爬虫技术。这些平台都有自己的反爬虫机制&#xff0c;因此抓取数据需要谨慎操作&#xff0c;避免对平台造成不必要的负担或违反其使用条款。 公共参数 名称类型必须描述key…

提升工作效率:B端工作台设计基础详解

随着互联网和信息技术的快速发展&#xff0c;越来越多的企业开始以数字化、智能化的方式管理和运营自己的业务。B端工作台设计作为企业应用的重要组成部分&#xff0c;越来越受到重视。本文将从三个方面对B端工作台设计进行全面分析。让我们看看。 1. B端工作台设计原则 B端工…

Nginx漏洞之未授权访问和源码泄漏漏洞处理

一、漏洞描述 某次安全扫描&#xff0c;发现某平台存在资源&#xff1a;未授权访问和源码泄漏&#xff1b;攻击者可能获取到网站的配置文件、敏感数据存储位置和访问凭证等信息。这意味着攻击者可以获得对网站的完全或部分控制权&#xff0c;进而进行恶意篡改、删除或添加恶意…

交换机MSTP (多生成树防环协议)基础配置

MSTP 基础配置 在所有交换机上创建 VLAN10、20、30、40、50、60、70、80&#xff0c;配置 MSTP 域 hcip&#xff0c;并创建 两个新的实例&#xff1a;Instance 1、Instance 2&#xff0c;将 VLAN10、30、50、70 映射到 Instance 1&#xff0c;将 VLAN20、40、60、80 映射到 Ins…

win11下,RTMP流媒体服务器保姆级教程

本片博客将详细介绍如何搭建一个RTMP流媒体服务器,包含源码下载&#xff0c;编译常见问题解决方法以及流媒体测试&#xff0c;最后讲解了如何利用obs软件实现推流。 服务器&#xff1a;SRS 3.0(Simple Realtime Server&#xff0c;支持RTMP、HTTP-FLV、HLS、WebRTC) 推流端&…

利用甘特图实现精细化项目管控

在项目管理中,通过精细化管控,项目经理能够有效规划、监督和协调各项任务,从而最大限度控制风险,优化资源配置,并确保按时、按质、按量完成项目目标。而在众多项目管理工具中,甘特图无疑是实现精细化项目管控的利器。zz-plan 是一个非常好用的在线甘特图制作工具&#xff0c;一…

Go 源码之互斥锁 Mutex

文章目录 一、总结二、源码&#xff08;一&#xff09;Mutex&#xff08;二&#xff09; Lock&#xff08;三&#xff09;Unlock 三、常见问题有劳各位看官 点赞、关注➕收藏 &#xff0c;你们的支持是我最大的动力&#xff01;&#xff01;&#xff01;接下来会不断更新 golan…

是否有替代U盘,可安全交换的医院文件摆渡方案?

医院内部网络存储着大量的敏感医疗数据&#xff0c;包括患者的个人信息、病历记录、诊断结果等。网络隔离可以有效防止未经授权的访问和数据泄露&#xff0c;确保这些敏感信息的安全。随着法律法规的不断完善&#xff0c;如《网络安全法》、《个人信息保护法》等&#xff0c;医…

计算机网络: 点对点协议 PPP

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

提高三维模型的立面出图技术

提高三维模型的立面出图技术 摘要&#xff1a;立面出图是三维模型应用中常见的需求&#xff0c;它能够将三维模型呈现为平面立面图&#xff0c;用于建筑设计、室内装饰等领域。本文将介绍几种常用的立面出图技术&#xff0c;包括投影法、剖面法和渲染技术&#xff0c;并分析它们…

yolov8逐步分解(1)--默认参数超参配置文件加载

本章节将介绍yolov8算法训练过程中的第一步&#xff1a;加载默认训练参数以及超参的配置文件default.yaml。 Yolov8 训练的入口文件为train.py&#xff0c;文件结构如下图所示&#xff1a; 1. 执行train函数&#xff0c;函数默认配置参数为cfgDEFAULT_CFG &#xff0c…

前端 - 基础 表单标签 - 表单元素 input - (name Value checked maxlength )属性详解

目录 name 属性 Value 属性 Checked 属性 Maxlength 属性 场景问答 # <input> 标签 除了 type 属性外&#xff0c;还有其他常用属性 >>> name 属性 在上一节 我们遇到的 单选按钮 &#xff0c;为什么 本应该 多选一 结果成了 多选多的问题 就…

深度学习_NLP常用库报错问题解决

1、SpaCy can‘t find model ‘zh_core_web_sm‘. It doesn‘t seem to be a python package or a valid path to a data 或者 can‘t find model ‘en_core_web_sm‘. It doesn‘t seem to be a python package or a valid path to a data 安装最新的版本&#xff1a; en_…

卡通纸箱空空如也404源码

源码介绍 卡通纸箱空空如也404源码&#xff0c;喜欢的小伙伴可以下方预览看看&#xff0c;满意之后下载放到任何目录都可以使用&#xff01; 源码下载 卡通纸箱空空如也404源码

Vue2.x安装Tinymce依赖冲突解决

Vue2.x安装Tinymce依赖冲突原因 使用vue整合tinymce富文本编辑器&#xff0c;安装依赖时报错 报错的原因是下载版本与vue的版本对不上vue2.x版本应该使用如下指定版本依赖更合适 npm install --save "tinymce/tinymce-vue^3.1"额外依赖为 npm install --save &quo…

【漏洞复现】通天星CMSV6车载视频监控平台Druid弱口令漏洞

Nx01 产品简介 通天星车载视频监控平台软件拥有多种语言版本&#xff0c;应用于公交车车载视频监控、校车车载视频监控、大巴车车载视频监控、物流车载监控、油品运输车载监控等公共交通上。 Nx02 漏洞描述 通天星车载视频监控平台存在Druid弱口令漏洞&#xff0c;攻击者可以通…

【Kotlin】委托模式

1 委托模式简介 委托模式的类图结构如下。 对应的 Kotlin 代码如下。 fun main() {var baseImpl BaseImpl()var baseWrapper BaseWrapper(baseImpl)baseWrapper.myFun1() // 打印: BaseImpl, myFun1baseWrapper.myFun2() // 打印: BaseImpl, myFun2 }interface Base {fun my…

yolov5 v7.0打包exe文件,使用C++调用

cd到yolo5文件夹下 pyinstaller -p 当前路径 -i logo图标 detect.py问题汇总 运行detect.exe找不到default.yaml 这个是yolov8里的文件 1 复制权重文件到exe所在目录。 2 根据报错提示的配置文件路径&#xff0c;把default.yaml复制放到相应的路径下。&#xff08;缺少相应…