You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
/** * When a property is changed, this callback function is called. */publicpropertyChangedCallback(name: string,oldValue: unknown,newValue: unknown){if(!this.hasConnected){return;}if(oldValue===newValue){return;}this.properties[name]=newValue;this.mountReactApp();}
假设有这样一个web component组件。
完整构建步骤
一个完整的direflow web component组件,包含以下步骤。
direflow的配置如下:
创建一个Web component
通过customElements.define声明一个web component,tagName为"test-component",WebComponent为集成了渲染react组件能力的的web components工厂函数实例。
web components工厂函数
响应式
劫持所有属性。
首先,将attributes转化为properties。
其次,通过Object.defineProperties劫持properties,在setter中,触发propertyChangedCallback函数。
上面这段代码中的property变化时,重新挂载React组件。(这里一般是为了开发环境下,获取最新的视图)
attribute变化时,重新挂载组件,此时触发的是web components原生的attributeChangedCallback。
创建一个React组件
对应上面的this.mountReactApp。
EventProvider-创建了一个Event Context包裹组件,用于web components组件与外部通信。
factory.rootComponent-将DireflowComponent.create的component传入,作为根组件,并且通过React.createElement去创建。
this.reactProps()-获得序列化后的属性。为什么要序列化,因为html标签的attribute,只接收string类型。因此需要通过JSON.stringify()序列化传值,工厂函数内部会做JSON.parse。将attribute转化为property
anonymousSlot-匿名slot,插槽。可以直接将内容分发在web component标签内部。
挂载React应用到web component
代理组件将React组件作为children,ReactDOM渲染这个代理组件。
web component挂载到DOM时,挂载React App
创建一个代理组件
主要是将Web Component化后的React组件,挂载到web component的shadowRoot。
获取到shadowRoot,没有的话attachShadow新建一个shadow root。
将子结点添加到shadow root。
返回一个挂载组件到shadow root的Portal,接收children的高阶函数。
思考
为什么要每一次attribute变化都要重新挂载React App?不能把它看做一个常规的react组件吗,使用react自身的刷新能力?
因为direflow的最终产物,是一个web component组件。
attribute变化,react是无法自动感知到这个变化的,因此需要通过监听attribute变化去重新挂载React App。
但是!React组件内部,是完全可以拥有响应式能力的
direflow是一个什么框架?
其实,direflow本质上,是一个 React组件 + web component +web component属性变化重新挂载React组件的 web component框架。
所以,direflow的响应式其实分为2块:
组件内部响应式(通过React自身响应式流程),组件外部响应式(WebComponents属性变化监听重渲染组件)。
如果外部属性不会经常变化的话,性能这块没有问题,因为组件内部的响应式完全是走了React自身的响应式。
属性外部属性如果会经常变化的话,direflow框架在这块还有一定的优化空间。
The text was updated successfully, but these errors were encountered: