Vue3的响应式原理.html 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>Document</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript" >
  9. //源数据
  10. let person = {
  11. name:'张三',
  12. age:18
  13. }
  14. //模拟Vue2中实现响应式
  15. //#region
  16. /* let p = {}
  17. Object.defineProperty(p,'name',{
  18. configurable:true,
  19. get(){ //有人读取name时调用
  20. return person.name
  21. },
  22. set(value){ //有人修改name时调用
  23. console.log('有人修改了name属性,我发现了,我要去更新界面!')
  24. person.name = value
  25. }
  26. })
  27. Object.defineProperty(p,'age',{
  28. get(){ //有人读取age时调用
  29. return person.age
  30. },
  31. set(value){ //有人修改age时调用
  32. console.log('有人修改了age属性,我发现了,我要去更新界面!')
  33. person.age = value
  34. }
  35. }) */
  36. //#endregion
  37. //模拟Vue3中实现响应式
  38. //#region
  39. const p = new Proxy(person,{
  40. //有人读取p的某个属性时调用
  41. // target:newProxy的时候传入的是谁,target就是谁
  42. // propName:当前读取的属性名
  43. get(target,propName){
  44. console.log(`有人读取了p身上的${propName}属性`)
  45. // return target[propName]
  46. return Reflect.get(target,propName)
  47. },
  48. //有人修改p的某个属性、或给p追加某个属性时调用
  49. set(target,propName,value){
  50. console.log(`有人修改了p身上的${propName}属性,我要去更新界面了!`)
  51. // target[propName] = value
  52. Reflect.set(target,propName,value)
  53. },
  54. //有人删除p的某个属性时调用
  55. deleteProperty(target,propName){
  56. console.log(`有人删除了p身上的${propName}属性,我要去更新界面了!`)
  57. // return delete target[propName]
  58. return Reflect.deleteProperty(target,propName)
  59. }
  60. })
  61. //#endregion
  62. let obj = {a:1,b:2}
  63. //通过Object.defineProperty去操作
  64. //#region
  65. /* try {
  66. Object.defineProperty(obj,'c',{
  67. get(){
  68. return 3
  69. }
  70. })
  71. Object.defineProperty(obj,'c',{
  72. get(){
  73. return 4
  74. }
  75. })
  76. } catch (error) {
  77. console.log(error)
  78. } */
  79. //#endregion
  80. //通过Reflect.defineProperty去操作
  81. //#region
  82. /* const x1 = Reflect.defineProperty(obj,'c',{
  83. get(){
  84. return 3
  85. }
  86. })
  87. console.log(x1)
  88. const x2 = Reflect.defineProperty(obj,'c',{
  89. get(){
  90. return 4
  91. }
  92. })
  93. if(x2){
  94. console.log('某某某操作成功了!')
  95. }else{
  96. console.log('某某某操作失败了!')
  97. } */
  98. //#endregion
  99. // console.log('@@@')
  100. </script>
  101. </body>
  102. </html>