目录
Reactivity是Vue3新加的一个库,新的package
- // 命令式程序
- function add(a, b) {
- return a + b
- }
- // 每一步都是赋值
- let x = 1
- let y = 2
- let c = add(x, y)
- x = 100
- // c 不变,这就是命令式程序
- // 响应式程序
- // 每一步都是声明
- let x = ref(1)
- let y = ref(2)
- let c = computed(
- () => x.value + y.value
- )
- x.value = 100
- // c.value 102 ,响应式程序,c变了
响应式程序是一种声明
观察者模式
- // 创建项目
- npm create vite
- vue
- vue-ts
- cd ***
- npm install
删除App.vue
- export default () => {
- return <div>hello world vue3 + tsdiv>
- }
- import { createApp } from 'vue'
- import App from './App' // 去掉了.vue
- createApp(App).mount('#app')
- // 此时运行报错 React is not defined
- // 解析出问题了
- // 安装依赖
- // npm add -D @vitejs/plugin-vue-jsx
- import { defineConfig } from 'vite'
- import vue from '@vitejs/plugin-vue'
- // 安装依赖
- // npm add -D @vitejs/plugin-vue-jsx
- import jsx from '@vitejs/plugin-vue-jsx'
- // https://vitejs.dev/config/
- export default defineConfig({
- plugins: [vue(), jsx()]
- })
- // vue原理 一个值的代理
- function createRef
(val: T) { // T 泛型 - const obj = {
- get value() {
- // 追踪
- // track()
- return val
- },
- set value(v: T) {
- // 通知
- // trigger()
- console.log('set ... trigger')
- val = v
- }
- }
- return obj
- }
- // 创建的是一个值的代理
- const count = createRef(0)
- count.value = 1
- // vue原理 一个对象的代理
- function reactive
extends object>(obj: T) { - // MDN
- const proxy = new Proxy(obj, {
- // obj === target
- get(target, key) {
- // 一个标准,是JavaScript的反射,
- // 可以帮我们在原对象obj中拿到属性key
- // return () => { }// 返回一个函数也是可以的
- return Reflect.get(target, key)
- },
- set(target, key, value) {
- // 设置obj的值为value
- Reflect.set(target, key, value)
- return true
- }
- })
- return proxy
- }
- const state = reactive({ a: 1, b: 2 })
- console.log(state.a)
- state.b = 3
小结:常见误区
思考1:
代理对象和原对象是一种怎样的关系?
思考2:
【vue2的数据绑定】Data binding和【vue3的响应式】Reactive的关系?