Stampa di elementi con VueJS utilizzando librerie di terze parti


14

Sto lavorando su una tabella HTML e stampando quella tabella su una stampante usando html-to-paperin vue.js, quello che sto facendo è fare clic su aggiungi creando una nuova riga e quindi su clic su stampa Sto provando a stampare la tabella ma non ci sto prendendo tutti i dati che mostrano solo celle vuote

Codice App.vue

    <template>
  <div id="app">
    <button type="button" @click="btnOnClick">Add</button>

    <div id="printMe">
      <table class="table table-striped table-hover table-bordered mainTable" id="Table">
    <thead>
      <tr>

        <th class="itemName">Item Name</th>
        <th>Quantity</th>
        <th>Selling Price</th>
        <th>Amount</th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="(tableData, k) in tableDatas" :key="k">

        <td>
          <input class="form-control" readonly v-model="tableData.itemname" />
        </td>
        <td>
          <input class="form-control text-right" type="text" min="0" step=".01" v-model="tableData.quantity" v-on:keyup="calculateQty(tableData)" />
        </td>
        <td>
          <input class="form-control text-right" type="text" min="0" step=".01" v-model="tableData.sellingprice" v-on:keyup="calculateSPrice(tableData)" />
        </td>
        <td>
          <input readonly class="form-control text-right" type="text" min="0" step=".01" v-model="tableData.amount" />
        </td>
      </tr>
    </tbody>
  </table>
    </div>
    <button @click="print">Print</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableDatas: []
    }

  },
  methods: {
    btnOnClick(v) {
      this.tableDatas.push({
        itemname: "item",
        quantity: 1,
        sellingprice: 55,
        amount: 55
      });
    },
     print() {
      this.$htmlToPaper('printMe');
    }
  }
};
</script>

<style>
</style>

main.js

 import Vue from "vue";
import App from "./App.vue";
import VueHtmlToPaper from "vue-html-to-paper";

Vue.config.productionTip = false;
Vue.use(VueHtmlToPaper);

new Vue({
  render: h => h(App)
}).$mount("#app");

qui il codice di lavoro in codesandbox

Si prega di controllare il codice in esecuzione

Modifica secondo la taglia

devo farlo con 'html-to-paper' il problema è che non sono in grado di dare stile ai miei elementi per la stampa usando @media print

  • La risposta ux.engineerè buona ma causando problemi con il browser crome e firefox lo stanno bloccando a causa di problemi di sicurezza

Si prega di controllare sandbox del codice, ad esempio qui è il mio codice completo, sto cercando di dare stile ma non succede

  • Il html-to-printplugin utilizza window.open, quindi quando faccio clic su Stampa non porta lo stile in una nuova pagina.
  • È qui che sono bloccato perché non prende stile multimediale, come posso ignorare il mio stile su window.open

Stavo usando print-nb Ma non funziona sul browser per motivi di sicurezzaquesto è ciò che viene detto durante l'utilizzo di print-nb


Mank Thakur, per favore, controlla la mia nuova risposta (il periodo di grazia generosa termina in 4 ore, su cui andrà sprecato se non assegnato)
ux.engineer

Risposte:


9

Sfortunatamente non è possibile sfruttare l'associazione dei dati di Vue con questo pacchetto di mixin mycurelabs / vue-html-to-paper , come indicato qui dall'autore del pacchetto .

Tuttavia, ho creato una soluzione alternativa cambiando il pacchetto utilizzato qui nella direttiva Power-kxLee / vue-print-nb .

Ecco un esempio funzionante: https://codesandbox.io/s/zen-sunset-2szqr

PS. La scelta tra pacchetti simili può essere a volte complicata. Si dovrebbero valutare le statistiche di utilizzo e attività del repository come: Usato da, Guarda e Avvia sulla prima pagina, quindi selezionare Problemi di apertura / chiusura e Richieste di pull attive / chiuse, quindi andare su Approfondimenti per controllare Pulse (1 mese), e Frequenza del codice.

Tra questi due, sceglierei vue-print-nb per essere più popolare e usato attivamente. Anche perché preferirei usare una direttiva su un mixin .

Per quanto riguarda l'altra risposta, continuare a usare vue-html-to-paper per questo scopo avrebbe bisogno di quel tipo di soluzione caotica ... Dove questa direttiva funziona immediatamente.

https://github.com/mycurelabs/vue-html-to-paper

https://github.com/Power-kxLee/vue-print-nb


1
Non so come confrontare questi pacchetti di stampa, ma se va bene cambiare pacchetto penso che questa sia una soluzione migliore della mia soluzione alternativa con i segnaposto.
Arkuuu,

@ ux.engineer come ho trovato la tua idea molto semplice e pulita, ho un dubbio (problema) qui quando sto stampando il tavolo sta stampando la pagina intera con inputsall'interno che non è buono, voglio rimuovere quell'input ed essere come il campo normale, posso anche gestire l'altezza, perché sto usando USB Printerche non ha fogli A4.
manish thakur

@manishthakur puoi usare lo stile CSS globale con la stampa di targeting per media query, ecco un esempio funzionante: codesandbox.io/s/ecstatic-fire-zo2b2
ux.engineer

Ok funziona quindi posso definire il cs, il problema è qui supponiamo che ci siano quattro righe, ma la stampante sta stampando a tutta lunghezza, sto usando una stampante USB che è utente per stampare le fatture, per favore deselezionami
manish thakur

@manishthakur che ne dici di questo: codesandbox.io/s/charming-sound-7h1bg - usando la @pageregola CSS ( developer.mozilla.org/en-US/docs/Web/CSS/@page ) come spiegato qui stackoverflow.com/questions / 44064707 /…
ux.engineer

6

Come altri hanno già detto, questo non è possibile con il pacchetto utilizzato, poiché i dati associati da v-modelnon esistono durante la stampa. Quindi è necessario ottenere questi dati staticamente all'interno del tuo HTML. fonte

Una soluzione alternativa sarebbe utilizzare i segnaposto di input:

Aggiungi un riferimento alla tua tabella:

<tbody ref="tablebody">

Ciò ti consente di selezionare questo elemento nel tuo metodo. Ora cambia il metodo di stampa:

print() {
  const inputs = this.$refs.tablebody.getElementsByTagName("input");
  for (let input of inputs) {
    input.placeholder = input.value;
  }
  this.$htmlToPaper("printMe");
  for (let input of inputs) {
    input.placeholder = "";
  }
}

Quindi forse dai uno stile ai segnaposto con CSS, perché di default sembra grigio.

Prima ho provato a ripristinare in qualche modo il valore dell'input, come input.value = input.value, ma purtroppo non ha funzionato.

Aggiornato il tuo codice qui


1
Una soluzione intelligente, anche se un po 'confusa. Ma sembra necessario se si desidera attenersi all'uso di questo particolare mixin Vue per stampare valori dinamici come questo. Comunque a questo punto cercherò pacchetti alternativi.
ingegnere ux il

@arkuuu Controlla la mia parte di modifica ogni volta che sarai libero.
Manish Thakur

@manishthakur L'ho letto ma non ne ho idea. Forse potresti includere mettere le tue regole css di stampa in un file css separato e usare l' stylesopzione di vue-html-to-paper come hai fatto con gli altri fogli di stile.
Arkuuu,

1
Ci ho provato, ma non è cambiato nulla, tuttavia non ci
vogliono

0

Come per la tua nuova ricompensa sulla domanda, per attenersi all'utilizzo vue-html-to-paper, ecco un esempio di codice aggiornato per il caricamento del foglio di stile esterno nella finestra di stampa .

Prima carica gli stili Bootstrap da una CDN esterna, quindi un file CSS locale dalla directory pubblica. Questo foglio di stile locale ha solo uno stile per usare l' !importantoverride per inserire il colore di sfondo in verde.

Chrome su Windows applica lo stile di sfondo verde agli input se viene applicata la grafica di sfondo dell'opzione di stampa . Firefox su Windows ha un pannello di opzioni di stampa diverso, che non ha tale impostazione.

Eppure entrambi applicano gli stili Bootstrap almeno in parte, quindi i fogli di stile sono caricati e in gioco.

Questo problema relativo allo stile di input di sfondo doveva dimostrare le differenze nel modo in cui i browser gestiscono gli stili di stampa ed è un argomento più ampio al di fuori dell'ambito di questa domanda.

PS. Non sono sicuro del tipo di problema di sicurezza con il vue-print-nbpacchetto, ma forse potrebbe essere risolto. Dovresti aprire un problema nel loro repository Github con un esempio minimo di riproduzione di bug.

Aggiungendo questa risposta come voce separata se vue-print-nbil problema di quella soluzione viene risolto in seguito e la mia risposta viene aggiornata.


Ehi, sto verificando che non sta prendendo gli stili perfettamente come sto cercando di rimuovere, input fields ma li sta prendendo tutti.
Manish Thakur

Non è chiaro quali stili stai cercando di applicare ... Come detto, gli stili non vengono stampati nello stesso modo che nel browser, poiché ci sono restrizioni. E anche quelli variano tra i browser / piattaforme. Ma il foglio di stile Bootstrap viene applicato , no? E la mia sostituzione, quindi gli stili vengono caricati?
ingegnere ux il

No, sto rimuovendo i campi di input ma non lo sto rimuovendo, in quanto desidero rimuovere il campo di input e mostrarlo come tabella basich con uno stile che desidero dare sulla stampa, ad es. Dimensione del carattere e allineamento, ma che non accetta, mi nascondo una colonna anche ma sulla stampa li sta prendendo tutti
Thakur virile

Ehi Riesci a indovinare qual è il problema con print-nbquello che è il migliore con cui lavorare ma non so perché il browser non consente css
manish thakur
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.