美文网首页
2021-03-03

2021-03-03

作者: 转移到CSDN名字丹丹的小跟班 | 来源:发表于2021-03-05 08:54 被阅读0次
vue

vue 是如何实现响应式数据的呢?
Vue2:Object.definProperty 重新定义 data 中所有的属性, Object.definProperty 可以使数据的获取与设置增加一个拦截的功能,拦截属性的获取,进行依赖收集。拦截属性的更新操作,进行通知。具体的过程:首先 Vue 使用 initData 初始化用户传入的参数,然后使用 new Observer 对数据进行观测,如果数据是一个对象类型就会调用 this.walk(value) 对对象进行处理,内部使用 defineReactive 循环对象属性定义响应式变化,核心就是使用 Object.definProperty 重新定义数据

image.png
js

js如何自定义事件
第一步创建事件,有两种方式(EventCustomEvent
Event()构造函数创建一个新的Event。

event = new Event(typeArg,eventInit);
typeArg 事件名称。
eventInit 这是一个对象,包含以下字段:

  • bubbles:(可选)Boolean指示事件是否冒泡。默认是false
  • cancelable:(可选)a Boolean表示是否可以取消该事件。默认是false

第二步事件的监听
JS的EventListener是根据事件的名称来进行监听的,比如我们在上文中已经创建了一个名称为‘event_name’ 的事件,那么当某个元素需要监听它的时候,就需要创建相应的监听器:

第三步事件触发
对于一些内置(built-in)的事件,通常都是有一些操作去做触发,比如鼠标单击对应MouseEvent的click事件,利用鼠标(ctrl+滚轮上下)去放大缩小页面对应WheelEvent的resize事件。
然而,自定义的事件由于不是JS内置的事件,所以我们需要在JS代码中去显式地触发它。方法是使用 dispatchEvent 去触发(IE8低版本兼容,使用fireEvent)

var myEvent = new CustomEvent('event_name', {bubbles: true, cancelable: true});
window.addEventListener('event_name', function() {
  console.log('red');
})
window.dispatchEvent(myEvent)

想要进行数据传递就要使用CustomEvent创建自定义事件

var myEvent = new CustomEvent('event_name', {detail: {name: 'fufu', age: 20}});
window.addEventListener('event_name', function(event) {
  console.log(event.detail);   //test.html:12 {name: "fufu", age: 20}
})
window.dispatchEvent(myEvent)

WeakMap和WeakSet
WeakMap对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。键名所指向的对象可以被垃圾回收, 此时键名是无效的;不能遍历。

get() 返回key关联对象, 或者 undefined(没有key关联对象时)。
set()向WeakMap 实例添加一个新成员。
has()返回一个布尔值,表示某个值是否在WeakMap 实例中。
delete()清除WeakMap 实例的指定成员。WeakSet 对象允许你将弱保持对象存储在一个集合中。(只能是对象)

WeakSet对象允许你将弱引用对象存储在一个集合中。

add(value)向WeakSet实例添加一个新成员。
delete(value)清除WeakSet实例的指定成员。
has(value)返回一个布尔值,表示某个值是否在WeakSet实例中。

相关文章

网友评论

      本文标题:2021-03-03

      本文链接:https://www.haomeiwen.com/subject/ufccqltx.html