本系列博文从 Shadow Widget 作者的视角,解释该框架的设计要点。本篇解释 Shadow Widget 中类 Vue 的控制指令,与指令式界面设计相关。

1. 指令式界面设计

Vue 与 Angular 都支持用控制指令描述界面,比如 Vue 中循环创建多个节点:

<div v-for="(index, item) in items">
{{ index }} {{ item.message }}
</div>

Angular 也有类似 v-for, v-if, v-else 等控制指令,这些对于快速定义用户界面很有用,而 React 实现类似功能需借助 JS 编程,在便捷、直观方面不如 Angular 与 Vue。Shadow Widget 通过引入可计算属性与 MJI 解释器,弥补了 React 这项缺陷。

2. 节点引用

界面设计中常需要照着一个构件的样式,复制出多个,比如下面 btn2 按钮,保持与 btn1 一致的样式:

  <span $=Button key='btn1' sty__='background:#eee; border-color:#ccc'>Test 1</span>
<span $='//btn1' key='btn2'>Test 2</span>

Shadow Widget 的转义标签也用 $=xx 属性表达节点引用,这与指定 WTC 类(如上面 $=Button)不冲突,因为表达引用时,字串值必是路径格式,首字母必是 '.''/',而指示 WTC 类,首字母必定不是这两个。系统能自动识别这两种用法,用于路径引用时,我们习惯用引号括起来,而用作 WTC 类时,不加引号(不必担心,浏览器会自动把它看成字串的),这么书写理解起来很清晰。

3. 开启解释执行的上下文环境

控制指令是可计算属性中的一种,可计算属性是一种通过脚本表达式,借助 MJI (Mini Javascript Interpreter) 解释器动态解析计算的属性。比如:

<span $=Button key='btn1' sty__='background:#eee; border-color:#ccc'>Test 1</span>
<span $='//btn1' key='btn2' data='{{"desc":"Test 2"}}'
$html="duals.data.desc"></span>

这里 $html 是可计算属性,这段代码运行效果与前面等同。

须注意,可计算属性只在开启 MJI 解释运行环境后才生效,否则它只是常规字串。解释运行环境按需动态开启,用完即自动销毁,有此环境 MJI 才能维护脚本计算的上下文运算关系。有下面几种开启解释运行环境的方式:

  1. $=path 建立引用,如上面举例,如果引用位置尚不存在解释运行环境,系统将自动创建一个。
  2. $for=expr$$for=expr 指示将一层调用空间压入栈,系统自动检测当前是否有解释运行环境,若没有,也自动创建。
  3. $for='' 开启一个调用空间,如果当前没有解释运行环境,系统自动创建。

4. 栈式调用空间

与常规编程语言类似,MJI 解释运行环境也有调用栈,一个 $for 循环要使用一套 item, index, count 变量,多个 $for 循环嵌套使用,就形成多套 item, index, count 变量的栈式结构。

在 MJI 解释运行环境中,按如下方式使用首层调用空间中的变量:

  props(0).attr   duals(0).attr   state(0).attr
item(0) index(0) count(0)

或简写如下:

  props.attr   duals.attr   state.attr
item index count

如果读上一层栈中变量:

  props(-1).attr   duals(-1).attr   state(-1).attr
item(-1) index(-1) count(-1)

再往一层,则用 -2 指示,其它类推。

5. 举一个例子

<div $=Panel key='top' height='{null}'>
<div $=Div key='msg' dual-required='{30}' $for=''
dual-data='{[{"name":"Wayne","age":20},{"name":"George","age":35}]}'>
<div $=Ul width='{0.9999}' $title='duals.data.length + " people"'
$for='item in duals.data'>
<div $=Li $key='"if_" + index' $if='item.age >= duals(-1).required'
$html='item.name + " is old"'></div>
<div $=Li $key='"el_" + index' $else=''
$html='item.name + " is young"'></div>
</div>
</div>
</div>

运行效果如下:

这个例子包含知识点较集中,讲解几个要点:

  1. $for='' 开启一个解释执行的计算环境,后面的 $for='item in duals.data' 则进入下一层,当前调用空间将压栈。
  2. 内层 $for 中的可计算属性要引用上层调用空间,这么书写:duals(-1).required
  3. $if$else 也是控制指令,有条件的显示特定节点。还有一个 $elif 没举例到,含义为 "else if",用法可类推。
  4. $for 下用来表达循环生成的节点,要显式指定 key 值,如本例的 $key="if_"+index$key="el_"+index,这里 index 是循环序号,依次取值为 0, 1, 2...

6. 更多功能

本系列博文提供引导式入门介绍,过多细节略去不讲。关于指令式界面设计的内容,重要些的还有:

  1. $for 组装子成员提供过滤、排序等功能
  2. 可计算表达式能用于异步计算,比如发起 ajax 调用
  3. 提供 flex 布局面板,方便可视化的快速搭建一个页面
  4. 支持模板定义(TempPanel, TempDiv),便于定制化引用、批量引用
  5. 用导航面板与选项构件,快速搭建列表导航、分页导航等应用,导航面板还为绝对路径分段,让其下节点能用 "./xx""../../xx" 相对路径方式做引用。
  6. 选项构件支持弹出浮窗,支持 trigger 触发器等

细节请阅读《Shadow Widget 用户手册》。


本专栏历史文章:

  1. 介绍一项让 React 可以与 Vue 抗衡的技术
  2. React 可视化开发工具 Shadow Widget 非正经入门(之一:React 三宗罪)
  3. React 可视化开发工具 Shadow Widget 非正经入门(之二:分离界面设计)
  4. React 可视化开发工具 Shadow Widget 非正经入门(之三:双源属性与数据驱动)
  5. React 可视化开发工具 Shadow Widget 非正经入门(之四:flux、mvc、mvvm)

React 可视化开发工具 Shadow Widget 非正经入门(之五:指令式界面设计)的更多相关文章

  1. React 可视化开发工具 Shadow Widget 非正经入门(之六:markdown)

    本系列博文从 Shadow Widget 作者的视角,解释该框架的设计要点.本篇讲解 Markdown 在 Shadow Widget 中的应用. Markdown 在 Shadow Widget 中 ...

  2. React 可视化开发工具 shadow-widget 的非可视开发方法

    Shadow Widget 提倡在可视设计器中开发用户界面,输出转义标签,而非 JSX.许多童鞋可能不知道 SW 同样支持用 JSX 设计界面,开发体验比原生 React 编程好出很多,本文就介绍这方 ...

  3. eclipseGUI的可视化开发工具插件

    一   各种GUI开发插件的特色 Eclipse并不自带GUI的可视化开发工具,那么如果要在Eclipse进行可视化的GUI开发,就需要依靠第三方的插件. 1. Visual Editor Eclip ...

  4. wxwidget wxpython 可视化开发工具

    wxwidget官方建议的工具集合:http://wiki.wxwidgets.org/Tools 支持wxpython可视化开发工具 wxFormBuilder wxGlade wxDesigner ...

  5. iOS程序员的React Native开发工具集

    本文整理了React Native iOS开发过程中有用的工具.服务.测试.库以及网站等. 工具 你可以选择不同的开发环境:DECO.EXPO或者你可以使用Nuclide+Atom,目前我使用EXPO ...

  6. React-Native(二):React Native开发工具vs code配置

    从网上翻阅了一些开发react-native的开发工具时,发现其实可选的工具还是比较多的Sublime Text,WebStrom,Atom+Nuclide,vs code 等.因为我用.net生态环 ...

  7. React Native开发工具Nuclide使用

    之前写RN的时候首选webstorm,这是之前做前端已经习惯的工具,其实RN开发官网推荐的是Nuclide工具, Nuclide是Fackbook专门为React开发IDE,今天也来尝试下,如果对we ...

  8. React等开发工具记录

    React Native :React 起源于 Facebook 的内部项目,结合了 Web 应用和 Native 应用的优势,可以使用 JavaScript 来开发 iOS 和 Android 原生 ...

  9. React Native 开发工具篇

    正文 概述:开发RN的工具有很多,选择性也比较多,比如Facebook专门为React开发的IDE:Nuclide,还有做前端比较熟悉的WebStorm.Sublime Text 3.VS Code等 ...

随机推荐

  1. numpy.random模块用法小结

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9751471.html 1.np.random.random()函数参数 np.random.r ...

  2. 二、python数据类型详解

    基本概念 迭代(iteration):如果给定一个list或tuple,我们可以通过for循环来遍历,这种遍历我们称为迭代(iteration) 可变:value改变,id不变,可变类型是不可hash ...

  3. LeetCode-062-不同路径

    不同路径 题目描述:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 "Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下 ...

  4. 【持续更新】Git使用指南

    Tutorial from cs61B 1. 理解Git的不同视角 文件状态图 从状态视角理解git: 一个文件有4种状态, 状态转换如图所示 从存储视角理解git: 工作区:电脑里能看到的目录 暂存 ...

  5. SQL Server--一个存储过程对同一个字段执行两种Update

    需求: 服务器程序被界面点击"置零"按钮后,所有未完成的任务的状态都置为异常结束. 但分两种情况: 0<=Status<40状态为未完成的任务1,其异常结束状态为50 ...

  6. 服务端&客户端注册进Eureka

    目录 服务端(接口提供方) 创建项目 导入Eureka客户端POM 启动类添加注解 配置YML 暴漏接口 启动服务 集群 配置成功后页面如下 客户端(接口调用方) 修改Yml文件 配置类 启动类添加注 ...

  7. 火狐firebug&firepath插件安装

    火狐浏览器下掉了firebug和firepath插件,用户即使下载了火狐55以下的版本,也无法查找到这两个插件,以下方法可以解决哦 第1步:下载火狐55以内版本安装包,安装时迅速设置禁止自动更新版本, ...

  8. Java将彩色PDF转为灰度

    本文以Java代码为例介绍如何实现将彩色PDF文件转为灰度(黑白)的PDF文件,即:将PDF文档里面的彩色图片或者文字等通过调用PdfGrayConverter.toGrayPdf()方法转为文档页面 ...

  9. 互联网前沿技术——01 找不到模块“lodash”

    检查安装 node --version 修改 安装:npm install 启动:grunt server 如果报错: 找不到模块"lodash" https://www.soin ...

  10. DAViCal 跨站请求伪造漏洞

    受影响系统:DAViCal DAViCal <= 1.1.8描述:CVE(CAN) ID: CVE-2019-18346 DAViCal是一款日历共享服务器. DAViCal 1.1.8及之前版 ...