Open eric-burel opened 4 years ago
And sth like
export const SmartForm = customizeSmartForm({components: {FormHeader: MyOwnFormHeader}})
in your own packages?
We can reuse the components prop to override those used for the smartForm like a HOC
customizeSmartForm = (props) => { return (props2) => <SmartForm {...props} {...props2}> }
That's a way indeed, you would define your component as a closure:
const SmartForm = components => (props) => {...}
so you can pass different type of components
Currently the Datatable accepts something similar but with components
as a prop, so technically we could already be able to implement something like that.
Cross post of https://github.com/VulcanJS/Vulcan/issues/2549
Dream goal
Goal is to replace the dynamic Component replacing pattern by explicit exports that would "magically" replace components.
Imagine a component structured like this:
You may want to replace the Header, and the Content with your own components:
Then you consume them like this, business as usual:
It's probably undoable with Meteor, but it could prove doable with Webpack. The tricky part is that you want to override only certain component, that are themselves nested into other replaceable component. You get a kind of recursive/circular import issue.
What's doable today
This pattern is already implementable with one level of imports like this:
but it's not enough to handle more deeply nested component replacement, for complex components like DataTable or SmartForm that have multiple layers of replaceable component.
Possible implementation
Step 1: detecting "magic" replacement
First step is defining a syntax for magic components.
Possibilities:
Prefixing components, eg
<@Datatable>
: can be detected component by component but it's not very clean"Magic import syntax", eg
import { ComponentToReplace } from "vulcan/magic-component"
/export * from "vulcan/magic-components"
: detect that we want to import "magic components" or override thema special file name for files that exports component override
explicitely declaring dependencies between components eg
export { component: Datatable, dependsOnMagic: ["DatatableContents"] }
Step 2: build
The difficulty is to handle deeply nested replaceable component.
Datatable
is defined with default componentsDatatableFooter
is overridden by userDatatableContents
with overriddenDatatableFooter
exportDatatable
, which depends onDatatableContents
which contains an overridden export.The build would probably look like a recursive structure or a tree, where we rebuild everything until all nested components are replaced by user's overrides.