Easily mount react components from your HTML with simple prop support e.g.
<div data-mount="SomeComponent" data-some-title="Hello World" data-settings='{"enabled": true}'></div>
npm i @maelstrom-cms/react-mount
First register all of your components e.g.
import Mount from '@maelstrom-cms/react-mount';
import SomeComponent from './src/SomeComponent.js'
Mount({
SomeComponent,
})
// same as
Mount({
'SomeComponent': SomeComponent,
})
Use the data-mount
attribute to define which react component to mount on this element.
<div data-mount="SomeComponent" data-some-title="Hello World" data-settings='{"enabled": true}'></div>
If you want to lazy load components, you can do so by using the import()
function
Mount({
StaticComponent,
LazyComponent: () => import('./components/LazyComponent'),
})
Currently we only support webpacks import method, if you need to dynamically mount components, consider using
Mount()
directly in your lazy loaded files.
By default, any data-
attribute will be passed to your component as a prop, allowing you to accept data from server-side systems.
You can apply some additional parsing to these, for example objects e.g.
import parseProps from '@maelstrom-cms/react-mount/dist/parseProps';
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.settings = parseProps(props, 'settings');
// this.settings will now be a JSON object.
}
}
Whilst the page is loading you might see a flash of un-styled content, you can get around this 2 ways.
<div data-mount="MyComponent">
<svg class="spinner" ...></svg>
Loading.....
</div>
or you can choose to hide the component completely e.g.
<div class="cloak" data-mount="MyComponent"></div>
Add the CSS snippet
.cloak { display: none; }
If you want to use an alternative class name (make sure it's unique e.g. do not use "hidden") you can use the setCloakClass
e.g.
import { setCloakClass } from '@maelstrom-cms/react-mount/src/mount';
setCloakClass('my-cloak-class');
Mount({
AnotherComponent
});
Make sure you set the cloak class BEFORE mounting the components.