今回は React と TypeScript と Mobx を組み合わせる手順について詳しく説明します。 React と TypeScript と Mobx を組み合わせる際の 注意点 について、実際のケースを見てみましょう。
JavaScript動的で弱い型付け言語では、静的型検出を通じて、柔軟性が高いにもかかわらず、プログラム内の隠れたロジック エラーをできるだけ早く検出できます。初心者には適していません。JavaScript の内部言語メカニズムに慣れていないと、隠れた事故が発生しやすくなります。ただし、TypeScript の静的型検出を使用すると変数の型を制限できるため、これらの問題は回避できます。 IDEEditorと組み合わせることで、変数に対応する型や内部構造を推定することができ、コードの堅牢性と保守性が向上します。
型システムは標準化されたプログラミングを強化でき、TypeScript は定義インターフェイスを提供します。これは、大規模で複雑なアプリケーション ソフトウェアを開発する場合に非常に重要です。システム モジュールは、TypeScript によって定義されたインターフェイスと抽象的にみなすことができます。設計を実装から分離し、最終的には IDL (Interface Define Language) を反映させ、プログラミングを本質に立ち返らせることができます。
TypeScript は型アノテーションに基づいてドキュメントを自動的に生成でき、単純な関数実装ではコメントを書く必要はありません。
まず、mobxとreduxの位置付けが異なることを理解する必要があります。 Redux は (STORE -> VIEW -> ACTION) の閉ループ全体を管理しますが、mobx は STORE -> VIEW 部分のみを考慮します。
Redux の長所と短所:
あらゆるディスパッチがブロードキャストをトリガーし、オブジェクト参照が変更されるかどうかに基づいて更新の粒度が制御されるため、データ フローは非常に自然に流れます。
時間バックトラッキングの機能を最大限に活用することで、ビジネスの予測可能性とエラー位置特定機能を強化できます。
コードの複雑さが増すか不変が使用されない限り、参照を毎回更新する必要があるため、時間のバックトラッキングはコストがかかります。
バックトラッキングのもう 1 つのコストは、アクションとリデューサーが完全に切り離されていることです。その理由は、バックトラッキングでは参照関係が必ずしも保証されないためです。
は、非同期によって引き起こされる副作用を解決するためにミドルウェアを導入しており、ビジネスロジックには多かれ少なかれ魔法が混在しています。
ミドルウェアを柔軟に使用すると、契約を通じて多くの複雑なタスクを完了できます。
typescript のサポートが困難です。
Mobx の長所と短所:
データ フローは不自然ですが、使用されるデータのみがバインディングとローカルの正確な更新をトリガーしますが、詳細な制御の問題が回避されます。
データには参照が 1 つしかないため、タイムバック機能はありません。全体を通して参照が 1 つであり、不変は必要なく、オブジェクトのコピーによる追加のオーバーヘッドもありません。
データフローは関数呼び出しで一度に完了するため、デバッグが簡単です。
事業開発は頭脳的な仕事ではなく、物理的な仕事であり、魔法は少なく、より効率的です。
魔法がないため、ミドルウェア機構がなく、魔法によって作業効率を高速化する方法がありません(ここでの魔法とは、リデューサーにアクションを分配するプロセスを指します)。
typescript を完全にサポートします。
SO: フロントエンド データ フローがそれほど複雑でない場合は、Mobx を使用します。これは、フロントエンド データ フローがより明確で保守が容易であるためです。フロントエンド データ フローが非常に複雑な場合は、注意して Redux を使用することをお勧めします。ミドルウェアによるビジネスの巨大な複雑さ
npm i -g create-react-app create-react-app tinylog-ui --scripts-version=react-scripts-ts cd tinylog-ui/ npm start npm run eject
TPS: 最後のコマンドは eject を使用してすべての組み込み構成を公開します
プロジェクト全体の環境初期化は、次の方法で簡単に完了できますTypeScript を使用する場合は、webpack と TypeScript の環境構築プロセスを無視して、create-react-app を使用して環境構築を実装してください。
单页应用怎么可以没有前端路由呢,所以我们要加入React-Rotuer, 这里使用的React-Router的版本是v4.2.0
对于React-Router,这里使用到的模块有Router, Route, Switch
React Router 是建立在 history 之上的。 简而言之,一个 history 知道如何去监听浏览器地址栏的变化, 并解析这个 URL 转化为 location 对象, 然后 router 使用它匹配到路由,最后正确地渲染对应的组件。
代码如下:
import * as React from 'react'; import * as ReactDOM from 'react-dom'; import { Router, Route, Switch } from 'react-router'; import { createBrowserHistory } from 'history'; import registerServiceWorker from './registerServiceWorker'; import { Root } from './containers/Root'; import './index.css'; import Container from './containers/Container'; import SignIn from './containers/Auth/signIn'; import SignUp from './containers/Auth/signUp'; const history = createBrowserHistory(); ReactDOM.render( <root> <router> <switch> <route></route> <route></route> <route></route> </switch> </router> </root>, document.getElementById('root') as HTMLElement ); registerServiceWorker();
这里描述一写Container这个组件的编写
import * as React from 'react'; import Header from '../../layout/Header'; import { IAuth } from '../../interfaces'; import { Route, Switch } from 'react-router'; import App from '../App'; import Website from '../Website'; // 这部分是坑点,一开始不知道配置,后发现react-rotuer的4.0版本下需要配置prop的接口 interface Container extends RouteComponentProps { } class Container extends React.Component<container> { render () { return ( <p> <header></header> <switch> <route></route> <route></route> </switch> </p> ) } } export default Container;</container>
这样,当我们访问url为'/'的时候,默认会进入Container,其中Container里面是一层子页面,会匹配url,如果url为'/website', 则进入Website页面,若为'/',则进入App页面。
具体关于React-Router的使用请阅读React-Router文档
npm i mobx react-mobx mobx-react-router -S
import * as React from 'react'; import * as ReactDOM from 'react-dom'; import { Router, Route, Switch } from 'react-router'; import { createBrowserHistory } from 'history'; import { useStrict } from 'mobx'; import { Provider } from 'mobx-react'; import { RouterStore, syncHistoryWithStore } from 'mobx-react-router'; // 定义需要使用到的store来进行数据状态的管理 import { TokenStore, AuthStore, HostStore, OverViewStore, AssetsStore, CommonDataStore, PageStore, RealTimeStore } from './stores'; import registerServiceWorker from './registerServiceWorker'; import { Root } from './containers/Root'; import './index.css'; import Container from './containers/Container'; import SignIn from './containers/Auth/signIn'; import SignUp from './containers/Auth/signUp'; // 引入Echarts import './macarons'; import 'echarts/map/js/world'; // 开启mobx的严格模式,规范数据修改操作只能在action中进行 useStrict(true); const browserHistory = createBrowserHistory(); const routerStore = new RouterStore(); // 同步路由与mobx的数据状态 const history = syncHistoryWithStore(browserHistory, routerStore); const rootStore = { token: new TokenStore(), auth: new AuthStore(), host: new HostStore(), overview: new OverViewStore(), assets: new AssetsStore(), commmon: new CommonDataStore(), page: new PageStore(), realtime: new RealTimeStore(), router: routerStore }; ReactDOM.render( <provider> <root> <router> <switch> <route></route> <route></route> <route></route> </switch> </router> </root> </provider>, document.getElementById('root') as HTMLElement ); registerServiceWorker();
import * as React from 'react'; import Header from '../../layout/Header'; import { IAuth } from '../../interfaces'; import { Route, Switch } from 'react-router'; // 使用inject和observer来进行数据监听和数据依赖声明 import { inject, observer } from 'mobx-react'; import App from '../App'; import Website from '../Website'; interface Container extends IAuth { } @inject('router', 'auth') @observer class Container extends React.Component<container> { render () { return ( <p> <header></header> <switch> <route></route> <route></route> </switch> </p> ) } } export default Container;</container>
@observable 可以在实例字段和属性 getter 上使用。 对于对象的哪部分需要成为可观察的,@observable 提供了细粒度的控制。@inject 相当于Provider 的高阶组件。可以用来从 React 的context中挑选 store 作为 prop 传递给目标组件
import { RouteComponentProps } from 'react-router'; import { RouterStore, AuthStore } from '../stores'; export interface IBase extends RouteComponentProps { router: RouterStore; } export interface IAuth extends IBase { auth: AuthStore; }
先看一下RouterStore:
import { History } from 'history'; import { RouterStore as BaseRouterStore, syncHistoryWithStore } from 'mobx-react-router'; // 路由状态同步 class RouterStore extends BaseRouterStore { public history; constructor(history?: History) { super(); if (history) { this.history = syncHistoryWithStore(history, this); } } } export default RouterStore;
然后是AuthStore:
import { ISignIn, ISignUp } from './../interfaces/index'; import { observable, action } from 'mobx'; import api from '../api/auth'; import { IUser } from '../models'; // 登录注册状态 class AuthStore { @observable token; @observable id; @observable email; constructor () { this.id = ''; this.token = ''; this.email = ''; } setLocalStorage ({ id, token, email }: IUser) { localStorage.setItem('id', id); localStorage.setItem('token', token); localStorage.setItem('email', email); } clearStorage () { localStorage.clear(); } @action async signIn (data: ISignIn) { try { const { data: res } = await api.signIn(data); this.id = res.data.id; this.token = res.data.token; this.email = res.data.email; this.setLocalStorage({ id: this.id, token: this.token, email: this.email }); return res; } catch (error) { return error; } } @action async signUp (data: ISignUp) { try { const { data: res } = await api.signUp(data); this.id = res.data.id; this.token = res.data.token; this.email = res.data.email; this.setLocalStorage({ id: this.id, token: this.token, email: this.email }); return res; } catch (error) { return error; } } @action signOut () { this.id = ''; this.token = ''; this.email = ''; this.clearStorage() } } export default AuthStore;
Auth是用于网站的登录注册事件以及对应的Token的数据状态保存,登录注册事件的接口请求等操作。
具体的有关Mobx的用法请阅读Mobx文档
app ├── api 后端提供的接口数据请求 ├── components 编写的可复用组件 ├── config 侧边栏以及导航栏配置 ├── constants 常量编写 ├── interfaces 接口编写 ├── layout 布局外框 ├── stores mobx的数据状态管理 ├── index.css 全局样式 ├── index.tsx 页面入口 ├── reset.css 浏览器重置样式
本项目使用了Ant-Design来作为依赖的组件库,具体怎么使用以及配置请参考Ant-Design
到这里其实以及完成对React下TypeScript结合React-Router和Mobx的配置。具体的业务模块如何编写有兴趣可以参阅项目tinylog-ui
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上がReactとTypeScriptおよびMobxを組み合わせる手順の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。