序文: 最近、Vue プロジェクトに参加しましたが、先祖の糞の山に落ちてしまったような気がしました。保守性は言うまでもなく、可読性は極めて低いです。そこで、このコラムでは、Vue コードの可読性についていくつか提案したいと思います。提案が役に立つと思ったら、ぜひ「いいね!」してください。提案が不合理だと思うなら、ぜひコメントして批判してください。より良い提案があれば、ぜひコメントして追加してください。 1. コンポーネントをうまく活用してコードを整理するページのすべての実装コードを .vue ファイルに置かないでください。ページが非常に単純な場合を除き、この 以下の手順に従って、Vue ページをコンポーネントに分割し、コードをより整理することができます。 1. UIコンポーネントを抽出するUI コンポーネントを定義するにはどうすればいいですか?個人的には、サーバー側データを処理するかどうかに基づいて、UI コンポーネントとビジネス コンポーネントを区別することをお勧めします。たとえば、読み込みポップアップ ウィンドウ、2 番目の確認ポップアップ ウィンドウ、メッセージ プロンプト ボックスなどは、UI インタラクション コンポーネントです。 UI コンポーネントを抽出した後、UI インタラクション コードとビジネス インタラクション コードを分離できます。 UI コンポーネントにビジネス コードを記述しないでください。そうしないと、UI コンポーネントを再利用できなくなります。 反例として、2 回目の確認ポップアップ ウィンドウで 2 回目の確認後に処理するビジネス コードを追加すると、UI コンポーネントを再利用できなくなります。 ElementUI のセカンダリ確認ポップアップ ウィンドウの呼び出しを模倣して、セカンダリ確認ポップアップ ウィンドウ コンポーネントを実装できます。 this.$confirm(メッセージ、タイトル、オプション) .then(res =>{}) .catch(エラー =>{}) このように、then のコールバック関数内にビジネス コードを記述できます。コンポーネントのコア実装コードは次のとおりです。 //確認.vue <テンプレート> <div v-show="表示"> //... <div @click="ok"></div> <div @click="キャンセル"></div> </div> </テンプレート> <スクリプト> エクスポートデフォルト{ データ() { 戻る { 表示: 偽、 } }, メソッド: { わかりました() { this.show = false; これを解決します。 }, キャンセル() { this.show = false; これを解決します。 }, } } </スクリプト> //index.js 'vue' から Vue をインポートします。 './confirm.vue' からオプションをインポートします。 const Confirm = Vue.extend(オプション); 確認 = 未定義とします。 const ConfirmInit = (オプション = {}) => { 新しい Promise を返します ((resolve, reject) => { オプションを解決します。 オプション.拒否 = 拒否; 確認 = 新しい確認({ el: document.createElement('div'), データ: オプション }) document.body.appendChild(確認.$el); Vue.nextTick(() => { if (確認) confirm.show = true; }) 確認を返す; }) } Vue.prototype.$confirm = ConfirmInit; //メイン.js import 'components/confirm/index.js'; // 二次確認ポップアップ確認コンポーネントのグローバル登録 2. モジュールごとにビジネスコンポーネントを抽出するページは、ヘッダー、フッター、サイドバー、商品リスト、会員リストなど、複数の領域に分割できます。各領域は、ビジネスコンポーネントを抽出するためのモジュールとして使用できます。 3. 機能別に機能コンポーネントを抽出するモジュールごとにビジネスコンポーネントを抽出した後でも、ビジネスコンポーネントが非常に大きい場合があるため、機能ごとに機能コンポーネントをさらに抽出する必要があります。 関数のサイズはさまざまであり、関数を抽出するときに注意すべき原則がいくつかあります。 過度に単純な関数は抽出されません。 たとえば、コレクション関数は、インターフェースを要求することによって完了できます。このような関数は抽出しないでください。特定の複雑さの論理演算を持つ関数のみを抽出できます。 関数は単一である必要があります: 機能コンポーネントは 1 つのビジネスのみを処理します。 たとえば、ファイル リーダー コンポーネントでは、ファイルを開いた後に自動的にファイルを収集する必要があります。この場合、収集ロジック コードはどこに記述すればよいでしょうか。 おそらく、コンポーネント内のファイルのオープンが成功したかどうかをリッスンするメソッドに、何も考えずにコレクション ロジック コードを記述したのでしょう。しばらくすると、コレクション ボタンをクリックする前に読み取りレコードに追加するという要件に変更されました。コンポーネント内のコードを修正しようとしたところ、別のページもこのコンポーネントを参照していることがわかったため、ビジネス シナリオを区別するためにコンポーネントに追加のパラメーターを追加する必要がありました。要件が変化するにつれて、ビジネス シナリオが重なり合い、さまざまな判断ロジックがコンポーネント コードに追加され、時間の経過とともに長くて退屈なものになりました。明らかに、このアプローチは受け入れられません。 正しい方法は、コンポーネント タグの <ファイルリーダー @on-fileOpen-success="handleFileOpenSuccess" > </ファイルリーダー> コンポーネントのファイルが正常に開かれたかどうかをリッスンするメソッドで 機能コンポーネントにはできるだけ UI を含めず、UI 部分はスロットを通じて渡す必要があります。これにより、コンポーネントがより純粋になり、再利用しやすくなります。 たとえば、UI デザインのドラフトが変更されると、アップロード コンポーネントにアップロード アイコンを追加できなくなります。この場合、スロットを使用してアップロード アイコンを渡すことができます。 //アップロード.vue <テンプレート> <div> <スロット名="アイコン"></スロット> </div> </テンプレート> //インデックス.vue <テンプレート> <div> <アップロード> <テンプレート #アイコン> //アップロードアイコン</template> </アップロード> </div> </テンプレート> 2. v-bindを使用してコンポーネントのプロパティを読みやすくするオブジェクトのすべてのプロパティを パラメータ: { id: 1, 名前: 'vue' } 最適化前: <componentA :id="params.id" :name="params.name"></componentA> 最適化後: <componentA v-bind="params"></componentA> 3. attrsとattrsとリスナーを使用してサードパーティのコンポーネントをカプセル化する1. $属性サードパーティ コンポーネントをカプセル化する場合、カプセル化されたコンポーネントを通じてサードパーティ コンポーネント自体のプロパティとイベントをどのように使用するかという問題に遭遇することがよくあります。 たとえば、 <テンプレート> <div> <el-input v-model="入力"></el-input> <div>{{エラーヒント}}</div> </div> </テンプレート> <スクリプト> エクスポートデフォルト{ 小道具: { 価値: { タイプ: 文字列、 デフォルト: ''、 }, エラーヒント: { タイプ: 文字列、 デフォルト: ''、 } }, データ() { 戻る { } }, 計算: { 入力: { 得る() { this.valueを返す }, 設定(値) { this.$emit('input', val) } } } } </スクリプト>
<myInput v-model="input" :errorTip="errorTip"></myInput> 入力ボックスを無効にするために、 <テンプレート> <div> <el-input v-model="入力" :disabled="無効"></el-input> <div>{{エラーヒント}}</div> </div> </テンプレート> <スクリプト> エクスポートデフォルト{ 小道具: { //... 無効: タイプ: ブール値、 デフォルト: false } }, //... } </スクリプト> しばらくすると、 $attrs:親スコープで v<テンプレート> <div> <el-input v-model="入力" v-bind="$attrs"></el-input> <div>{{エラーヒント}}</div> </div> </テンプレート> これだけじゃ十分ではありません デフォルトでは、 簡単に言うと、 <テンプレート> <div> <el-input v-model="入力" v-bind="$attrs"></el-input> <div>{{エラーヒント}}</div> </div> </テンプレート> <スクリプト> エクスポートデフォルト{ 継承属性: false、 小道具: { 価値: { タイプ: 文字列、 デフォルト: ''、 }, エラーヒント: { タイプ: 文字列、 デフォルト: ''、 } }, データ() { 戻る { } }, 計算: { 入力: { 得る() { this.valueを返す }, 設定(値) { this.$emit('input', val) } } } } </スクリプト> このようにすることで、 2. $リスナーでは、 <テンプレート> <div> <el-input v-model="入力" v-bind="$attrs" @blur="ぼかし"> </el-input> <div>{{エラーヒント}}</div> </div> </テンプレート> <スクリプト> エクスポートデフォルト{ //... メソッド: { ぼかし(){ this.$emit('blur') } } } </スクリプト> <私の入力 v-model="入力" :errorTip="エラーヒント" @blur="ハンドルブラー"> </myInput>
$listeners:親スコープ内の <テンプレート> <div> <el-input v-model="入力" v-bind="$attrs" v-on="$リスナー"> </el-input> <div>{{エラーヒント}}</div> </div> </テンプレート> <スクリプト> エクスポートデフォルト{ //... } </スクリプト> <私の入力 v-model="入力" :errorTip="エラーヒント" @blur="ハンドルブラー"> </myInput>
これで、Vue コードの読みやすさに関する提案に関するこの記事は終了です。Vue コードの読みやすさに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Dockerコンテナの構築と実行のプロセスの詳細な説明
目次1. 反射とは何ですか? 2. JavaScriptで反映する2.1 Reflect.get(タ...
この記事では、Linux のユーザーおよびグループのコマンドについて例を挙げて説明します。ご参考まで...
しばらくサーバーいじってなかったけど、やることがなくなったのでモバイルワークスに行って海外サーバーを...
1. ダウンロード参考: 2. D:\MySQL\mysql-5.7.24 などの固定の場所に解凍し...
キー修飾子キーボード イベントをリッスンする場合、詳細なキーを確認する必要があることがよくあります。...
いわゆる 3 列適応レイアウトとは、両側の幅が固定され、中央のブロックの幅が適応されることを意味しま...
ソフトウェアとハードウェア環境centos7.6.1810 64ビット cat /etc/red...
ウェブページを作り始めたばかりの友人の多くは、拡張子が非常に多いことに気づきます。実際、htm と ...
目次導入1. 異食症2. レナ3. コンプレッサー4. ファブリック5. ぼかす6. 画像を結合する...
この記事では、例を使用して、MySQL データベースの列を追加、削除、および変更する方法について説明...
環境の準備 Docker環境 MySQL 5.7 (公式イメージはmysql8をサポートしていません...
1. transform 属性を使用して、画像を拡大せずに表示します (パスの問題は必要に応じて修正...
この記事の例では、ログインページを実装するためのlayuiの具体的なコードを参考までに共有しています...
1. nacosデータベースを再開します。データベース名nacos_configユーザー名とパスワー...
Vue ユーザーとして、React を拡張する時が来ました。antd の導入、less と rout...