0.5.11 • Published 9 years ago

luxi v0.5.11

Weekly downloads
65
License
MIT
Repository
github
Last release
9 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

9 years ago

0.7.3

9 years ago

0.7.2

9 years ago

0.7.1

9 years ago

0.7.0

9 years ago

0.6.15

9 years ago

0.6.14

9 years ago

0.6.13

9 years ago

0.6.12

9 years ago

0.6.11

9 years ago

0.6.10

9 years ago

0.6.9

9 years ago

0.6.8

9 years ago

0.6.7

9 years ago

0.6.6

9 years ago

0.6.5

9 years ago

0.6.4

9 years ago

0.6.3

9 years ago

0.6.2

9 years ago

0.6.1

9 years ago

0.6.0

9 years ago

0.5.11

9 years ago

0.5.10

9 years ago

0.5.9

9 years ago

0.5.8

9 years ago

0.5.7

9 years ago

0.5.6

9 years ago

0.5.5

9 years ago

0.5.4

9 years ago

0.5.3

9 years ago

0.5.2

9 years ago

0.5.1

9 years ago

0.5.0

9 years ago

0.4.6

9 years ago

0.3.8

9 years ago

0.3.7

9 years ago

0.4.5

9 years ago

0.4.4

9 years ago

0.4.3

9 years ago

0.4.2

9 years ago

0.4.1

9 years ago

0.4.0

9 years ago

0.3.6

9 years ago

0.3.5

9 years ago

0.3.4

9 years ago

0.3.3

9 years ago

0.3.2

9 years ago

0.3.1

9 years ago

0.3.0

9 years ago

0.2.12

9 years ago

0.2.11

9 years ago

0.2.10

9 years ago

0.2.9

9 years ago

0.2.8

9 years ago

0.2.7

9 years ago

0.2.6

9 years ago

0.2.5

9 years ago

0.2.4

9 years ago

0.2.3

9 years ago

0.2.2

9 years ago

0.2.1

9 years ago

0.2.0

9 years ago

0.0.9

10 years ago

0.0.8

10 years ago

0.0.7

10 years ago

0.0.6

10 years ago

0.0.5

10 years ago

0.0.4

10 years ago

0.0.3

10 years ago

0.0.2

10 years ago