优维低代码:Context 上下文

context 有什么作用 Go 常用来写后台服务,通常只需要几行代码,就可以搭建一个 http server。 在 Go 的 server 里,通常每来一个请求都会启动若干个 goroutine 同时工作:有些去数据库拿数据,有些调用下游接口获取相关数据…… 这些 goroutine 需要共享这个请求的基本数据,例如登陆的 token,处理请求的最大超时时间(如果超过此值再返回数据,请求方因为超时接收不到)等等。当请求被... 阅读详情

导语

优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。


连载第二十三期

《高级指引:Context 上下文》

▽

有时候我们需要在多个构件之间交换数据。在 React 中,我们通常使用 Context 来解决这样的问题。在 Storyboard 中我们也可以使用类似的机制来解决编排时处理构件间的数据交换问题。

# 示例

Context 分为定义及使用,在路由或构件处可以定义 Context,该 Context 可以在定义它的路由或构件所包裹的所有内部构件(及 useBrick)使用。

定义方式一(自由变量):

routes:  - path: "${APP.homepage}/your-page"    context:      - name: myContext        # 初始 `value` 可以使用占位符。        value:          quality: good
      # 初始 `value` 是可选的。      - name: myAnotherContext

定义方式二(异步 Resolve 的自由变量):​​​​​​​

routes:  - path: "${APP.homepage}/your-page"    context:      - name: myAsyncContext        resolve:          useProvider: my-provider          # 默认将使用 Provider 返回的数据作为该 Context 的值(brick_next >= 1.25.2 支持)。          # 如果需要转换数据,注意需使用 transform 后的 value 值。          transform:            # `CTX.myAsyncContext` 的值将是 `DATA.hostname`。            value: "<% DATA.hostname %>"

定义方式三(绑定构件属性):​​​​​​​

bricks:  - brick: my.source-brick    context:      - name: myContextRelatedToProp        property: sourceProp

已废弃定义方式(绑定构件属性):​​​​​​​

bricks:  - brick: my.source-brick    exports:      sourceProp: CTX.myContextRelatedToProp

绑定构件属性的方式实际存储的是引用关系,在消费时实时获取。对于以上 Context,使用 <% CTX.myContextRelatedToProp %> 获取的值为 my.source-brick 的属性 sourceProp 的值。

使用方式:​​​​​​​

bricks:  - brick: my.source-brick    events:      something.change:        # - 'context.assign': use `Object.assign(context, newValue)` to update current context.        #   function contextAssign(contextName, newValue) => void        #        # - 'context.replace': use `context = newValue` to replace current context.        #   function contextReplace(contextName, newValue) => void        action: "context.assign"        args:          - myContext          - quality: better
  - brick: my.trigger-brick    events:      something.submit:        target: my.submit-provider        method: resolve        args:          - q: "<% CTX.myContext %>"

在占位符中可以使用 CTX.contextName 获得名字为 contextName 的上下文的值;对于事件则提供了 context.assign 和 context.replace 两个内置动作,更多信息请参考 Events 事件 > 内建处理器:context.*。

注意:不能对绑定构件属性的 Context 执行 context.* 操作。

# 条件判断 If

对于使用自由变量或 Resolve 方式的 Context,可以配置 if 来按条件决定是否启用对应的 Context。更多关于条件判断的说明请参考 If 条件渲染。

例如:​​​​​​​

context:  - name: "myData"    if: '<% !FLAGS["my-flag"] %>'    value: "My default value"  - name: "myData"    if: '<% FLAGS["my-flag"] %>'    resolve:      useProvider: "my.any-provider"

上述配置将在开关 my-flag 关闭时,将 CTX.myData 设置为固定值 "My default value",而 my-flags 打开时,则将 CTX.myData 设置为 my.any-provider 的请求结果。被忽略的 Context 不会生效,也不会发起请求。

另外 Resolve 配置中的 if 同样有效,例如:​​​​​​​

context:  - name: "myData"    resolve:      if: '<% FLAGS["my-flag"] %>'      useProvider: "my.any-provider"

⊙NOTE

需要声明依赖 brick_next: ^2.22.13。

# 变更事件

有时候我们希望声明一个 Context 变量,但不对它立即赋值,而是通过特定事件触发赋值,并且希望能监听其变更事件。

可以在声明 Context 时定义 onChange,例如:​​​​​​​

path: "/my-app"context:  - name: "myData"    value:      status: "loading"    # `onChange` 和其它事件处理接口一样,    # 可以设置为单个或多个(数组)事件处理器。    onChange:      target: "#myBrick"      properties:        someProp: "<% EVENT.detail.status %>"    # 另注:不能对绑定构件属性的 Context 设置 `onChange` 事件。

然后在特定条件发生时再对其赋值,例如:​​​​​​​

brick: "any-brick"events:  success:    action: "context.assign"    args:      - status: "loaded"  error:    action: "context.assign"    args:      - status: "failed"

当 Context 发生变化时,onChange 注册的事件处理器将被调用,传递的事件对象的 detail 为该 Context 的值。关于 Context 变更操作请参考 Events 事件 > 内建处理器:context.*。

⊙NOTE

使用 onChange 需要声明依赖 brick_next: ^2.19.7。

# 注意事项

在事件回调里始终能拿到当事件发生时、最新的 Context 的值,而在属性中,默认只能在构件初始时拿到 Context 的初始值,此时该 Context 相当于一个应用的常量,例如:​​​​​​​

bricks:  - brick: my.another-brick    properties:      oneProp: "<% CTX.myContext %>"

当 Context 值变化时,my.another-brick 的对应属性不会自动更新。框架理论上可以实现联动更新,但相对困难,后续将视实际场景需求决定是否支持。

# 构件属性追踪 Context 变更

如果希望构件的属性能跟随 Context 的变化而变化,可以在表达式前面添加一句 "track context", (逗号运算符),可以激活 Context 追踪模式,当表达式中引用的 Context 变化时,该属性将自动重新计算并赋值。

例如:​​​​​​​

bricks:  - brick: my.any-brick    properties:      anyProp: "<% 'track context', CTX.myContext + CTX.myAnotherContext %>"

当 myContext 或 myAnotherContext 任一值改变时,my.any-brick 将重新计算并赋值给属性 anyProp。注意 "track context" 仅用于第一层属性赋值,可以用于自定义模板,但目前不能用于 useBrick 的构件属性。

⊙NOTE

这里参考了 "use strict"; 的用法,并利用了逗号运算符返回最后一个运算对象的特性。

⊙NOTE

使用 "track context" 需要声明依赖 brick_next: ^2.27.24。

# 懒加载

默认情况下,如果 Context 定义为 Resolve,它会在页面加载前发起请求并阻塞渲染,但有些数据并不着急需要,可能只需在特定条件下再发起请求即可(例如打开抽屉时)。这时可以标记 resolve.lazy: true 将它设置为懒加载,该数据将不会默认发送请求,需要开发者在特定条件下主动触发 context.load 来发起请求。​​​​​​​

context:  - name: "myLazyData"    resolve:      useProvider: "my-provider"      lazy: true    # 可以为懒加载的数据配置一个初始值,默认为 `undefined`    value: "Initial"​​​​​​​
brick: "my-brick"properties:  dataSource: '<% "track context", CTX.myLazyData %>'events:  button.click:    action: "context.load"    args:      - "myLazyData"

⊙NOTE

context.load 将确保一个 Context 只会被加载一次,避免发起重复的数据请求。虽然 context.refresh 也可以用于主动加载一个标记了懒加载的 Context,但通常情况下这里我们应该使用 context.load 来避免发起重复的请求。

context.load 和 context.refresh 同时还支持配置回调事件:​​​​​​​

events:  button.click:    action: "context.load"    args:      - "myLazyData"    callback:      success:        action: console.log        args:          # Success 事件详情为更新后的 Context 值          - "<% EVENT.detail %>"      error:        action: console.error        args:          # Error 事件详情为错误对象          - "<% EVENT.detail %>"      finally:        action: console.info

# 主动强制更新

内置事件 context.refresh 可以强制更新一个设置了异步请求的 Context。​​​​​​​

brick: "my-brick"events:  button.click:    action: "context.refresh"    args:      - "myAnyData"

context.refresh 也支持配置回调事件,相关示例请见本文上一节。

# 依赖追踪

前面我们提到了 "track context" 用于构件属性自动追踪 Context 的更新,另一方面,我们还提供了让 Context 可以追踪其自身依赖的 Context 的能力。

例如:​​​​​​​

context:  - name: "myTrackableData"    track: true    resolve:      useProvider: my-provider      args:        - <% CTX.myDepA %>        - <% CTX.myDepB %>

标记 track: true 后,当 myDepA 或 myDepB 变更时(使用 context.replace/context.refresh 等),myTrackableData 会自动重新发起请求并计算得到新的值。

对于普通变量的数据也可以追踪:​​​​​​​

context:  - name: myTrackableData    track: true    value: "<% CTX.myDepA + CTX.myDepB %>"

⊙NOTE

对于指定了 track: true 的异步 Context,追踪到依赖变化后,将重新计算相关参数,但如果计算得到的请求参数没有发生任何变化,此时将命中缓存,不会发起新的请求。如果业务上需要强制更新数据,应使用 context.refresh,该方法将忽略请求缓存。

基于uniapp开发PDA扫码枪APP:实现RFID批量扫描读取功能 基于uniapp的PDA扫码枪APP开发实战,实现高效RFID读取功能,uniapp整合PDA硬件的实践分享,基于uniapp的PDA端RFID批量扫描方案开发 阅读详情

相关推荐

Windows环境下IBSIMU的安装

本文主要介绍离子束仿真程序IBSIMU在Windows环境下的安装。

C_Tso的博客 2993

Intellij IDEA--git的用法

使用git 其他网址:IDEA中Git的使用 - 关键步就几步 - 博客园 生成UML类图 其他网址:IDEA 如何生成UML类图 - 转 - 简书 1.设置类图包含项 File=> Setting=> Tools=> Diagrams=> Java Class Diagrams=> 选择要包含的项(成员变量、构造器、方法、配置文件、内部类) (...

IT利刃出鞘的博客 3037

使用electron静默打印

使用electron静默打印 1.使用electron打印的理由 很多情况下程序中使用的打印都是用户无感知的。并且想要灵活的控制打印内容,往往需要借助打印机给我们提供的api再进行开发,这种开发方式非常繁琐,并且开发难度较大。 electron提供的打印api可以非常灵活的控制打印设置的显示,并且可以通过html来书写打印内容。 2.api ele...

w1366352655的博客 945

加速 Vue 项目开发:使用低代码开发组件

给大家推荐一款低代码神器 MyBricks,可以在线使用低代码搭建,然后一键保存到本地的 Vue 项目中作为组件使用。

weixin_47864407的博客 1850

Linux CentOS 8系统离线升级内核版本

CentOS 8操作系统离线场景下升级内核版本

WQwinter的博客 3237

在Android中实现SIM卡的读写操作

在上述代码中,我们创建了一个PhoneStateListener的实例,并重写了onSimStateChanged方法来处理SIM卡状态改变的事件。然后,我们通过调用telephonyManager的listen方法注册了这个监听器,并指定了要监听的事件类型为SIM卡状态的改变。在上述代码中,我们调用telephonyManager的sendUssdRequest方法来发送USSD命令,并通过TelephonyManager.UssdResponseCallback来处理USSD响应和发送失败的情况。

2301_79326510的博客 927

美的低代码治理方法论

美的低代码治理方法论以MyBricks引擎为核心,旨在通过科学、系统的手段量化低代码平台在企业应用开发中的效果,为企业的数字化转型与创新提供有力支撑。这一方法论巧妙地结合了产品侧应用复杂度分级与用户侧开发者能力分级,构建了一套全面而精细的评估体系,以确保低代码平台的价值得到最大化发挥。

weixin_43156294的博客 1035

点云配准SIFT+SI+RANSAC+ICP

Spin Image(SI)是一种用于点云数据描述的特征描述子,广泛应用于三维点云配准、识别和重建等领域。它能够捕捉点云中的局部几何信息,具有旋转不变性和部分平移不变性等优点,是一种非常强大的特征描述子。Spin Image是一种强大的点云特征描述子,具有旋转不变性、局部几何信息捕捉等优点,适用于点云配准、目标识别和三维重建等多个领域。通过合理选择局部区域、建立参考框架和计算描述子,可以充分利用Spin Image描述点云的特征,从而实现各种三维场景分析和处理任务。

点云兔子的博客 559

实践,制作一个高扩展、可视化低代码前端,详实、完整

RxEditor是一款开源企业级可视化低代码前端,目标是可以编辑所有 HTML 基础的组件。本文介绍了其实现机制。

悠闲的水的博客 1771

Spring AI Alibaba实战训练营-20 基于注解驱动的MCP快速开发入门指南

本文详细讲解如何使用SpringAiAlibaba快速开发基于注解驱动的MCP应用。文章详细介绍了MCP协议并且重点介绍了Spring AI通过注解驱动的开发方式简化MCP服务开发。具体包括服务端和客户端的注解使用、城市最新时间查询MCP项目结构概览(服务端和客户端模块)以及环境配置要求。

program哲学 295

Agent Skills应用解析:构建可扩展、高效率AI探员

Agent Skills是一个简洁而强大的概念:它是一个包含组织化的指令、脚本和资源的文件夹,智能体可以动态地发现并加载这些内容,以在特定任务中表现更佳。可组合性(Composability):一个Agent Skill是一个独立的、封装良好的能力单元。开发者可以为不同的功能(例如PDF处理、网络浏览、数据分析)创建独立的技能,然后根据需要将它们组合起来,赋能不同的智能体。这意味着不再需要为每个用例构建碎片化、定制设计的智能体,而是可以通过组合现有技能来快速构建新的专业智能体。

形上得其象,形下合于数;阴阳自济,玄理自明。 1628

低代码可视化工具-uniapp页面跳转传参-代码生成器

在uni-app中,页面间的跳转和传参是一个常见的需求。uni-app提供了多种页面跳转方式,如uni.navigateTo、uni.redirectTo、uni.reLaunch、uni.switchTab、uni.navigateBack等,每种方式适用于不同的场景。以。

luck332的专栏 643

【四足机器人项目实战】四足机器人弹簧倒立摆(SLIP)动力学模型

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言1.动力学建模构型方法2.四足机器人动力学模型(1)多体动力学模型【针对躯干+脚建模】方法一:VMC(VirtualModelController)模型方法二:SLIP模型(2)浮基单体动力学模型【针对躯干建模】【用于MPC】 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对四足机器人动力学模型-VMC、SLIP和浮动机体模型做个简

qq_35635374的博客 7313

优维低代码实践:Context / State

State 的能力和 Context 几乎完全一致,不同的是,Context 的作用域是整个页面、是全局的,我们的自定义模板,同一个模板在页面中可能有多个实例,如果直接使用 Context,则多个实例间的数据会互相影响。而 State 是局部的状态数据,相当于我们的局部变量,其只应用于模板的内部。PATH 的配置项是给 context 分组用的,当一个路由管理的 context 很多时,为了方便管理和查找,我们可以给每一个 context 进行分类,这样同一类下的 context 会放在同一目录下展示。

EasyOps_DevOps的博客 1146

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

优维低代码实践:对接数据

接口字段定义需要说明下,我们的字段定义是包含了 uri 中的参数的,如上图所列的路由 v2/object/:objectId/instance/_search中,`objectId` 这个参数也定义在请求体中的,对于我们 uri 中的参数都需要单独占位,剩余的接口 data 参数一起占位,上面接口请求的参数如下写法。同样的如果使用的是 provider 类型的接口,我们也提供了 provider 类型的接口文档,可以通过 provider 文档 查看具体的信息。

EasyOps_DevOps的博客 1843

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

优维低代码实践:搜索功能

在之前的示例中,我们有直接对接后端数据、通过事件进行接口的翻页数据请求等,但是在实际操作过程中,面对大量的数据,如果通过一页一页的翻阅查找,不方便且浪费时间,那么就会有搜索的功能要求,比如单字段的搜索,多字段的且、或搜索等。更改context中的请求内容,通过query.q或其他推送到url上的参数,进行或、并的匹配操作,从而达到动态获取用户输入的信息,并在页面刷新时,自动将搜索内容作为入参,调用后端接口匹配符合的数据并返回给前端渲染。修改输入框的事件内容。添加搜索框构件后,修改搜索框的属性。

EasyOps_DevOps的博客 688

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

优维低代码:Use Resolves

在早期版本中,我们只提供了通过provider指定CSSSelector并需提前在bricks或providers中主动声明对应的Provider构件的方式来使用useResolves,例如以下的构件配置,平台在渲染该构件前,将首先找到provider匹配的对应的。优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。...

EasyOps_DevOps的博客 237

优维低代码:Permissions 权限校验

优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。在路由或构件处定义,强烈建议在路由处定义,在路由下面的构件中都可直接使用。如果分别在多处定义,则会发起多次校验的请求。定义 permissionsPreCheck:​​​​​​​。定义 permissionsPreCheck:​​​​​​​。校验权限:​​​​​​​。校验权限:​​​​​​​。

EasyOps_DevOps的博客 817

优维低代码:Provider 构件

如果给事件处理器配置了 callback,那么系统在事件触发后,除了执行指定 method 外,还将根据该函数执行结果进行回调调用:method 将被视作异步函数调用,当该函数成功时(resolved),将触发 callback.success 回调,反之(rejected)将触发 callback.error,而无论成功或失败,最后都将触发 callback.finally。例如假设有一个查询工具执行结果的接口需要轮询以得到最终执行结果,可以这样配置:​​​​​​​。...

EasyOps_DevOps的博客 214

十字路口交通信号灯问题之代码实现

在上一篇博客十字路口交通信号灯问题之需求解析>>中介绍了程序的需求,这篇博客将给大家介绍代码如何实现,实现中没有实现GUI,只是对十字路口交通信号灯的逻辑进行了简单的实现.   Road类. /** * 每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。 * 每条路线上随机增加新的车辆,增加到一个集合中保存。 * 每条路线每隔一秒都会检查控制本路

唐欢 5554

黑马程序员_交通灯管理系统

------- android培训、java培训、期待与您交流! ---------     需求分析:   每条路线上都会出现多辆车,路线上要随机增加新的车,在灯绿期间还要每秒钟减少一辆车。 设计一个Road类来表示路线,每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。 每条路线上随机增加新的车辆,增加到一个集合中保存。 每条路线每隔

rebel_sun的专栏 549

vue-trackjs 自定义指令轻松实现前端埋点

vue-trackjs 是一个基于vue自定义指令开发的声明式自动埋点方案,压缩后只有2.5K,对业务代码没有侵入影响。使用localStorage对统计数据进行缓存,默认每60s轮询上报一次数据。入手毫无难度,插件也预留了自定义扩展API,给你充分的发挥空间。 前言 埋点技术,即在正常的功能逻辑中添加统计逻辑,进行数据收集,后续经过各种自定义的数据整理,为对应的产品提供数据分析,实现数据可视化。 常见的前端埋点技术有:代码埋点、可视化埋点、无埋点。 代码埋点:手动在需要埋点的节点调用接口发送数据。 优.

weixin_44041976的博客 4729

idea 怎么对 track 文件忽视

在使用Git过程中,我们经常碰到的就是,build完代码生成的一堆临时文件,也出现在Git Status中。在Commit时,明明可以用Git Add .一句完成的,结果被迫使用Git Add File一句一句添加。 对于tracked文件来说,使用.gitignore是不行的。但是git提供了新的方法。使用命令git update-index --assume-unchanged <f...

梦Dancing的博客 806

初学者使用Subversion(SVN)进行版本跟踪

Have you ever wanted to work on a project with theabilityto track your changes as well as revert them? How-To GeekexplainsHow-To use the popular version tracking system,Subversion (a.k.a SVN). 您...

culingluan4376的博客 581

Go标准库:context详解

Context的主要功能就是用于控制协程退出和附加链路信息。核心实现的结构体有4个。

flynetcn的专栏 1585

到底什么是上下文(Context)

看代码经常能看到一些变量命名 XXXcontext XXXctx,或者一些博客中也总提到一个名词:上下文(context)。一直非常疑惑,到底什么叫上下文。也没太好意思问人,感觉就是很简单的概念。自己google下,发现也确实有很多人有同样的疑惑。 从字面理解,上下文——就是上下的文意。语文中经常提到的一个名词。根据上下文来理解某个词,某段等等。但是具体到代码中,到底什么才是...

5万+
上一篇: UGeek大咖说 | 顺丰科技:全链路压测中的可观测性实践
下一篇: 使用OpenTelemetry进行端到端跟踪
优维科技EasyOps
博客等级 码龄5年 1483粉丝 395原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值