0.5.11 • Published 7 years ago

luxi v0.5.11

Weekly downloads
65
License
MIT
Repository
github
Last release
7 years ago

Luxi

Luxi is JS framework based on Flux architecture. Simple, elegant, and convenient with Types.

Example

/**
 * Action
 */
import {Action, ActionTypeFactory, dispatch} from 'luxi';

const actionTypeFactory = new ActionTypeFactory('User');

const UserActionType = {
  UpdateName: actionTypeFactory.create<string>('UpdateName'),
  RestoreName: actionTypeFactory.create<Promise<string>>('RestoreName'),
};

class UserAction {
  @dispatch
  updateName(nextName: string): Action<UserActionType.UpdateName> {
    return { type: UserActionType.UpdateName, payload: nextName };
  }

  @dispatch
  restoreName(): Action<UserActionType.RestoreName> {
    const restorePromise = this._restoreUserName();
    return { type: UserActionType.RestoreName, payload: restorePromise };
  }

  _restoreUserName(): Promise<string> {
    return Cache.get('user.name');
  }
}

/**
 * Reducer
 */
import {Reducer, reduce} from 'luxi';

interface UserState {
  name: string;
}

class UserStateReducer extends Reducer<UserState> {
  state = { name: '(No name)' };

  @reduce.on(UserActionType.UpdateName)
  @reduce.onResolve(UserActionType.RestoreName)
  updateName(nextName: string): UserState {
    return { name: nextName };
  }
}

/**
 * Store
 */
import {Store} from 'luxi';

interface DataStoreState {
  user: UserState;
}

const userReducer = new UserReducer;

const DataStore = Store.fromReducers<DataStoreState>((delegateTo) => ({
  user: delegateTo(userReducer),
}));

/**
 * Use with React
 */
import {connect} from 'luxi/react';

@connect(DataStore, (store) => ({store}))
class Application extends React.Component<{ store: DataStoreState }> {
  userAction = new UserAction;

  componentWillMount() {
    this.userAction.restoreName();
  }

  handleChange = (e: any) => {
    this.userAction.updateName(e.target.value);
  };

  render() {
    const {store} = this.props;
    return (
      <div>
        Hi!
        <br />
        Your name is <input value={store.user.name} onChange={this.handleChange} />.
      </div>
    );
  }
}
0.7.4

7 years ago

0.7.3

7 years ago

0.7.2

7 years ago

0.7.1

7 years ago

0.7.0

7 years ago

0.6.15

7 years ago

0.6.14

7 years ago

0.6.13

7 years ago

0.6.12

7 years ago

0.6.11

7 years ago

0.6.10

7 years ago

0.6.9

7 years ago

0.6.8

7 years ago

0.6.7

7 years ago

0.6.6

7 years ago

0.6.5

7 years ago

0.6.4

7 years ago

0.6.3

7 years ago

0.6.2

7 years ago

0.6.1

7 years ago

0.6.0

7 years ago

0.5.11

7 years ago

0.5.10

7 years ago

0.5.9

7 years ago

0.5.8

7 years ago

0.5.7

7 years ago

0.5.6

7 years ago

0.5.5

7 years ago

0.5.4

7 years ago

0.5.3

7 years ago

0.5.2

7 years ago

0.5.1

7 years ago

0.5.0

7 years ago

0.4.6

7 years ago

0.3.8

7 years ago

0.3.7

7 years ago

0.4.5

7 years ago

0.4.4

7 years ago

0.4.3

7 years ago

0.4.2

7 years ago

0.4.1

7 years ago

0.4.0

7 years ago

0.3.6

8 years ago

0.3.5

8 years ago

0.3.4

8 years ago

0.3.3

8 years ago

0.3.2

8 years ago

0.3.1

8 years ago

0.3.0

8 years ago

0.2.12

8 years ago

0.2.11

8 years ago

0.2.10

8 years ago

0.2.9

8 years ago

0.2.8

8 years ago

0.2.7

8 years ago

0.2.6

8 years ago

0.2.5

8 years ago

0.2.4

8 years ago

0.2.3

8 years ago

0.2.2

8 years ago

0.2.1

8 years ago

0.2.0

8 years ago

0.0.9

8 years ago

0.0.8

8 years ago

0.0.7

8 years ago

0.0.6

8 years ago

0.0.5

8 years ago

0.0.4

8 years ago

0.0.3

8 years ago

0.0.2

8 years ago