- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
好家伙,了解一下Vue如何实现 数据劫持 。
。
首先,我得搞清楚这玩意的概念,我们先从vue的使用开始吧 。
想想看,我们平时是如何使用vue的data部分的?
无非是这两种情况 。
(你可千万不要带着惊讶的表情说"啊!原来有两种写法的吗") 。
// 函数写法 data() { return { msg: " I like beef " } }
// 对象写法 data:{ return { msg: " I like beef " } }
像这样
。
对属性的读取和修改拦截 。
简单来说就是数据的任何变化都要能监测到,这样才能根据数据变化做对应操作 。
就像"劫持"这个词的意思"抢过里来,盯着" 。
Vue2最好用的部分----响应式数据,数据一经更改,页面上的数据就会进行局部更新 。
如果不进行数据劫持,不知道数据状态就无法更新数据 。
。
然后我们开始思考,数据劫持是从什么时候开始的?
在 Vue 中, 数据劫持是在创建 Vue 实例时完成的 .
具体来说,当你实例化一个 Vue 对象时,Vue 会通过使用 Object.defineProperty() 方法来劫持(或称为监听)对象的属性,以便在属性被访问或修改时能够执行相应的操作.
Vue 的数据劫持是通过将数据对象传递给一个称为“响应式系统”的函数来实现的.
这个函数会遍历数据对象的所有属性,并为每个属性设置 getter 和 setter.
当我们获取或修改这些属性时,getter 和 setter 会触发对应的操作,以实现数据的响应式更新.
。
(并非源码,这是一个例子) 。
// 对对象中的属性进行劫持 function defineReactive(data, key, value) { Object.defineProperty(data, key, { get() { // console.log('获取') return value }, set(newValue) { // console.log('设置') if (newValue == value) { return; } value = newValue } }) }
。
关于defineProperty()方法: Object.defineProperty() - JavaScript | MDN (mozilla.org) 。
这是一个简化版的数据劫持示例.
这个 defineReactive() 函数接受一个数据对象 `data`、一个属性名 `key` 和初始值 `value`,并使用 Object.defineProperty() 方法定义了一个 getter 和一个 setter.
在 getter 中,当获取属性值时,会返回存储在 `value` 变量中的当前值.
在 setter 中,当尝试设置属性值时,会将新值存储在 `value` 变量中, 。
这个 defineReactive() 函数可以用于对对象中的某个属性进行劫持,使得在对该属性进行访问或修改时能够触发相应的操作.
。
完整的例子
export function observer(data) { // console.log(data) // 判断数据 if (typeof data != ' object ' || data == null ) { return data } // 对象通过一个类 return new Observer(data) } class Observer { constructor(value) { Object.defineProperty(value, " __ob__ " , { enumerable: false , value: this }) // 判断数据 // console.log(value) if (Array.isArray(value)) { // value.__proto__ = ArrayMethods // console.log("shuzhu") // 如果你是数组对象 // this.observeArray(value) } else { this.walk(value) } } walk(data) { let keys = Object.keys(data) for (let i = 0 ; i < keys.length; i++ ) { // 对象我们的每个属性进行劫持 let key = keys[i] let value = data[key] defineReactive(data, key, value) } } observeArray(value) { // [{a:1}] for (let i = 0 ; i < value.length; i++ ) { observer(value[i]) } } } // 对对象中的属性进行劫持 function defineReactive(data, key, value) { observer(value) // 深度代理 Object.defineProperty(data, key, { get() { // console.log('获取') return value }, set(newValue) { // console.log('设置') if (newValue == value) { return; } observer(newValue) value = newValue } }) }
。
深度代理明天更... 。
。
最后此篇关于Vue源码学习(一):数据劫持(对象类型)的文章就讲到这里了,如果你想了解更多关于Vue源码学习(一):数据劫持(对象类型)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!