es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo crear un componente de tabla Vue con slots de columna?

Actualmente estoy trabajando en un proyecto de Vue (Vue 2) relativamente grande que utiliza muchas tablas, y quiero crear un componente de tabla reutilizable donde cada columna sea un componente hijo / slot. Algo como esto:

<table :data="data">
  <tablecolumn field="id" label="ID"></tablecolumn>
  <tablecolumn field="name" label="Nombre"></tablecolumn>
  <tablecolumn field="date_created" label="Creado"></tablecolumn>
</table>

const data = [
  { id: 1, name: 'Foo', date_created: '01.01.2021' },
  { id: 2, name: 'Bar', date_created: '01.01.2021' }
];

Lo cual a su vez debería generar esto:

<table>
  <thead>
    <tr>
      <th>ID</th>
      <th>Nombre</th>
      <th>Creado</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>Foo</td>
      <td>01.01.2021</td>
    </tr>
    <tr>
      <td>2</td>
      <td>Bar</td>
      <td>01.01.2021</td>
    </tr>
  </tbody>
</table>

Anteriormente hemos utilizado Buefy, pero el tamaño del proveedor se vuelve innecesariamente grande, ya que solo usamos una fracción de la funcionalidad de los componentes, así que quiero crear una alternativa liviana.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para crear un componente de tabla reutilizable con componentes hijos para cada columna en un proyecto Vue 2, sigue estos pasos:

    1. Crea un nuevo componente llamado TableColumn.vue para cada columna de la tabla. Esto se puede hacer usando el método Vue.component para registrar un nuevo componente:
    Vue.component('TableColumn', {
      props: ['field', 'label'],
      template: '<th>{{ label }}</th>'
    })
    

    Aquí, definimos las propiedades field y label que se pasarán desde el componente padre (Table). La sección de template define la plantilla HTML del encabezado de la columna.

    1. Crea el componente Table, que será el componente padre que renderiza la tabla. En este componente, usaremos la directiva v-for para iterar sobre los componentes hijos TableColumn, y la directiva v-bind para pasar las propiedades field y label:
    Vue.component('Table', {
      props: ['data'],
      template: `
        <table>
          <thead>
            <tr>
              <tablecolumn v-for="column in columns" :key="column.field" :field="column.field" :label="column.label"></tablecolumn>
            </tr>
          </thead>
          <tbody>
            <tr v-for="(item, index) in data" :key="index">
              <td v-for="column in columns" :key="column.field">{{ item[column.field] }}</td>
            </tr>
          </tbody>
        </table>
      `,
      components: {
        'TableColumn': TableColumn
      },
      computed: {
        columns () {
          // Extraer definiciones de columna de los componentes hijos
          return this.$slots.default.filter(column => column.componentOptions && column.componentOptions.tag === 'TableColumn').map(column => {
            return {
              field: column.componentOptions.propsData.field,
              label: column.componentOptions.propsData.label
            }
          })
        }
      }
    })
    

    Aquí, definimos la propiedad data, que será un arreglo de objetos que representan los datos que se mostrarán en la tabla. En la sección de plantilla, usamos la directiva v-for para iterar sobre los componentes hijos TableColumn y renderizar un encabezado para cada columna.

    También usamos la directiva v-forpara iterar sobre cada elemento en data y renderizar una fila para cada elemento. Dentro de cada fila, usamos nuevamente v-for para iterar sobre cada columna y renderizar el valor de los datos correspondientes.

    La sección computed contiene una propiedad columns, que extrae las definiciones de columna de los componentes hijos usando la propiedad $slots. Esto nos permite definir los encabezados de columna y los valores de datos en los componentes hijos, lo que hace que el componente Table sea muy flexible y reutilizable.

    1. Usa el componente Table en tu aplicación Vue pasando las propiedades data y los componentes hijos TableColumn:
    <table :data="data">
      <tablecolumn field="id" label="ID"></tablecolumn>
      <tablecolumn field="name" label="Name"></tablecolumn>
      <tablecolumn field="date_created" label="Created"></tablecolumn>
    </table>
    

    En este fragmento de código, definimos la variable data como un arreglo de objetos que representan los datos que se mostrarán en la tabla. Luego, usamos el componente <table> y pasamos la propiedad data, así como tres componentes hijos<tablecolumn>, cada uno con sus propiedades field y label definidas.

    La salida de este código sería una tabla con tres columnas (ID, Name y Created) y dos filas de datos. El componente Table es completamente reutilizable y personalizable, lo que te permite definir cualquier número de columnas y valores de datos en los componentes hijos.

Comments are closed.