Vue零底子教程|从前端框架到GIS开辟系列课程(七)相应式体系先容

[复制链接]
发表于 2025-11-23 20:04:28 | 显示全部楼层 |阅读模式
前文指路:《Vue零底子教程》,从前端框架到GIS开辟系列课程
Vue零底子教程|从前端框架到GIS开辟系列课程(二)
Vue零底子教程|从前端框架到GIS开辟系列课程(三)模板语法
Vue零底子教程|从前端框架到GIS开辟系列课程(四)盘算属性与侦听器
Vue零底子教程|从前端框架到GIS开辟系列课程(五)组件式开辟
Vue零底子教程|从前端框架到GIS开辟系列课程(六)组合式API
 
Party1什么是相应式

当数据改变时, 引用数据的函数会主动重新实行

 
Party2手动完成相应过程

起首, 明白一个概念:相应式是一个过程, 这个过程存在两个加入者: 一方触发, 另一方相应
同样, 所谓数据相应式的两个加入者
●触发者: 数据
●相应者: 引用数据的函数
当数据改变时, 引用数据的函数相应数据的改变, 重新实行
我们先手动完成相应过程
示例
  1. <!DOCTYPE html><html lang="en">  <head>    <meta charset="UTF-8" />    <meta http-equiv="X-UA-Compatible" content="IE=edge" />    <meta name="viewport" content="width=device-width, initial-scale=1.0" />    <title>Document</title>  </head>  <body>    <div id="app"></div>    <script>      // 定义一个全局对象: `触发者`      const obj = { name: 'hello' }
  2.       // effect函数引用了obj.name, 这个函数就是 `响应者`      function effect() {        // 这里可以通过app拿到DOM对象        app.innerHTML = obj.name      }
  3.       effect()
  4.       // 当obj.name改变时, 手动执行effect函数, 完成响应过程      setTimeout(() => {        obj.name = 'brojie'        effect()      }, 1000)</script>  </body></html>
复制代码
为了方便, 我们把引用了数据的函数 叫做副作用函数

Party3副作用函数

如果一个函数引用了外部的资源, 这个函数会受到外部资源改变的影响
我们就说这个函数存在副作用. 因此, 也把该函数叫做副作用函数
这里, 各人不要被这个生疏的名字吓唬住
所谓副作用函数就是引用了数据的函数大概说数据关联的函数

Party4自界说设置过程

如果我们能感知数据改变, 拦截到赋值利用. 自界说设置过程
在赋值的同时调用一下数据关联的副作用函数, 就可以实现主动重新实行
理论上可行, 开始动手实践
1) Proxy署理对象


这里我们须要先增补一下Proxy干系的知识. 如果已经知道的小同伴可以略过
new Proxy: 传入一个源对象, 返回一个新对象(署理对象)
当访问署理对象的属性时, 可以自界说访问过程
当设置署理对象的属性时, 可以自界说设置过程
示例
  1. <!DOCTYPE html><html lang="en">  <head>    <meta charset="UTF-8" />    <meta http-equiv="X-UA-Compatible" content="IE=edge" />    <meta name="viewport" content="width=device-width, initial-scale=1.0" />    <title>Document</title>  </head>  <body>    <script>      // 定义一个源对象(目标对象)      const obj = { name: 'xiaopang' }            // 创建一个代理对象      const proxy = new Proxy(obj, {        get(target, key) {          // 当访问proxy代理对象的属性时, 会执行get函数          // 将get函数的返回值作为表达式的值          console.log(target, key)          return target[key] // obj.name obj[name]        },        set(target, key, value) {          // 当设置proxy代理对象的属性时, 会执行set函数          console.log('自定义set操作', value)          target[key] = value          return true        },      })      // console.log(proxy.name)      // console.log(proxy.age)      proxy.name = 'xxp'      console.log(obj)</script>  </body></html>
复制代码
如许就确定了思绪
1先创建署理对象
2再利用署理对象(给署理对象赋值)

2) 最根本的reactive函数


界说一个函数reactive, 传入一个平凡对象, 返回署理对象
示例​​​​​​​
  1. <!DOCTYPE html><html lang="en">  <head>    <meta charset="UTF-8" />    <meta http-equiv="X-UA-Compatible" content="IE=edge" />    <meta name="viewport" content="width=device-width, initial-scale=1.0" />    <title>Document</title>  </head>  <body>    <script>      function isObject(value) {        return typeof value === 'object' && value !== null      }      /**       * 创建响应式数据       *  @param [object]: 普通对象       *  @return [Proxy]: 代理对象       */      function reactive(data) {        if (!isObject(data)) return
  2.         return new Proxy(data, {          get(target, key) {            return target[key]          },          set(target, key, value) {            target[key] = value            return true          },        })      }
  3.       const state = { name: 'xiaopang' }      const p = reactive(state)      p.name = 'xxp'      console.log(p.name)</script>  </body></html>
复制代码
Party5最根本的相应式

既然可以自界说set利用, 只须要在自界说set利用时, 重新实行属性关联的副作用函数
示例​​​​​​​
  1. <!DOCTYPE html><html lang="en">  <head>    <meta charset="UTF-8" />    <meta http-equiv="X-UA-Compatible" content="IE=edge" />    <meta name="viewport" content="width=device-width, initial-scale=1.0" />    <title>Document</title>  </head>  <body>    <div id="app">hello</div>    <script>      /**       * 定义响应式       *  @param [object] : 普通对象       *  @return [Proxy] : 代理对象       */      function reactive(data) {        // 如果传入的data不是一个普通对象, 不处理        if (typeof data !== 'object' || data == null) return
  2.         return new Proxy(data, {          get(target, key) {            console.log(`自定义访问${key}`)            return target[key]          },          set(target, key, value) {            console.log(`自定义设置${key}=${value}`)            target[key] = value // 先更新值            effect() // 再调用effect, 调用effect时会重新获取新的数据            return true          },        })      }
  3.       const pState = reactive({ name: 'hello' })
  4.       function effect() {        app.innerHTML = pState.name      }
  5.       setTimeout(() => {        pState.name = 'brojie'      }, 1000)</script>  </body></html>
复制代码
看到这里, 恭喜你, 已经把握了最核心的原理🤝

💡小结
1相应式是一个过程, 存在触发者和相应者
2数据的改变, 触发关联的副作用函数相应(重新实行)
3通过Proxy署理源数据
4在Proxy的自界说set利用中, 重新实行副作用函数



须要vue教程资料,备注:《Vue零底子教程》

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表