Skip to content

Easily mount react components from your HTML with prop support

License

Notifications You must be signed in to change notification settings

maelstrom-cms/react-mount

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

react-mount

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>

Table of Contents

Install

npm i @maelstrom-cms/react-mount

Usage

Mounting Components

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>

Dynamically importing components

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.

Passing and Parsing Props

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.
    }
}

Cloaking and Loading

Whilst the page is loading you might see a flash of un-styled content, you can get around this 2 ways.

Provide some default HTML within the document e.g.

<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.

License

MIT © Maelstrom CMS

About

Easily mount react components from your HTML with prop support

Resources

License

Stars

Watchers

Forks

Packages

No packages published