Coder Social home page Coder Social logo

relite's Introduction

relite

a redux-like library for managing state with simpler api (1kb)

Why

redux is awesome, but is not enough simple for small and middle application.

With relite, we don't need to combine | apply | bind anything, just write pure function and call actions, it done.

What's new(3.0.0)

  • Supoort Typescript.

  • Delete the support of return type Promise | Function of Action.

Installtion

npm install --save relite

How to use

write pure function

the action of relite looks like a reducer of redux, but more simple and powerful.

/**
* an action consist of action-type, action-payload, action-handler and action-result
* at this example
* action-type is EXEC_BY
* action-handler is the function accepts two arguments: state and action-payload
* action-result is the result of function
*/
export let EXEC_BY = (state, input) => {
	let value = parseFloat(input, 10)
	return isNaN(value) ? state : {
		...state,
		count: state.count + value
	}
}

create store by actions and initialState

import { createStore } from 'relite'
import * as actions from './actions'

let initialState = {
	count: 0,
}
let store = createStore(actions, intialState)

/*
* relite will bind state for every actions you gave to `createStore`
* so all the functions in store.actions can only accept one argument, action-payload
* no need to bindActionCreators
* each actions return currentState or promise with currentState
*/
let { INCREMENT, EXEC_BY } = store.actions
INCREMENT() // -> { count: 1 }
EXEC_ASYNC(9) // -> Promise[[{ count: 10 }]]

/**
* subscribe store by store.subscribe
* when the state was changed/updateed, relite would trigger the listeners
* if action-handler return the same state, listeners would not be triggered
*/
let unsubscribe = store.subscribe((data) => {
	let {
		actionType, // action-type
		actionPayload, // action-payload
		start, // start date
		end, // end date
		previousState, // prev-state
		currentState // cur-state
	} = data
})

let newState = {
	count: 0,
}
let simulateData = {
	actionType: 'REPLACE_STATE',
	actionPayload: null,
	start: new Date(),
	end: new Date,
	previousState: store.getState(), // get current state
	currentState: newState,
}
let keepSilent = false // if true, it will not trigger listeners

// replace state by store.replaceState
store.replaceState(newState, simulateData, false)

// trigger listener by store.publish
store.publish(simulateData)

store.dispatch('EXEC_ASYNC', 10) // dispatch the action manually

use build-in logger

import { createStore } from 'relite'
import * as actions from './actions'

let initialState = {
	count: 0,
}
let store = createStore(actions, intialState)

store.subscribe(render)

render()

function render() {
	ReactDOM.render(
		<App {...store.getState()} {...store.actions} />,
		document.getElementById('container')
	)
}

End

Issue and pull request is welcome!

relite's People

Contributors

lucifier129 avatar tqma113 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

relite's Issues

请问图片怎么引入呢

试过

import logo from './logo.svg';
<img src={logo} className="App-logo" alt="logo" />
 <img src="/home/logo.svg" className="App-logo" alt="logo" />
 preload = {
        app: "/home/css/app.css",
        logo:"/home/logo.svg"
    };
<img src="logo" className="App-logo" alt="logo" />

如何与react组件结合?

我当前的项目主要的时react + react-router。
现在用relite重构,我想到的最简单的方案就是在路由对应的组件上动手脚

    componentDidMount() {
        this.unsubscribe = store.subscribe(() => this.forceUpdate()) 
    }
    
    componentWillUnmount() {
        this.unsubscribe && this.unsubscribe()
    }

当然也可以写个hoc统一处理, 但用forceUpdate感觉比较暴力。。。

还有其他比较好的方案吗?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.