新会社は、Umi、Dva、Ant-design などの一連のソリューションを含む React テクノロジー スタックを使用しているためです。少し慣れてきた後、いくつかの違いはあるものの、それでも非常に異なることに気付きました。以下では、デザイン、記述方法、API、ライフサイクル、人気のエコロジーの観点から、2 つの人気フレームワークである react16 と vue2 (現在 vue3 を学習中) を簡単に比較します。 デザイン
コンポーネント通信react: 厳密に一方向のデータフロー
すべてがpropsになるという原則に従ってください。onChange/setState() Vue: 一方向データフロー
コンポーネントインスタンス (VueComponent) を取得する方法もいくつかあります。たとえば、$refs、$parent、$children などです。親コンポーネントまたは子コンポーネントを再帰的に取得する方法もあります。たとえば、findComponentUpward、findComponentsUpward などです。高レベルコンポーネント: provide/reject、dispatch/broadcast
ライフサイクル
イベント処理反応する
関数フォーム() { 関数handleSubmit(e) { e.preventDefault(); console.log('送信をクリックしました。'); } 戻る ( <フォームonSubmit={handleSubmit}> <button type="submit">送信</button> </フォーム> ); } ビュー 通常の要素で使用する場合、ネイティブ DOM イベントのみをリッスンできます。カスタム要素コンポーネントで使用すると、子コンポーネントによってトリガーされるカスタムイベントをリッスンすることもできます。 //ネイティブ イベント <form v-on:submit.prevent="onSubmit"></form> //カスタム イベント <my-component @my-event="handleThis(123, $event)"></my-component> Vue イベント修飾子:
品格とスタイルクラス反応する 与える() { className = 'menu';とします。 if (this.props.isActive) { className += 'メニューアクティブ'; } <span className={className}>メニュー</span> を返す } ビュー <div クラス="static" :class="{ active: isActive, 'text-danger': hasError }" </div> <div :class="[{ active: isActive }, errorClass]"></div> スタイル反応する <div style={{color: 'red', fontWeight: 'bold'}} /> ビュー <div :style="[baseStyles, overridingStyles]"></div> コンポーネントをスタイル設定する場合、スタイル タグにスコープ タグをコンポーネント スタイル分離注釈として宣言できます (例: <style lang="sass" scoped></style>)。パッケージ化の際、コンポーネント間のCSS汚染を避けるために、スタイルには実際に一意のハッシュ値が追加されます。 条件付きレンダリング
リストレンダリングreact: .mapを使用する場合、要素のキーは、要素がリスト内で持つ一意の文字列であることが望ましい <ul> {props.posts.map((投稿) => <li キー = {投稿 ID}> {投稿タイトル} </li> )} </ul> vue: Vue にヒントを与えて各ノードの ID を追跡し、既存の要素を再利用して並べ替えることができるようにするには、各項目に一意のキー属性を提供する必要があります。 <li v-for="item in items" :key="item.message"> {{アイテム.メッセージ}} </li> コンポーネントのネスト反応する デフォルトスロット <div className={'FancyBorder FancyBorder-' + props.color}> {props.children} </div> 名前付きスロット <div className="SplitPane"> <div className="SplitPane-left"> {props.left} </div> <div className="SplitPane-right"> {props.right} </div> </div> <SplitPane 左={<連絡先 />} 右={<チャット />} /> ビュー デフォルトスロット <メイン> <スロット></スロット> </メイン> 名前付きスロット <ヘッダー> <スロット名="ヘッダー"></スロット> </ヘッダー> DOMを取得するreact: フォーカス、テキスト選択、またはメディアの再生を管理します。強制アニメーションをトリガーします。サードパーティのDOMライブラリを統合する クラスMyComponentはReact.Componentを拡張します。 コンストラクタ(props) { スーパー(小道具); this.myRef = React.createRef(); } 与える() { <div ref={this.myRef} /> を返します。 } } vue: 要素またはサブコンポーネントの参照情報を登録するために使用されます <div ref="div">こんにちは</div> this.$refs.p.offsetHeight 文書構造うみ ├── config # ルーティング、ビルド、その他の構成を含む umi 構成│ ├── config.ts # プロジェクト構成.umirc.ts の方が優先度が高く、この方法では .umirc.ts を削除する必要があります │ ├──routes.ts # ルーティング設定│ ├──defaultSettings.ts # システム設定│ └──proxy.ts # プロキシ設定├──mock # このディレクトリ内のすべてのjsおよびtsファイルは、モックファイルとして解析されます├──public # このディレクトリ内のすべてのファイルは出力パスにコピーされます。ハッシュが設定されていても追加されません├──src │ ├── アセット # ローカル静的リソース│ ├── コンポーネント # ビジネス共通コンポーネント│ ├── e2e # 統合テストケース│ ├── レイアウト # 従来のルーティングのグローバルレイアウトファイル│ ├── モデル # グローバル dva モデル │ ├── pages # すべてのルーティングコンポーネントはここに保存されます│ │ └── document.ejs # このファイルが存在する場合は、デフォルトのテンプレートとして使用することに同意します│ ├── services # バックエンドインターフェースサービス│ ├── utils # ツールライブラリ│ ├── locales # 国際リソース│ ├── global.less # グローバルスタイル│ ├── global.ts # グローバル JS │ └── app.ts # ルートの変更、レンダリングメソッドの変更などのランタイム構成ファイル。 ├── README.md └── package.json vue_cli ├── mock # プロジェクトのモックシミュレーションデータ├── public # 静的リソース│ └── index.html # HTML テンプレート├── src # ソースコード│ ├── api # すべてのリクエスト│ ├── asset # テーマフォントとその他の静的リソース│ ├── components # グローバルパブリックコンポーネント│ ├── directive # グローバルディレクティブ│ ├── filters # グローバルフィルター │ ├── レイアウト # グローバルレイアウト │ ├── router # ルーティング│ ├── store # グローバルストア管理│ ├── utils # グローバルパブリックメソッド│ ├── views # 全ページのビュー│ ├── App.vue # エントリページ│ └── main.js # エントリファイルの読み込みコンポーネントの初期化など├── tests # テスト├── vue.config.js # プロキシ、圧縮画像などの vue-cli 設定└── package.json # package.json ルーティング動的ルーティングとルーティングパラメータ反応ルーター
props.match.query / props.match.params を取得する vue-ルーター
this.$router.query / this.$router.params を取得します ネストされたルート-反応する { パス: '/'、 コンポーネント: '@/layouts/index', ルート: [ { パス: '/list'、コンポーネント: 'list' }, { パス: '/admin'、コンポーネント: 'admin' }, ]、 } <div style={{ padding: 20 }}>{ props.children }</div> props.children を使用して子ルートをレンダリングする vue-ルーター { パス: '/user/:id', コンポーネント: ユーザー、 子供たち: [ { パス: 'プロファイル', コンポーネント: UserProfile }, { パス: '投稿', コンポーネント: UserPosts } ] } <div id="アプリ"> <ルータービュー></ルータービュー> </div> サブルートをレンダリングするには、vueネイティブコンポーネント/<router-view/>コンポーネントを使用します。 ルートジャンプうみ <NavLink exact to="/profile" activeClassName="selected">プロフィール</NavLink> 履歴.push(`/list?id=${id}`) ビュー <router-link to="/about">について</router-link> this.$router.push({パス: '/list', クエリ: {id}}) ルーティングガード(ログイン認証、特殊ルーティング処理)
グローバルルーティングガード グローバル事前ガード: router.beforeEach const ルーター = 新しい VueRouter({...}) router.beforeEach((to, from, next) => { // ... }) グローバルポストガード: router.beforeEach router.afterEach((to, from) => { // ... }) 状態管理複数のビューが同じ状態に依存している場合、または異なるビューの動作で同じ状態を変更する必要がある場合は、状態マネージャーが必要です。
使用dva: モデル接続UI // 新しいモデル: models/products.js エクスポートデフォルト{ 名前空間: '製品', 州: []、 リデューサー: { 'delete'(状態、{ ペイロード: id }) { state.filter(item => item.id !== id) を返します。 }, }, }; //モデルを接続 エクスポートデフォルトconnect(({製品}) => ({ 製品、 }))(製品); //ディスパッチモデルを減らす ディスパッチモデルreduce({ タイプ: 'products/delete'、 ペイロード: ID、 }) Ajaxリクエスト、dispathモデルエフェクトなどの非同期操作がある場合、エフェクトはモデル削減を呼び出します // 新しいモジュール 定数ストア = 新しい Vuex.Store({ 州: { カウント: 1 }, 突然変異: 増分(状態) { 状態.count++ } }, アクション: { インクリメント(コンテキスト) { context.commit('増分') } } }) //UIをバインド <input v-model="$store.state[モデル名].name"/> //モジュールの変更をコミットする store.commit('増分') Ajaxリクエスト、dispathモジュールアクションなどの非同期操作があり、その後アクションがモジュールのミューテーションを呼び出す場合 ストア.ディスパッチ({ タイプ: 'incrementAsync'、 数量: 10 }) これで、Vue から React への変換入門ガイドに関するこの記事は終了です。Vue から React への変換に関する関連コンテンツをさらにご覧になりたい場合は、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続きご覧ください。今後も 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Docker は 2003 年の問題を解決するために MySQL リモート接続を導入しました
fd コマンドは、Linux ファイル システムを検索するためのシンプルで簡単な方法を提供します。...
持つことの使用法having 句を使用すると、グループ化後にさまざまなデータをフィルター処理できます...
目次1. Redis Dockerベースイメージを作成する2. Redisノードイメージを作成する3...
Tomcat は内部的に複数の ClassLoader を定義し、アプリケーションとコンテナーが異な...
目次1. コンストラクタとインスタンス化2. コンストラクターとインスタンス化の関係は何ですか? 3...
序文アプリケーション シナリオ: おそらく、内部 Web サイトは外部ユーザーにアクセス可能である必...
最近、かなり暇です。大学4年生として数か月間インターンをしていました。インターンとして、Docker...
JavaScript スクリプトは HTML 内のどこにでも埋め込むことができますが、いつ呼び出され...
フロントエンドの開発過程で、チェックボックスが必要な状況が発生しました。ユーザー操作の利便性を考慮し...
ボリュームとは何ですか?ボリュームは英語で容量を意味し、Docker ではデータ ボリューム、つまり...
<br />Web ページ上の情報は主にテキストベースです。 Web ページでは、フォン...
序文最も人気のあるフロントエンド開発フレームワークである Bootstrap は、Web サイトの開...
CSS3を使用して、Googleログインページと同様の入力ボックスをアニメーション化します。効果1 ...
序文:ジュニアプログラマーとして、私は自分自身の個人ウェブサイトを構築し、それを他の人に見せることを...
この記事では、ネストされたタブ機能を実装するためのjQueryの具体的なコードを参考までに紹介します...