Fusionner les colonnes dans les composants Description d'Element UI Vue.js

L'objectif est de créer une disposition personnalisée pour les composants el-descriptions, où la première ligne affiche 3 colonnes (incluant les étiquettes) et les lignes suivantes affichent 4 colonnes. Les approches conventionnelles utilisant labelStyle ou contentStyle pour fusionner des cellulse se sont avérées inefficaces pour ce scénario spécifique.

Tentatives Initiales

1. Échec avec les Styles CSS

Une première tentative conisstait à manipuler les styles pour masquer ou ajuster la largeur des étiquettes afin de permettre aux cellules de contenu de s'étendre. Cependant, définir display: none sur une étiquette entraînait un effondrement de la cellule de contenu vers la position de l'étiquette, déformant ainsi la mise en page. L'ajustement de la largeur présentait également des résultats indésirables.

2. Approche Basée sur la Structure DOM

Une autre approche a été explorée en séparant la première ligne "spéciale" des lignes de description suivantes. Cela impliquait l'utilisation de deux composants el-descriptions imbriqués. Le composant externe agissait comme un conteneur, avec deux el-descriptions-item contenant chacun un composant el-descriptions interne. Bien que cela ait résolu le problème de l'apparence de la table, le manque de spécifications de table cohérentes a entraîné des problèmes d'alignement et une instabilité visuelle entre les deux sections.

<el-descriptions
  :column="2"
  border
  labelstyle="text-align: center; width: 120px;"
  contentStyle="text-align:center;"
>
  <el-descriptions-item labelClassName="labelClass">
    <el-descriptions
      :column="3"
      border
      labelstyle="text-align: center; width: 120px;"
      contentStyle="text-align:center;"
    >
      <el-descriptions-item contentStyle="display:none;">
        <template slot="label">
          label1
        </template>
      </el-descriptions-item>
      <el-descriptions-item labelStyle="display:none;">
        <el-input
          readonly
          :value="item.value"
          style="width: 100%; text-align: center"
        />
      </el-descriptions-item>
      <el-descriptions-item labelStyle="display:none;">
        <el-input
          readonly
          :value="item.value"
          style="width: 100%; text-align: center"
        />
      </el-descriptions-item>
    </el-descriptions>
  </el-descriptions-item>

  <el-descriptions-item>
    <el-descriptions>
      <el-descriptions-item
        v-for="(item, index) in tableHead"
        :key="index"
        labelclassName="labelClass"
      >
        <template slot="label">
          {{ "label" + index }}
        </template>
        <el-input
          readonly
          :value="item.value"
          style="width: 100%; text-align: center"
        />
      </el-descriptions-item>
    </el-descriptions>
  </el-descriptions-item>
</el-descriptions>

Bien que l'espacement des cellules ait été corrigé, l'alignement des étiquettes et la cohérence globale de la table restaient problématiques.

Solution Optimale

Une solution plus propre et plus robuste exploite la propriété span des el-descriptions-item. La propriété column d'un el-descriptions définit le nombre d'éléments (paires étiquette-contenu) par ligne. La propriété span d'un el-descriptions-item spécifie combien de colonnes définies par column cet élément doit occuper.

En utilisant span, nous pouvons contrôler précisément comment les éléments s'étendent sur plusieurs colonnes, permettant ainsi de créer la disposition souhaitée sans recourir à des structures imbriquées complexes ou à des manipulations CSS non standards. La propriété labelClassName peut être utilisée pour des modifications de style ciblées, telles que la couleur.

<el-descriptions
  :column="2"
  border
  labelstyle="text-align: center; width: 120px;"
  contentStyle="text-align:center;"
>

  <el-descriptions-item 
    :span="2"   
    labelClassName="labelClass"
  >
    <template slot="label">
      label 
    </template>
    <el-input 
      readonly 
      :value="tableData.is"
    />
    <el-input 
      readonly 
      :value="tableData.vn"
    />
  </el-descriptions-item>
  
  <el-descriptions-item
    v-for="(item, index) in tableHead"
    :key="index"
    labelclassName="labelClass"
  >
    <template slot="label">
      label
    </template>
    <el-input
      readonly
      :value="tableData[item.value]"
      style="width: 100%; text-align: center"
    />
  </el-descriptions-item>
  
</el-descriptions>

Cette approche garantit un alignement précis, évite les décalages et maintient une structure de table cohérente et prévisible.

Étiquettes: Vue.js Element UI el-descriptions CSS HTML

Publié le 23 juillet à 00h35