&_vue运行起来readreading 'eventtarget">
当前位置:   article > 正文

vue 观察者模式-EventTarget、defineProperty 实现数据响应式_vue运行起来readreading 'eventtarget

vue运行起来readreading 'eventtarget

1、myvue.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>vue 观察者模式-EventTarget 实现数据响应式</title>
  8. <script src="./myvue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <div>
  13. {{message}}
  14. </div>
  15. fafafa{{message}}fafafa
  16. </div>
  17. <script>
  18. // 一:初次渲染你
  19. // 二: 响应式: 1、数据被修改(数据观察,数据劫持); 2、视图更新(观察者模式)
  20. let vm = new MyVue({
  21. el:'#app',
  22. data:{
  23. message:'数据'
  24. }
  25. });
  26. console.log(vm);
  27. setTimeout(() => {
  28. vm._data.message = "修改的值";
  29. },1000);
  30. </script>
  31. </body>
  32. </html>

2、myvue.js

  1. class MyVue extends EventTarget{
  2. constructor(options){
  3. super();
  4. this.$options = options;
  5. this._data = options.data;
  6. this.observe(this._data);
  7. this.compile();
  8. }
  9. // observe-defineProperty
  10. observe(data){
  11. const _this = this;
  12. let keys = Object.keys(data);
  13. keys.forEach(key => {
  14. let value = data[key];
  15. Object.defineProperty(data, key, {
  16. configurable: true,
  17. enumerable: true,
  18. get(){
  19. console.log('get');
  20. return value;
  21. },
  22. set(newValue){
  23. console.log('set');
  24. // 触发事件
  25. _this.dispatchEvent(new CustomEvent(key, {
  26. detail: newValue
  27. }));
  28. value = newValue;
  29. }
  30. })
  31. });
  32. }
  33. compile(){
  34. let ele = document.querySelector(this.$options.el);
  35. this.compileNodes(ele);
  36. }
  37. compileNodes(ele){
  38. let childNodes = ele.childNodes;
  39. childNodes.forEach(node => {
  40. if(node.nodeType === 1){
  41. // 元素节点0
  42. if(node.childNodes.length > 0){
  43. this.compileNodes(node);
  44. }
  45. }else{
  46. // 文本节点
  47. let reg = /\{\{\s*([^{}\s]+)\s*\}\}/g;
  48. let textContent = node.textContent;
  49. if(reg.test(textContent)){
  50. let $1 = RegExp.$1;
  51. node.textContent = node.textContent.replace(reg, this._data[$1]);
  52. //事件监听
  53. this.addEventListener($1, (e) => {
  54. console.log('视图更新',e);
  55. let oldValue = this._data[$1];
  56. let newValue = e.detail;
  57. node.textContent = node.textContent.replace(oldValue, newValue);
  58. });
  59. }
  60. }
  61. })
  62. }
  63. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/259022
推荐阅读
相关标签
  

闽ICP备14008679号