• vue3的api解读-VUE Reactivity


    目录

    响应式

    命令式程序 vs 响应式程序

    Be Reactive:将响应式的值绑定到UI

     代理模式(CODING)

    /src/App.tsx

    /src/main.ts

    /vite.config.ts

    /src/demo/ProxyExample.ts


    Reactivity是Vue3新加的一个库,新的package

    响应式

    命令式程序 vs 响应式程序

    1. // 命令式程序
    2. function add(a, b) {
    3. return a + b
    4. }
    5. // 每一步都是赋值
    6. let x = 1
    7. let y = 2
    8. let c = add(x, y)
    9. x = 100
    10. // c 不变,这就是命令式程序
    1. // 响应式程序
    2. // 每一步都是声明
    3. let x = ref(1)
    4. let y = ref(2)
    5. let c = computed(
    6. () => x.value + y.value
    7. )
    8. x.value = 100
    9. // c.value 102 ,响应式程序,c变了

    响应式程序是一种声明

    • 命令式程序赋值,赋值的本质是内存的拷贝
    • 响应式程序是一种绑定(bind),绑定的本质是一种声明。
      • 比如数学公式a=b+1并不是计算过程,而是一种绑定

    Be Reactive:将响应式的值绑定到UI

    观察者模式

    • Get Value
      • Track(追踪用到的组件)
    • Value Changed
      • Trigger(触发通知所有用到的组件刷新)

     代理模式(CODING)

    1. // 创建项目
    2. npm create vite
    3. vue
    4. vue-ts
    5. cd ***
    6. npm install

    删除App.vue

    /src/App.tsx

    1. export default () => {
    2.   return <div>hello world vue3 + tsdiv>
    3. }

    /src/main.ts

    1. import { createApp } from 'vue'
    2. import App from './App' // 去掉了.vue
    3. createApp(App).mount('#app')
    4. // 此时运行报错 React is not defined
    5. // 解析出问题了
    6. // 安装依赖
    7. // npm add -D @vitejs/plugin-vue-jsx

    /vite.config.ts

    1. import { defineConfig } from 'vite'
    2. import vue from '@vitejs/plugin-vue'
    3. // 安装依赖
    4. // npm add -D @vitejs/plugin-vue-jsx
    5. import jsx from '@vitejs/plugin-vue-jsx'
    6. // https://vitejs.dev/config/
    7. export default defineConfig({
    8.   plugins: [vue(), jsx()]
    9. })

    /src/demo/ProxyExample.ts

    1. // vue原理 一个值的代理
    2. function createRef(val: T) { // T 泛型
    3.   const obj = {
    4.     get value() {
    5.       // 追踪
    6.       // track()
    7.       return val
    8.     },
    9.     set value(v: T) {
    10.       // 通知
    11.       // trigger()
    12.       console.log('set ... trigger')
    13.       val = v
    14.     }
    15.   }
    16.   return obj
    17. }
    18. // 创建的是一个值的代理
    19. const count = createRef(0)
    20. count.value = 1
    21. // vue原理 一个对象的代理
    22. function reactiveextends object>(obj: T) {
    23.   // MDN
    24.   const proxy = new Proxy(obj, {
    25.     // obj === target
    26.     get(target, key) {
    27.       // 一个标准,是JavaScript的反射,
    28.       // 可以帮我们在原对象obj中拿到属性key
    29.       // return () => { }// 返回一个函数也是可以的
    30.       return Reflect.get(target, key)
    31.     },
    32.     set(target, key, value) {
    33.       // 设置obj的值为value
    34.       Reflect.set(target, key, value)
    35.       return true
    36.     }
    37.   })
    38.   return proxy
    39. }
    40. const state = reactive({ a: 1, b: 2 })
    41. console.log(state.a)
    42. state.b = 3
    • 代理模式: 代理对象是对原对象的包装(Wrapper)
    • 观察代理模式的程序示例
    • 思考:
      • 如何在get的时候track
      • 如何在set的时候trigger

    小结:常见误区

    思考1:

    代理对象和原对象是一种怎样的关系?

    1. 代理对象不一定遵循原对象的逻辑,
    2. 代理对象可以有自己的逻辑,
    3. 本质上代理对象是对原对象的一种包装
    4. 因此代理模式也称为包装模式

    思考2:

    【vue2的数据绑定】Data binding和【vue3的响应式】Reactive的关系?

    1. 响应式是一种数据的绑定
    2. 响应式值和视图之间的关系是一种绑定关系,是声明式的绑定关系
    3. Reactive是实现Data binding的一种方式【一种机制】
  • 相关阅读:
    现代化前端规范:工具+代码
    使用itextPDF实现PDF电子公章工具类
    【Java 错误与异常】微信支付出现 llegal key size 大坑(已解决)
    es笔记五之term-level的查询操作
    电容笔可以用什么代替?双十二平价电容笔推荐
    2-3 Moves Codeforces 1716A
    【web-攻击访问控制】(5.1.1)常见漏洞:完全不受保护的功能、基于标识符的功能
    lighttpd以及socket和WebSocket编程
    2016-10《信息资源管理 02378》真卷,圈定章节考点+统计真题分布
    JVM(Java虚拟机) 整理(一):基础理论
  • 原文地址:https://blog.csdn.net/qq_35729091/article/details/130807473