新会社は、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 リモート接続を導入しました
この記事では主に、Vue でシンプルな無限ループスクロールアニメーションを実装し、みんなで共有する例...
ツール型ウェブサイトについて、まず疑問に思うのは、無数のオンラインウェブサイトの中で、どのようなウェ...
ここでは、フォーム要素とフォーム送信に関する知識を紹介します。フォーム要素フォーム要素の DOM イ...
最近、Docker イメージのプルが非常に不安定です。遅く、タイムアウトすることがよくあります。 x...
この記事では、パスワードボックスの検証情報を実装するためのJavaScriptの具体的なコードを例と...
目次1. コンポーネント通信1. Props 親コンポーネント ---> 子コンポーネント通信...
ディスク領域の管理は、システム管理者にとって重要な日常的なタスクです。ディスク領域が使い果たされると...
1 ダウンロードして準備するまず、公式ウェブサイトからTomcatをダウンロードする必要があります。...
1. まず、nginxの位置情報に関する関連知識を確認しましょう1) 位置マッチング手順: ~ #波...
以前、プロジェクトでQRコードをスキャンして情報を表示する機能を開発する必要がありました。インターネ...
目次序文typeof は型を正しく判別できますか? instanceof は型を正しく判別できますか...
オブジェクトがメソッドを呼び出す順序:インスタンス内にメソッドが存在しない場合は、インスタンス オブ...
ステップ 1: メモ帳を使用して、MySQL インストール ディレクトリの「my.ini」ファイルを...
<Head>タグに追加する<meta http-equiv="pragm...
目次0. モジュールとは何か1.モジュールの読み込み1.1 方法1 1.2 方法2 2. 輸出と輸入...