Closed yenshih closed 5 years ago
分工上我负责 on 语法解析升级和 MIP 大对象的方法实现,@yensih 负责 mip-bind 升级
on 目前事件的绑定和触发机制基本 OK,主要问题在于 on 表达式解析比较弱,比如 event.xxx 的传参,MIP.setData() 等方法对表达式的支持不好,所以 on 这块的升级重点主要是写个解析器,覆盖原有功能的同时,增加对 event 参数、算数表达式的解析,改成 String -> AST -> Function。如果可能的 话,最好能够实现解析规则的扩展,后续可以考虑 mip-script 直接在这个规则基础上进行扩充,减小 mip-script 体积。
预计 on 语法即将支持的功能包括:
需要考虑对现有逻辑的兼容问题。目前 on 表达式在解析出方法调用时,会把括号中的内容(包括参数、逗号)的一整个文本作为唯一参数传入方法中由接收的方法进行解析,目前有限支持的 event 表达式直接将结果序列化成文本传入方法。所以需要考虑升级之后方法的参数设置问题。
我的想法是,第一参数保持字符串不变,方法的第二参数接收 AST 或者是直接计算好的结果。
已上线
要解决什么问题
MIP 的 on 和 bind 语法与 AMP 有很大差距,急需跟上。
需要同步的功能:
eventName:targetId[.methodName[(arg1=value, arg2=value)]]
foo='bar'
foo=true
foo=1
我们完全不支持这个功能,目前是直接传递字符串,由事件目标元素自行解析 是否要使用更贴近 JS 的调用方式?如.method({ foo: 'bar' })
event
对象,如foo=event.data
,
隔开,多事件使用;
隔开 目前我们都使用空格,可读性较差show
hide
toggleVisibility
实现上是处理元素的hidden
属性,这个属性带有display: none !important;
的样式,toggleVisibility
的名字有些误导人scrollTo(position: `top` | `bottom` | `center`, duration: number)
focus
toggleClass
input-debounce
input-throttle
AMP.navigateTo(url: string, target: '_blank' | '_top', opener: boolean)
实现存疑,已经有viewer.open()
了,也需要考虑<mip-shell>
的场景url
还支持 AMP 的一系列宏定义 https://github.com/ampproject/amphtml/blob/master/spec/amp-var-substitutions.mdAMP.closeOrNavigateTo(url: string, target: '_blank' | '_top', opener: boolean)
AMP 实现这个功能是为了多页的 “后退” 场景,似乎也跟<mip-shell>
冲突AMP.goBack()
<mip-history>
有类似功能,可以修改其实现集成进来,或废弃<mip-history>
AMP.scrollTo(id: string, position: `top` | `bottom` | `center`, duration: number)
ease-scroll.js
中有 MIP 的scrollTo()
实现,可以直接调用AMP.setState()
与MIP.setData()
类似,但支持引用event
对象,我们可能需要一个MIP.setState()
的别名AMP.pushState()
与AMP.setState()
类似,但会把 state 额外 push 到 history 的栈中,如果 history 有回退,则<amp-state>
中的状态也会回退 一个on
中只能有一个setState
或pushState
,并且这两个在其他事件前优先触发<amp-state>
<amp-state>
上的id
作为命名空间来引用数据 目前我们是合并所有<mip-data>
的数据,都用m
来引用,明显不如 AMP 的实现 有了命名空间后,甚至可以实现组件局部数据管理,如this.state
和this.setState()
src
属性远程获取数据refresh
事件,重置<amp-state>
的数据null
后可以移除该属性AMP.printState()
amp-bind
[attr]=
单向数据绑定,还支持特殊的[text]
[class]
[hidden]
[width]
[height]
jison
从 BNF 文法生成的,具体功能可以看 https://amp.dev/documentation/components/amp-bind?format=websites#expressions<amp-bind-macro>
实现表达式宏,可以复用绑定的表达式描述一下你理想中的解决方案
描述你的备选方案
补充信息