Extension builder
Working with multiple component extensions can be made easier by using the ExtensionBuilder
class.
// import it with all other features
import { createCustomElement, ExtensionBuilder } from 'https://cdn.skypack.dev/ficusjs@6'
// Alternatively, import the ExtensionBuilder function
// import { ExtensionBuilder } from 'https://cdn.skypack.dev/ficusjs@6/extension-builder'
// import the renderer and html tagged template literal from the uhtml renderer
import { html, renderer } from 'https://cdn.skypack.dev/@ficusjs/renderers@5/uhtml'
import { store } from './store.mjs'
import { i18n } from './i18n.mjs'
createCustomElement(
'example-button',
ExtensionBuilder
.newInstance()
.withStore(store)
.withI18n(i18n)
.create({
clear () {
this.store.clear()
},
render () {
return html`<button type="button" onclick=${this.clear}>${this.i18n.t('buttons.clear')}</button>`
}
})
)
The ExtensionBuilder
class uses the builder pattern to make it easier to use more than one component extension.
Methods
The methods of the ExtensionBuilder
can be chained.
newInstance()
Create a new instance of the ExtensionBuilder
class.
const builder = ExtensionBuilder.newInstance()
withBreakpointRender(breakpointConfig)
Use the withBreakpointRender
extension function.
const breakpointConfig = {
reactive: false,
breakpoints: {
992: { method: 'renderTablet' },
768: { method: 'renderMobile' },
1200: { method: 'renderDesktop' }
}
}
const builder = ExtensionBuilder
.newInstance()
.withBreakpointRender(breakpointConfig)
withEventBus(eventBus)
Use the withEventBus
extension function.
import { eventBus } from './event-bus.mjs'
const builder = ExtensionBuilder
.newInstance()
.withEventBus(eventBus)
withI18n(i18n)
Use the withI18n
extension function.
import { i18n } from './i18n.mjs'
const builder = ExtensionBuilder
.newInstance()
.withI18n(i18n)
withI18nReactive(i18n)
Use the withI18nReactive
extension function.
import { i18n } from './i18n.mjs'
const builder = ExtensionBuilder
.newInstance()
.withI18nReactive(i18n)
withLazyRender()
Use the withLazyRender
extension function.
const builder = ExtensionBuilder
.newInstance()
.withLazyRender()
withStyles()
Use the withStyles
extension function.
const builder = ExtensionBuilder
.newInstance()
.withStyles()
withLocalState()
Use the withLocalState
extension function.
const builder = ExtensionBuilder
.newInstance()
.withLocalState()
withStore(store)
Use the withStore
extension function.
import { store } from './store.mjs'
const builder = ExtensionBuilder
.newInstance()
.withStore(store)
withWorkerStore(worker)
Use the withWorkerStore
extension function.
import { worker } from './worker-store.mjs'
const builder = ExtensionBuilder
.newInstance()
.withWorkerStore(worker)
withXStateService(service)
Use the withXStateService
extension function.
import { getXStateService } from 'https://cdn.skypack.dev/ficusjs@6/xstate-service'
const service = getXStateService('toggle.service')
const builder = ExtensionBuilder
.newInstance()
.withXStateService(service)
create(options)
Create component options with added extensions. This method wraps all extensions with supplied component options.
createCustomElement(
'example-button',
ExtensionBuilder
.newInstance()
.withStore(store)
.withI18n(i18n)
.create({
clear () {
this.store.clear()
},
render () {
return html`<button type="button" onclick=${this.clear}>${this.i18n.t('buttons.clear')}</button>`
}
})
)