javascript - Cómo obtener un botón cargar más para una lista li vue js

CorePress2024-01-25  9

Estoy intentando implementar un botón para cargar más en mi código. Podría hacer esto en javascript pero no puedo encontrar una forma similar en vue. Este es mi código de vue. Intenté preguntarle al elemento con la identificación de la empresa, pero no es reactivo, por lo que no puedo simplemente cambiar el estilo.

<main>

    <ul>
      <li v-for="company in companiesdb" :key="company.id" v-bind:id="company.id"  ref="{{company.id}}" style="display: none">
        {{company.name}}<br>
        {{company.email}}
      </li>

    </ul>

</main>

Este es mi intento fallido de hacerlo en javascript, pero como mencioné antes, ref no es reactivo, así que no puedo hacerlo de esta manera

limitView: function (){
   const step = 3;
   do{
     this.numberCompaniesVis ++;
     let li = this.$refs[this.numberCompaniesVis];
     li.style = "display: block";
   }while (this.numberCompaniesVis % 3 != step)
}


------------------------------------

Simplemente use la propiedad calculada para crear un subconjunto de la matriz principal...

const vm = new Vue({
  el: '#app',
  data() {
    return { 
      companies: [
        { id: 1, name: "Company A" },
        { id: 2, name: "Company B" },
        { id: 3, name: "Company C" },
        { id: 4, name: "Company D" },
        { id: 5, name: "Company E" },
        { id: 6, name: "Company F" },
        { id: 7, name: "Company G" },
        { id: 8, name: "Company H" },
        { id: 9, name: "Company I" },
        { id: 10, name: "Company J" },
      ],
      companiesVisible: 3,
      step: 3,
    }
  },
  computed: {
    visibleCompanies() {
      return this.companies.slice(0, this.companiesVisible)
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <ul>
    <li v-for="company in visibleCompanies" :key="company.id" :id="company.id">
      {{company.name}}
    </li>
  </ul>
  <button @click="companiesVisible += step" v-if="companiesVisible < companies.length">Load more...</button>
</div>

Respondido

28 de marzo de 2021 a las 13:12

Mijal Levý

Mijal Levý

34,8k

7

7 insignias de oro

72

72 insignias de plata

88

88 bronce insignias



------------------------------------

Creo que la forma en que aborda este problema es un poco compleja. En su lugar, puede crear una variable calculada que cambiará el número de listas mostradas.

Aquí está el código

<template>
  <div id="app">
    <ul>
      <li v-for="(company, index) in companiesLoaded" :key="index">
        {{ company }}
      </li>
    </ul>
    <button @click="loadMore">Load</button>
  </div>
</template>

<script>
export default {
  name: "App",
  data() {
    return {
      companiesdb: [3, 4, 1, 4, 1, 2, 4, 4, 1],
      length: 5,
    };
  },
  methods: {
    loadMore() {
      if (this.length > this.companiesdb.length) return;
      this.length = this.length + 3;
    },
  },
  computed: {
    companiesLoaded() {
      return this.companiesdb.slice(0, this.length);
    },
  },
};
</script>

Entonces, en lugar de cargar la lista desde CompaniesDB, cree una función calculada queDevolveremos la nueva matriz basada en la variable CompaniesDB. Luego está la función loadMore que se ejecutará cada vez que el usuario haga clic en el botón. Esta función aumentará la longitud inicial, por lo que se mostrarán más listas.

Aquí está el ejemplo en vivo

1

Me sorprende lo fácil que fue. Gracias, me has ahorrado mucho tiempo.

- volver a cerrar

28/03/2021 a las 13:14

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare