Vue テンプレートで多数の条件付き選択 v-if を最適化する方法

多数の v-if の欠点

実際のプロジェクトでは、ビジネス条件の選択が大量に行われるケースがよくありますが、この場合、「v-if」や「v-else」命令が大量に使用されると、

1. ページのレンダリング パフォーマンスが低下し、読み込み時間が増加する: これらの各v-if条件を調べて計算する必要があり、特に条件の選択が複雑で計算のオーバーヘッドが大きい場合、初期レンダリング時間が増加し、ページが長くなる原因となります。ロード時間。

2. 冗長コードの増加: 冗長コードが多すぎるv-ifと、テンプレート コードが長くなり、保守が困難になります。その結果、コードの可読性が低下し、理解とデバッグが困難になります。

3. 保守性の低下:テンプレートに多数の条件が存在する場合v-if、各条件の判定が独立しているため、1つの条件を変更するのに複数箇所の変更が必要となり、エラーが発生する可能性が増大し、保守が煩雑になります。

4. メモリの増加:v-if条件ごとに対応する DOM 要素が生成され、条件を切り替えるときに作成および破棄されます。テンプレート内の要素が多数ある場合、v-ifメモリ使用量が増加し、パフォーマンスに影響します。パフォーマンスとリソースの消費。

オプションの最適化オプション

計算されたプロパティを利用する

複雑な条件付きロジックを計算された属性に転送して、テンプレートでの「v-if」と「v-else」の頻繁な使用を回避します。属性の戻り値を計算することで、レンダリングされたコンテンツを制御します。これにより、テンプレート コードがより簡潔になり、条件処理ロジックがより明確になり、保守が容易になります。

<template> 
    <div> 
        <span v-if="displayText">{
   
   { displayText }}</span> 
    </div> 
 </template> 
 <script> 
     export default {
      
       
         data() {
      
       
             return {
      
       
                 // ... 
              }; 
         }, 
         computed: {
      
       
             displayText() {
      
       
                 // 在此处添加复杂的条件逻辑 
                     if (/* condition */) {
      
       
                        return 'Text 1'; 
                      } else if (/* another condition */) {
      
       
                        return 'Text 2'; 
                      } else {
      
       
                        return 'Default Text'; 
                       } 
               }, 
         },
     }; 
 </script>

非同期動的コンポーネントの使用 (動的コンポーネント)

<component :is="currentComponent"> 条件に基づいてさまざまなコンポーネントをレンダリングする場合は、動的切り替えコンポーネントを使用できます 。

この最適化方法は、工厂模式ファクトリ コンポーネントにすべてのコンポーネントを登録すること、受信条件に基づいてどのコンポーネントを生成するかを知ること、およびページ レンダリングに :is を使用することを組み合わせたものです。

<template> 
    <div> 
        <component :is="currentComponent"></component> 
    </div> 
</template> 
<script> 
    import ComponentA from './ComponentA.vue'; 
    import ComponentB from './ComponentB.vue'; 
    import ComponentC from './ComponentC.vue'; 
    export default {
      
       
        data() {
      
       
            return {
      
       
                // ... 
             }; 
         }, 
         computed: {
      
       
             currentComponent() {
      
       
                // 在此处添加复杂的条件逻辑 
                if (/* condition */) {
      
       
                     return ComponentA; 
                 } else if (/* another condition */) {
      
       
                     return ComponentB; 
                 } else {
      
       
                     return ComponentC; 
                 } 
             }, 
        }, 
        components: {
      
       
            ComponentA, 
            ComponentB, 
            ComponentC, 
         }, 
    }; 
  </script>

v-show代わりに使用してくださいv-if

v-showオーバーライドは、要素の表示と非表示を頻繁に切り替える必要がある場合に使用できますv-ifv-show要素のCSS displayプロパティのみが変更されるため、DOM 要素の表示と非表示の頻繁な切り替えが回避され、v-if要素は DOM から完全に削除または再挿入されますが、要素と要素はv-showサポートされていません<template>v-else

<template>
    <div> 
        <span v-show="isVisible">显示文本</span> 
    </div> 
</template> 
<script> 
    export default {
      
       
        data() {
      
       
            return {
      
       
                isVisible: true, 
             }; 
         }, 
    }; 
</script>

条件付きロジックを子コンポーネントに移動する

条件付きロジックを小さなサブコンポーネントに分割すると、コードがよりモジュール化され、保守しやすくなります。各子コンポーネントは独自の条件付きロジックの処理を担当できるため、親コンポーネントの複雑さが軽減されます。

<!-- ParentComponent.vue --> 
<template> 
    <div> 
        <child-component :data="data"></child-component> 
    </div> 
</template> 
<script> 
    import ChildComponent from './ChildComponent.vue'; 
    export default {
      
       
        components: {
      
       
            ChildComponent, 
        }, 
        data() {
      
       
            return {
      
       
                data: /* some data */, 
             }; 
         }, 
    }; 
</script>   
<!-- ChildComponent.vue --> 
<template> 
    <div> 
        <span v-if="condition1">Text 1</span> 
        <span v-else-if="condition2">Text 2</span> 
        <span v-else>Default Text</span> 
    </div> 
</template> 
<script> 
    export default {
      
       
        props: ['data'], 
        computed: {
      
       
            condition1() {
      
       
                // Calculate condition1 based on this.data 
            }, 
            condition2() {
      
       
                // Calculate condition2 based on this.data 
            }, 
        }, 
    }; 
</script>

データの前処理

レンダリング中に特定の条件が変更されない場合、前処理をデータ レベルで実行し、結果をキャッシュすることができます。これにより、テンプレート内での計算や判定条件の繰り返しが回避されます。

<template>
  <div>
    <template v-if="isConditionA">
      <!-- 渲染条件 A 的内容 -->
    </template>
    <template v-else-if="isConditionB">
      <!-- 渲染条件 B 的内容 -->
    </template>
    <template v-else>
      <!-- 渲染默认内容 -->
    </template>
  </div>
</template>

<script>
export default {
      
      
  data() {
      
      
    return {
      
      
      data: /* 原始数据 */,
      isConditionA: false,
      isConditionB: false
    };
  },
  created() {
      
      
    // 预处理数据,并计算条件结果
    // 可以在这里对 this.data 进行处理,然后计算出 this.isConditionA 和 this.isConditionB 的值
  }
}
</script>

おすすめ

転載: blog.csdn.net/weixin_45506717/article/details/132965138