3. parti kitaplıkları kullanarak VueJS ile öğeleri yazdırma


14

HTML tablo üzerinde çalışıyorum ve html-to-papervue.js kullanarak yazıcıya bu tablo yazdırıyorum, Yaptığım şey yeni bir satır oluşturma eklemek tıklayın ve daha sonra baskı tıklayın ben masaya yazdırmaya çalışıyorum ama almıyor yalnızca boş hücreleri gösteren veriler

Kod Uygulama.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");

Burada codeandbox'taki çalışma kodu

Lütfen çalışan kodu kontrol edin

Ödül başına düzenleme

'html-to-paper' ile yapmak zorundayım sorunu kullanarak baskı için benim öğeleri stil veremiyorum @media print

  • Tarafından cevap ux.engineeriyi ama tarayıcı sorunu crome ve firefox neden güvenlik sorunu nedeniyle engelliyor

Lütfen kod sandbox kontrol edin örneğin burada benim tam kod, ben stil vermek için çalışıyorum ama değil

  • html-to-printBen yeni sayfaya stil almıyor baskı tıklayarak am zaman eklentisi kullanır böylece window.open.
  • Medya tarzı almadığı için sıkıştığım yer, penceremdeki stilimi nasıl geçersiz kılabilirim.

Print-nb kullanıyordum ama bazı güvenlik nedenlerinden dolayı tarayıcıda çalışmıyorprint-nb kullanırken söylenen budur


manish thakur lütfen yeni cevabımı kontrol edin (ödül ödemesiz dönem 4 saat içinde biter, üzerine ödül verilmezse boşa gidecektir)
ux.engineer

Yanıtlar:


9

Ne yazık ki bu konuda bağlayıcı Vue 'verilerini kaldıraç olamaz mycurelabs / vue-html ila kağıt mixin paketinde , paket yazar tarafından burada belirtildiği gibi .

Ancak, burada kullanılan paketi Power-kxLee / vue-print-nb yönergesine geçirerek geçici bir çözüm oluşturdum .

İşte çalışan bir örnek: https://codesandbox.io/s/zen-sunset-2szqr

PS. Benzer paketler arasında seçim yapmak bazen zor olabilir. Repo'nun kullanım ve etkinlik istatistiklerini şu şekilde değerlendirmelisiniz: Ön sayfada kullanılan, İzle ve Başlatma, ardından Açık / Kapalı sorunları ve Etkin / Kapalı Çekme İsteklerini kontrol edin ve ardından Nabzı (1 ay) kontrol etmek için Analizler'e gidin ve Kod Frekansı.

Bu ikisi arasında, daha popüler ve aktif olarak kullanılmaları için vue-print-nb'yi seçerdim . Ayrıca bir mixin yerine bir direktif kullanmayı tercih ediyorum .

Diğer cevaplara gelince, bu amaçla vue-html-to-paper kullanmaya devam etmek için bu tür çılgın bir çözüm gerekiyordu ... Bu direktifin kullanıma hazır olduğu yerde.

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

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


1
Bu baskı paketlerinin nasıl karşılaştırıldığını bilmiyorum, ancak paketleri değiştirmek uygunsa bunun yer tutucularla olan geçici çözümümden daha iyi bir çözüm olduğunu düşünüyorum.
arkuuu

@ ux.engineer Fikrinizi çok basit ve temiz bulduğumdan, burada bir şüphe (sorun) yazarken, tabloyu yazdırırken tam sayfa ile yazdırıyor inputs, iyi olmayan, bu girişi kaldırmak ve olmak istiyorum normal alan gibi, yüksekliği yönetebilirim, çünkü USB Printera4 sayfası olmayan kullanıyorum .
manish thakur

@manishthakur, medya sorgusu hedefleme baskısı ile küresel CSS stilini kullanabilirsiniz, işte çalışan bir örnek: codesandbox.io/s/ecstatic-fire-zo2b2
ux.engineer

Tamam çalışıyor bu yüzden cs tanımlayabilirsiniz, sorun burada dört satır var varsayalım, ancak yazıcı tam uzun yazıcı yazdırıyor, faturaları yazdırmak için kullanıcı olan USB yazıcı kullanıyorum, lütfen bana bu şeyi temizle
manish thakur

@manishthakur buna ne dersiniz: codesandbox.io/s/charming-sound-7h1bg - burada açıklandığı gibi @pageCSS kuralını ( developer.mozilla.org/en-US/docs/Web/CSS/@page ) kullanma stackoverflow.com/questions / 44064707 /…
ux.engineer

6

Diğerlerinin de belirttiği gibi, kullandığınız paketle bu mümkün değildir, çünkü v-modelyazdırma sırasında bağlı veriler mevcut değildir. Bu nedenle bu verileri statik olarak html'niz içine almanız gerekir. Kaynak

Geçici çözüm girdi yer tutucularını kullanmak olacaktır:

Tablonuza bir referans ekleyin :

<tbody ref="tablebody">

Bu, yönteminizde bu öğeyi seçmenizi sağlar. Şimdi yazdırma yöntemini değiştirin:

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 = "";
  }
}

Sonra varsayılan olarak gri görünüyor çünkü yer tutucuları css ile stil.

İlk olarak bir şekilde girişin değerini sıfırlamaya çalıştım input.value = input.value, ama maalesef bu işe yaramadı.

Kodunuzu burada güncelleyin


1
Akıllı bir çözüm, her ne kadar biraz hileli. Ancak, bu gibi dinamik değerleri yazdırmak için bu özel Vue karışımını kullanmaya devam etmek istiyorsa, gerekli gibi görünüyor. Ancak bu noktada alternatif paketler ararım.
ux.engineer

@arkuuu Lütfen ne zaman özgür olursanız düzenleme bölümümü kontrol edin.
manish thakur

@manishthakur Okudum ama hiçbir fikrim yok. Belki yazdırma css kurallarınızı ayrı bir css dosyasına koyabilir stylesve diğer stil sayfalarında yaptığınız gibi vue-html-to-paper seçeneğini kullanabilirsiniz .
arkuuu

1
Bunu denedim ama hiçbir şey değişmedi, yine de stil almıyor
manish thakur

0

Sorudaki yeni ödülünüze göre, kullanmaya devam etmek için vue-html-to-paper, harici pencere stil sayfasını yazdırma penceresine yüklemek için güncellenmiş bir kod örneği .

Önce Bootstrap stillerini harici bir CDN'den, ardından genel dizinden bir yerel CSS dosyası yükler. Bu yerel stil sayfasında, !importantgiriş arka plan renginin yeşile geçersiz kılınması için yalnızca bir stil bulunur .

Windows'ta Chrome, yazdırma seçeneği arka plan grafikleri uygulanırsa girişlere yeşil arka plan stilini uygular . Windows'taki Firefox'ta böyle bir ayar bulunmayan farklı bir yazdırma seçenekleri paneli vardır.

Yine de her ikisi de en azından kısmen Bootstrap stilleri uyguluyor, bu yüzden stil sayfaları yüklü ve oyunda.

Bu giriş arka plan stili sorunu, tarayıcıların yazdırma stillerini nasıl ele aldıkları konusunda farklılıklar göstermekti ve bu sorunun kapsamı dışında daha geniş bir konu.

PS. vue-print-nbPaketi ile ne tür bir güvenlik sorunu vardı emin değilim ama belki çözülebilir. Github deposunda bir sorunu en az hata üretme örneğiyle açmalısınız.

Bu sorunun vue-print-nbsorunu daha sonra çözülürse ve cevabım güncellenirse bu yanıtı ayrı bir giriş olarak eklemek .


Hey, kaldırmaya çalıştığım gibi stilleri mükemmel bir şekilde almadığını kontrol ediyorum, input fields ancak hepsini alıyor.
manish thakur

Hangi stilleri uygulamaya çalıştığınız belli değil ... Dediğim gibi, stiller tarayıcıda olduğu gibi yazdırılmıyor, kısıtlamalar var. Ve bunlar bile tarayıcılar / platformlar arasında değişir. Ancak Bootstrap stil sayfası uygulanır , değil mi? Ve geçersiz kılmam, böylece stiller yüklenir mi?
ux.engineer

Hayır, giriş alanlarını kaldırıyorum ama giriş alanını kaldırmak ve baski tablo olarak yazdırmak istediğim bir yazı tipi yani yazı tipi boyutu ve hizalama ile göstermek gibi, kaldırmıyorum ama saklamıyorum bir sütun da var ama baskıda hepsini alıyor
manish thakur

Hey sorunun ne olduğunu tahmin edebilir misin print-nb Çalışmak için en iyi olanı ama tarayıcı neden css izin vermiyor bilmiyorum
manish thakur
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.