resa

NPM version Build Status Coverage Status

View README in English

基于typescript, redux, redux-saga, redux-action的前端框架。

安装

npm install resa --save
yarn add resa

特性

  • 没有多余的redux样板代码
  • 完全的智能提示 (by vscode、 typescript)
  • 类型标注的redux store
  • 类型安全的action creater和payload
  • 使用redux-saga更好的控制副作用
  • Action creater返回promise
  • 更好的错误处理, 支持使用promise.catch
  • 自动追踪state依赖,无需编写mapStateToProps函数,比react-redux的connect函数更容易使用
  • 容易学习,容易编码,容易测试

为什么造轮子

我非常喜欢redux和redux-saga,但是它们在使用过程当中有许多问题, 现有的框架dva, mirror也没有彻底解决他们:

  • 在大项目中到处都是样板代码
  • 没有智能提示
  • 没有类型检查
  • 在redux-saga中错误处理不友好

Examples

我们在online-vscode中集成了redux-devtools, 你可以点击 Open in New Window 按钮然后打开chrome redux-devtools来查看当你点击按钮时会派发什么action.

第一眼

定义模型

// AppModel.ts
import { Model, reducer, init, effect } from 'resa';
import { delay } from 'redux-saga';

interface AppState {
    count: number;
}

@init<AppState>({
    name: 'appModel',
    namespace: 'namespace',
    state: {
        count: 0 // 类型检查
    }
})
export default class AppModel extends Model<AppState> {
    @effect() // 定义saga: 异步的action处理函数
    * addAsync(count: number) {
        yield delay(2000);
        this.add(count); // 类型检查
    }

    @reducer() // 定义reducer: 同步的action处理函数
    add(count: number) {
        return {
            count: this.state.count + count, // 类型检查
        };
    }
}

定义组件

// App.tsx
import * as React from 'react';
import AppModel from './AppModel';
import { subscribe, wapper } from 'resa';

interface AppProps {
    appModel: AppModel; // 类型检查, subscribe函数会注入
}

class App extends React.Component<AppProps> {
    render() {
        return (
            <div className="App">
                <h1>{this.props.appModel.state.count}</h1>
                {/* add和addAsync已经被转换成了action creaters
                    直接调用它就会派发action, 参数相当于有类型检查的payload
                */}
                <button onClick={() => this.props.appModel.add(1)}>+</button> {/* 类型检查 */}
                <button onClick={() => this.props.appModel.addAsync(2)}>async</button> {/* 类型检查 */}
                <button
                    onClick={() =>
                        wapper(this.props.appModel.addAsync(2)).then(() => {
                            alert('callback');
                        })
                    }>
                    promise
                </button>
            </div>
        );
    }
}

const NewApp = subscribe({ appModel: AppModel })(App);
export default NewApp;

使用Provider包裹应用,就像react-redux

import createResa, { Provider } from 'resa';

import App from './App';
const app = createResa();

ReactDOM.render(
  <Provider resa={app}>
    <App />
  </Provider>,
  document.getElementById('root') as HTMLElement
);

所以你喜欢这样简洁的代码吗 ?

What is resa?

resa = a simple way to use redux and redux-saga

Docs

Contributing

Pull requests and stars are always welcome. For bugs and feature requests, please create an issue.

results matching ""

    No results matching ""