lulusir / clean-js

一个包含状态库、IOC容器的辅助库,帮助你在在react和vue中管理状态, 简单, 轻量, 方便测试;
https://lulusir.github.io/clean-js
25 stars 0 forks source link
clean-architecture dependency-injection ioc-container presenter react state-management typescript vue

@clean-js/presenter

![NPM version](https://img.shields.io/npm/v/@clean-js/presenter.svg?style=flat) ![Gzip size](https://img.badgesize.io/https:/unpkg.com/@clean-js/presenter/dist/index.js?label=gzip%20size&compression=gzip) ![GitHub](https://img.shields.io/npm/l/@clean-js/presenter)

Docs

目的

为了进一步实现整洁架构,使用 mvp 的方式组织你的前端代码,让项目更加清晰

mvp

快速上手

install

npm install @clean-js/presenter @clean-js/react-presenter --save

or

yarn add @clean-js/presenter @clean-js/react-presenter

Presenter

import { Presenter, injectable } from '@clean-js/presenter';

interface IViewState {
  loading: boolean;
  name: string;
}

@injectable()
export class NamePresenter extends Presenter<IViewState> {
  constructor() {
    super();
    this.state = {
      loading: false,
      name: 'lujs',
    };
  }

  changeName() {
    this.setState((s) => {
      s.name += '!';
    });
  }
}

View

import React from 'react';

import { usePresenter } from '@clean-js/react-presenter';
import { NamePresenter } from './presenter';

const Name = () => {
  const { presenter, state } = usePresenter(NamePresenter);
  return (
    <div>
      <p>name: {state.name}</p>
      <button
        onClick={() => {
          presenter.changeName();
        }}
      >
        hi
      </button>
    </div>
  );
};

export default Name;

tsconfig.json

设置 tsconfig.json

{
  "compilerOptions": {
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  }
}

在umi4中使用

需要在.umirc中添加插件“babel-plugin-transform-typescript-metadata”

import { defineConfig } from 'umi';

export default defineConfig({
  npmClient: 'pnpm',
  extraBabelPlugins: ['babel-plugin-transform-typescript-metadata'],
});