0.1.1 • Published 5 years ago

minifront v0.1.1

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

minifront framework

Simplified frontend development with state management, DOM manipulation, and control over data flow.

Usage

import { mount, setState, getState, createData, DATA } from 'minimalist'

State Management

Manage a single state object for the application. All rendering and updates to the application are initiated by changes to this object.

setState({ ...getState(), newfield: 'data' })

Creating data access

createData: (key, map) null

Pushes new data functions onto the minimalist.DATA object. These functions can access the DOM (via document) and state (via getState) to get data for the application to render.

createData('KEY', {
    data: () => document.getElementById('data').innerHTML,
    ...
  })

Access the data:

const calculatedData = DATA.KEY.datafield()

Mounting a component

const component = function (props) {
  return document.createTextNode(props.title)
}

const getStateSlice = function (state) {
  return state.importantPart
}

const props = {
  // note that these are data access functions, NOT values
  title: DATA.INFO.title,
  text: () => 'quality content'
  ...
}

const canRender = function (state) {
  return (state.status === 'visible')
}

mount(component, getStateSlice, props, 'elementId', canRender)

component: props HTMLElement

Renders a new component from the passed property values.

getStateSlice: state stateSubfield

The component function is called when state changes (specifically, when oldState !== newState). This function defines the part that will be examined. Changes to other fields of state will not trigger updates.

const getStateSlice = function (state) {
  return state.importantPart
}

props: { key: dataFunction, ... }

An object that maps property keys to the functions used to access them. Typically accessed via the minimalist.DATA object (see ex. above).

elementId: String

The DOM element ID where you want the component to be mounted. If null, component and props are still evaluated but nothing will be rendered.

canRender: state Boolean

Decides whether the component should be re-rendered. If return value is false, no changes will be made.

Asynchronous data requests

Data functions should be fast and synchronous so that components can be rendered efficiently. But asynchronous work can still be done as follows:

const dataFetch = function () {
  if (getState().dataLoaded) {
    return getState().data
  }

  fetchDataFromYourAPI('http://yourapiaddress').then(response => {
    setState({
      dataLoaded: true,
      data: response
    })
  })

  return null
}

createData('QUERIES', {
  content: dataFetch
})

The data function initiates async work as needed. When the work is complete, a state change triggers another rendering.

The component can display a loading message until data is available:

const component = function (props) {
  if (!props.content) {
    return renderLoadingMessage(props)
  }

  return renderYourComponent(props)
}

mount(component, ..., { content: DATA.QUERIES.content }, ...)

License

MIT