脚本开发

  1. return {
  2. mounted: function () {
  3. console.log('hello world')
  4. }
  5. }

以上几行代码实现了一个超级简单的脚本!使用了此脚本的组件会在其 mounted 生命周期打印出 hello world

所以,如上所示,脚本就是一个 Vue 配置对象(option object)。是的,就是这么简单!

除原生 Vue 配置属性外,我们提供了自定义属性、自定义方法添加方案、以及 vm.$options.$lib、数据总线等服务。

添加自定义属性

使用脚本添加自定义属性,用户在配置面板配置属性后,脚本可通过组件实例访问到该属性设定值。

支持自定义输入类型、条件属性等。

可复制下文代码为任一组件添加脚本查看效果。

  1. /**
  2. *
  3. * @param type: 字段类型,支持原生类型以及【码良输入类型】
  4. *
  5. * 码良输入类型:
  6. * input 单行输入框
  7. * text 多行输入框
  8. * enum 列表单选 需提供选项字段defaultList, 支持数组、map结构
  9. * image 图片选择
  10. * audio 音频选择
  11. * video 视频选择
  12. * richtext 富文本
  13. * number 数字
  14. * function 方法设置
  15. * data json数据
  16. * date 时间选择
  17. * checkbox 多选框 同enum 不提供defaultList字段时,输入值为布尔类型
  18. * radio 单选框 同enum
  19. *
  20. */
  21. return {
  22. props: {
  23. // 原生类型
  24. foo: {
  25. type: String
  26. },
  27. // 图片输入
  28. fooImage: {
  29. type: String,
  30. editor: {
  31. type: 'image'
  32. }
  33. },
  34. // 日期
  35. fooDate: {
  36. editor: {
  37. type: 'date'
  38. }
  39. },
  40. // json数据
  41. fooData: {
  42. type: String,
  43. editor: {
  44. type: 'data'
  45. }
  46. },
  47. // checkbox 多选
  48. fooCheckbox: {
  49. type: Array, // 此项必须为Array
  50. default: () => { // 且需提供初始值
  51. return [] // ['day', 'hour', 'min', 'sec']
  52. },
  53. editor: {
  54. label: '显示精度',
  55. type: 'checkbox',
  56. defaultList: [ // array 形式的选项
  57. 'day',
  58. 'hour',
  59. 'min',
  60. 'sec',
  61. ]
  62. }
  63. },
  64. // checkbox 布尔
  65. fooCheckboxBool: {
  66. type: Boolean, // 此项必须为Boolean
  67. editor: {
  68. type: 'checkbox'
  69. }
  70. },
  71. // enum 含选项
  72. fooEnum: {
  73. default: 'value1',
  74. type: String,
  75. editor: {
  76. label: '我是字段名', // 将字段名显示为可读性更强的文本,不提供此项时,显示字段名
  77. desc: '我是帮助文本', // 为字段提供提示信息,帮助理解字段的意义
  78. type: 'enum',
  79. defaultList: { // map结构的选项 key为值,value为显示文本
  80. 'value1': '条件1',
  81. 'value2': '条件2',
  82. 'value3': '条件3',
  83. }
  84. }
  85. },
  86. // 条件属性
  87. ifFoo1: {
  88. type: [Number],
  89. default: 0,
  90. editor: {
  91. work: function () {
  92. return this.fooEnum == 'value1' // 只有当 `fooEnum` 字段取值为 'value1' 时才显示此项
  93. },
  94. label: '条件属性1',
  95. type: 'number',
  96. }
  97. },
  98. ifFoo2: {
  99. type: [Date, String],
  100. default: null,
  101. editor: {
  102. work: function () {
  103. return this.fooEnum == 'value2' // 只有当 `fooEnum` 字段取值为 'value2' 时才显示此项
  104. },
  105. label: '条件属性2',
  106. type: 'date',
  107. }
  108. },
  109. },
  110. mounted: function () {
  111. console.log('hello ' + this.foo)
  112. console.log('hello ' + this.fooImage)
  113. // ...
  114. }
  115. }

添加自定义方法

自定义方法常用于处理回调,响应事件等,添加自定义方法后,用户可在配置面板相应操作选项里选取这个方法,方法在适当时机被调用。

自定义方法能接受传参,在配置面板内输入。

一个典型的自定义方法如下,可在复制代码在码良中验证。

  1. return {
  2. editorMethods: { // 此项配置自定义方法的在组件配置面板如何展示
  3. projectJump: { // 方法名,对应于 `methods` 内的某方法
  4. label: '内部跳转', // 自定义方法显示名
  5. params: [ // 参数列表,对象数组
  6. {
  7. label: '跳转地址', // 参数1的名称
  8. desc: '项目相对地址', // 参数1的描述
  9. type: 'string', // 参数1的类型,支持`string|number|boolean|array|object`
  10. default: '' // 参数1默认值
  11. },
  12. {
  13. label: '参数',
  14. desc: 'query形式参数',
  15. type: 'object',
  16. default: {}
  17. }
  18. ]
  19. }
  20. },
  21. methods:{
  22. projectJump:function(path,query){
  23. this.$router.push({
  24. path:path,
  25. query:query
  26. })
  27. }
  28. }
  29. }
  30. return node

组件实例的通用方法和属性

我们在每个组件实例上提供了一些通用方法和属性,使得脚本对可以组件实现更高效、更精确、更全面的控制。

vm.$options.$lib

每个组件实例上添加了 $lib 服务,提供了一些工具方法。

  1. return {
  2. mounted () {
  3. var lib = this.$options.$lib
  4. console.log(lib)
  5. }
  6. }

脚本开发 - 图1

  • ESlog 提供了 log 上报能力。ESlog.pageview 记录页面访问(注意,无需主动调用,每个页面都会默认开启了页面访问日志上报);ESlog.track 自定义事件的日志上报。 详细api可查看代码
  • Server 提供了异步请求能力。Server.fetch 使用方法同原生 fetch
  • Util 主要包含 Util.loadJs 异步加载js的能力。

DataHub 数据总线

  1. return {
  2. mounted: {
  3. // datahub
  4. // 任意路径 任意值 读写空值不会报错
  5. // 全局可访问 注意避免无意覆盖
  6. this.dataHubSet('a.b', 123)
  7. this.dataHubSet('a.c.d', {k: 15454})
  8. this.dataHubGet('a') // {b: 123}
  9. this.dataHubGet('a.b') // 123
  10. this.dataHubGet('a.c.d') // {k: 15454}
  11. this.dataHubGet('a.c.d.k') // 15454
  12. }
  13. }

模板字符串编译

我们提供了通过模板字符串快速访问数据的能力。

对于用户的输入(通过某属性),当检测到形如 ${a.b.c} 或者 ${$scope.x}的片段,我们会对其进行编译替换。

形如 ${a.b.c} 从DataHub取值;形如${$scope.x}从上级组件传入该组件的数据中取值,如列表容器传给列表项的数据

模板字符串甚至还支持过滤器,如 ${a.b.c | datatime}。码良默认提供了一些过滤器,见过滤器。也可通过脚本编写自定义过滤器。

编译过程内部调用的方法为 vm.scopeGet

  1. return {
  2. props: {
  3. foo: {
  4. type: String
  5. }
  6. },
  7. mounted: function {
  8. // 传入 foo 为 '我是示例1 ${a.b.c}',同时dataHub a.b.c为 123
  9. this.scopeGet('foo') // '我是示例1 123'
  10. // 传入 foo 为 '我是列表项 ${$scope.x}',列表项数据 为 {x: 456}
  11. this.scopeGet('foo') // '我是列表项 456'
  12. // 也可复合 但是不能嵌套,this.foo 为 '我是复合 ${a.b.c} ${$scope.x}'
  13. this.scopeGet('foo') // '我是复合 123 456'
  14. }
  15. }

获取其他组件 getComponent

注意,限于目前的组件树组织方式,每个组件外层实际还存在一层容器组件,因此获取组件的方法提供者和获取到的组件其实都是这种容器组件。因此暂时我们需要如下这样操作,

  1. return {
  2. mounted: function () {
  3. var anotherComponentId = 'comxxx'
  4. var anotherComponent = this.$parent // getComponent 方法提供者
  5. .getComponent(anotherComponentId)
  6. .$refs[anotherComponentId] // 实际组件实例
  7. }
  8. }

部分官方组件的实例方法和属性

音频

  1. return {
  2. mounted: function () {
  3. // 属性 playing
  4. this.playing
  5. // 方法 play
  6. this.play() // 继续播放
  7. this.play(200) // 时间轴信息
  8. this.play(0) // 从头播放
  9. this.play(0) // 从头播放
  10. // 方法 pause
  11. this.pause() // 暂停播放
  12. // 方法 tooglePlaying
  13. this.tooglePlaying() // 切换播放状态
  14. // 方法 muted
  15. this.muted() // 静音
  16. // 方法 volume
  17. this.volume(0.5) // 设置音量 ios无效
  18. }
  19. }

列表容器

  1. return {
  2. mounted: function () {
  3. // 计算属性 列表
  4. this.clist
  5. // 方法 setList
  6. this.setList([{a: 1}, {a: 2}]) // 设置数据
  7. }
  8. }