3.0.1 • Published 5 years ago

mainstay v3.0.1

Weekly downloads
38
License
MIT
Repository
github
Last release
5 years ago

Mainstay

The definition of Mainstay: a person or thing that acts as a chief support or part ( dictonary.com ). This module is meant to be the middle piece that links a component that is in a javascript library and your authored components.

Install Mainstay

npm install mainstay

Your components need to have three data attributes on the html tag

  • data-component="MyComponentClass"
  • data-instance="unique-string"
  • data-hook="unique-string"

Your javascript components need to be passed to mainstay in an array of objects. The objects need to have two keys:

  • name: a string that matches the data-component attribute
  • component: your javascript class or function to be initialized

Basic Usage

import Mainstay from 'mainstay';

const MyComponentClass = {
    'name' : 'MyComponentClass',
    'component' : (...) => { ... }
}

const MyNewComponentClass = {
    'name' : 'MyNewComponentClass',
    'component' : (...) => { ... }
}


let libComponentsList = [
    MyComponentClass,
    MyNewComponentClass
]

let mainstay = new Mainstay( {
    // Array of component class definitions
    libraryComponents : libComponentsList
} )


mainstay.render()

Options Definition

Object PropertyRequiredDefault ValueDescription
libraryComponentsyes[]Every value in this array should be a javascript class definition
rootElementKeyno'hook'rootElementKey is the data attribute that mainstay will use to find the element in the DOM. The default selector is [data-${rootElementKey}="${data[rootElementKey]}"] which could look like this document.querySelectorAll([data-hook="123"]). This is not required if you are using the data-stoar with data-attributes instead of script tags. If you are using data-attributes the data-stoar will return the element it found the data-component on.
renderKeynorenderKey is the data attribute that mainstay will use to decide if the component should be rendered by the custom render function. Add this data attribute to your component to take control of the render pipeline
renderFunctionnorenderFunction if present is a custom function to take control of the render in your code.
unmountnonullthis function is required if you are using the renderFunction. This will be called on rerender to unmount the currently rendered component before the rerender.

How are props passed to my react component?

Each attribute that is gathered by the data-stoar will be passed as individual props on your react component.

What gets passed to my javascript class constructor?

There are 2 arguments passed to your class constructor. The first is and object of the data found by the data-stoar. The second is the DOM element that was found either by finding the element with the rootElementKey or the element passed by the data-stoar.

Re-Render all page components

import Mainstay from 'mainstay';

const MyComponentClass = {
    'name' : 'MyComponentClass',
    'component' : (...) => { ... }
}

const MyNewComponentClass = {
    'name' : 'MyNewComponentClass',
    'component' : (...) => { ... }
}

let libComponentsList = [
    MyComponentClass,
    MyNewComponentClass
]

let mainstay = new Mainstay( {
    // renderKey if present on the DOM element found by data-stoar mainstay will call the custom render function
    renderKey  : 'react',
    renderFunction : ( data, el, Component ) => { ReactDom.render( el, <Component {...data}/> ) },
    unmount : ( el ) => { ReactDom.unmount(el) },
    // Array of component class definitions
    libraryComponents : libComponentsList
} )

mainstay.render()

/// Later in your code
mainstay.rerender()

Re-Render one component

import Mainstay from 'mainstay';

const MyComponentClass = {
    'name' : 'MyComponentClass',
    'component' : (...) => { ... }
}

const MyNewComponentClass = {
    'name' : 'MyNewComponentClass',
    'component' : (...) => { ... }
}

let libComponentsList = [
    MyComponentClass,
    MyNewComponentClass
]

let mainstay = new Mainstay( {
    // renderKey if present on the DOM element found by data-stoar mainstay will call the custom render function
    renderKey  : 'react',
    renderFunction : ( data, el, Component ) => { ReactDom.render( el, <Component {...data}/> ) },
    unmount : ( el ) => { ReactDom.unmount(el) },
    // Array of component class definitions
    libraryComponents : libComponentsList
} )

mainstay.render()

/// Later in your code
mainstay.reRenderComponent( '${componentId}' )

Change Log

v3.0.1 -- Updated the library components object

  • I changed the library components to needing 'name' and 'component' keys so mainstay no longer relies on function names.

v3.0.0 -- Breaking Changes

  • I changed the render mechanism to be more agnostic. This means in practice it dose not depend on anything other than data-stoar. In order to work with react now you will need to add your own render function.

v2.2.0 -- Feature Re-Render Component

  • Added the ability to re-render a specified component

v2.1.0 -- Feature Re-Render

  • Added the ability to re-render all rendered components

v2.0.1 -- Bug Fixes

  • fixed a bug where mainstay incorrectly named a component wrapped in a react-redux connect higher order function

v2.0.0 -- Breaking Changes

  • BREAKING CHANGES to the api. Mainstay now exports as its default a class definition which needs to be instantiated with at least one argument libraryComponents. You also will need to call render once mainstay is instantiated.

Pre v3 Usage

import Mainstay from 'mainstay';
import {
    MyComponentClass,
    MyNewComponentClass } from './components';


let libComponentsList = [
    MyComponentClass,
    MyNewComponentClass
]

let mainstay = new Mainstay( {
    // reactComponentKey if present on the DOM element found by data-stoar mainstay will render a react component
    reactComponentKey : 'react',
    // rootElementKey this is the data attribute that mainstay will use for the react-dom root element. The default is data-hook.
    rootElementKey    : 'hook',
    // Array of component class definitions
    libraryComponents : libComponentsList
} )


mainstay.render()

Options Definition

Object PropertyRequiredDefault ValueDescription
reactComponentKeyno'react'reactComponentKey if present on the DOM element found by data-stoar mainstay will render a react component
rootElementKeyno'hook'rootElementKey this is the data attribute that mainstay will use to find the element in the DOM. The default selector is [data-${rootElementKey}="${data[rootElementKey]}"] which could look like this document.querySelectorAll([data-hook="123"]). This is not required if you are using the data-stoar with data-attributes instead of script tags. If you are using data-attributes the data-stoar will return the element it found the data-component on.
libraryComponentsyes[]Every value in this array should be a javascript class definition
reduxStorenonullreduxStore should be an instantiated redux store. If this value is passed mainstay will wrap all react components in the redux Provider component. For non react components mainstay will pass the store as the final argument when calling the class constructor.

How are props passed to my react component?

Each attribute that is gathered by the data-stoar will be passed as individual props on your react component.

What gets passed to my javascript class constructor?

There are 2 or 3 arguments passed to your class constructor. The first is and object of the data found by the data-stoar. The second is the DOM element that was found either by finding the element with the rootElementKey or the element passed by the data-stoar. The third argument passed to the constructor is the redux store. This is only passed if a redux store is passed into the options object with instantiating mainstay.

Re-Render all page components

import Mainstay from 'mainstay';

let mainstay = new Mainstay( {
    // reactComponentKey if present on the DOM element found by data-stoar mainstay will render a react component
    reactComponentKey : 'react',
    // rootElementKey this is the data attribute that mainstay will use for the react-dom root element. The default is data-hook.
    rootElementKey    : 'hook',
    // Array of component class definitions
    libraryComponents : libComponentsList
} )

/// Later in your code

mainstay.rerender()

Re-Render one component

import Mainstay from 'mainstay';

let mainstay = new Mainstay( {
    // reactComponentKey if present on the DOM element found by data-stoar mainstay will render a react component
    reactComponentKey : 'react',
    // rootElementKey this is the data attribute that mainstay will use for the react-dom root element. The default is data-hook.
    rootElementKey    : 'hook',
    // Array of component class definitions
    libraryComponents : libComponentsList
} )

/// Later in your code

mainstay.reRenderComponent( '${componentId}' )

Pre v2 Usage

BELOW IS ONLY FOR VERSION 1.X

var mainstay  = require('mainstay');
var DataStoar = require('data-stoar');

// Componets found by the data store
var pageComponents          = new DataStoar();
// Object of components that are included in client library
var clientlibraryComponents = { 'component-name' : require('component-name') };

mainstay( pageComponents , clientlibraryComponents );

Pre v2 Usage with Redux

BELOW IS ONLY FOR VERSION 1.X

var mainstay  = require('mainstay');
var DataStoar = require('data-stoar');

// Componets found by the data store
var pageComponents          = new DataStoar();
// Object of components that are included in client library
var clientlibraryComponents = { 'component-name' : require('component-name') };

var reduxStore = /* redux init function */

mainstay( pageComponents , clientlibraryComponents, reduxStore, true );
3.0.1

5 years ago

3.0.0

5 years ago

2.2.0

6 years ago

2.1.1

6 years ago

2.1.0

6 years ago

2.0.1

6 years ago

2.0.0

6 years ago

1.2.0

7 years ago

1.0.5

7 years ago

1.0.4

7 years ago

1.0.3

8 years ago

1.0.2

8 years ago

1.0.1

8 years ago

1.0.0

8 years ago

0.1.6

9 years ago

0.1.5

9 years ago

0.1.4

9 years ago

0.1.3

9 years ago

0.1.2

9 years ago

0.1.1

9 years ago

0.1.0

9 years ago