# 自定义组件web-component化
# 目前主要问题
生命周期执行顺序与微信不一致
微信 | Tiny |
---|---|
component created | page load |
component attached | component created |
page load | component attached |
page show | component ready |
component ready | page show |
page ready | page ready |
根本原因是React生命周期与web-component生命周期的不一致
# 解决方案(猜想阶段)
- 渲染全部web-component化
- 使用lit、polymer等库
# 与此同时需要解决的问题
比较简单
- 事件系统问题
- style、animation属性处理
# 编译层处理事项(猜想)
- 模板引用
import { html } from 'lit';
import b from './b.wxml'
import c from './c.wxml'
// 自己定义的template
export const _ownTemplates = {}
// 自己定义的template + 外部import的template
const _templates = { ..._ownTemplates, ...c._ownTemplates }
const _html = html`
<view>1212</view>
${b}
${_templates.a}
${_templates.c}
`
export default _html;
- template定义
const templateName = ''
customElements.define(templateName, class extends PolymerElement {
static get is() { return templateName }
static get properties() {
return {
data: { type: Object }
}
}
static get template() {
return html`
<view bindtap="eventBinder" event-name="xx" >{{data.abc}}</view>
`
}
eventBinder(e) {
}
});
# 最终方案记录
1、 主要问题
- 生命周期与微信不一致
- 两套渲染机制(page和自定义组件走的mini版react, 内置组件走的web-component)
2、 预期
- 渲染机制保持一致
- 生命周期一致
3、 解决过程
一开始的想法时使用polymer或者lit这样的web-component组件库去实现,模板解析也交它们, 但是捣鼓了一天下来发现模板解析很不动态, 数据绑定也很死板,幸好生命周期是完全对上了。至此得出结论,web-compoent化是正确的,但是模板解析还是得走vdom实现,不然解析太麻烦了,因此上面提到的编译环节的处理就可以不用修改。
就在准备在polymer中使用react时,忽然想起omi这个库的web-component + jsx vdom能力。
魔改一下,成了,当然修改点肯定还是比较多的。
← 关于小程序的探索