In các phần tử với VueJS bằng thư viện của bên thứ 3


14

Tôi đang làm việc trên bảng HTML và in bảng đó sang máy in bằng html-to-papervue.js, Điều tôi đang làm là nhấp vào thêm tạo một hàng mới và sau đó nhấp vào in Tôi đang cố in bảng nhưng nó không lấy bất kỳ dữ liệu nào chỉ hiển thị các ô trống

Mã ứng dụng

    <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");

ở đây mã làm việc trong mã và hộp

Vui lòng kiểm tra mã đang chạy

Chỉnh sửa theo tiền thưởng

tôi phải làm điều đó với 'html-to-paper', vấn đề là tôi không thể tạo kiểu cho các thành phần của mình để in bằng cách sử dụng @media print

  • Câu trả lời ux.engineerlà tốt nhưng gây ra sự cố trình duyệt crome và firefox đang chặn nó do bảo mật ngay bây giờ

Vui lòng kiểm tra mã hộp cát ví dụ ở đây là mã đầy đủ của tôi, tôi đang cố gắng tạo kiểu nhưng không xảy ra

  • Các html-to-printcông dụng cắm window.open nên khi tôi nhấp vào in nó không được lấy phong cách trang mới.
  • Đó là nơi tôi bị mắc kẹt như tại sao nó không lấy phong cách truyền thông, làm thế nào tôi có thể ghi đè lên phong cách của mình trên window.open

Tôi đã sử dụng print-nb Nhưng nó không hoạt động trên trình duyệt vì một số lý do bảo mậtđây là những gì được nói trong khi sử dụng print-nb


manish thakur vui lòng kiểm tra câu trả lời mới của tôi (thời gian ân hạn kết thúc sau 4 giờ, khi đó nó sẽ bị lãng phí nếu không được trao giải)
ux.engineer

Câu trả lời:


9

Thật không may, bạn không thể tận dụng ràng buộc dữ liệu của Vue với gói mixin mycurelabs / vue-html-to-paper này , như đã nêu ở đây bởi tác giả gói .

Tuy nhiên, tôi đã tạo một cách giải quyết bằng cách chuyển gói được sử dụng ở đây sang chỉ thị Power-kxLee / vue-print-nb .

Đây là một ví dụ hoạt động: https://codesandbox.io/s/zen-sunset-2szqr

Tái bút Việc lựa chọn giữa các gói tương tự có thể đôi khi khó khăn. Mọi người nên đánh giá số liệu thống kê hoạt động và sử dụng của repo như: Được sử dụng bởi, Xem và Bắt đầu trên trang trước, sau đó kiểm tra các sự cố Mở / Đóng và Yêu cầu kéo hoạt động / Đóng, sau đó đi đến Thông tin chi tiết để kiểm tra Xung (1 tháng) và sau đó Mã tần số.

Giữa hai cái này, tôi sẽ chọn vue-print-nb để được phổ biến hơn và được sử dụng tích cực. Ngoài ra, vì tôi thích sử dụng một lệnh trên mixin .

Theo như câu trả lời khác, việc tiếp tục sử dụng vue-html-to-paper cho mục đích này sẽ cần loại giải pháp hacky đó ... Trường hợp lệnh này hoạt động vượt trội.

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

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


1
Tôi không biết các gói in này so sánh như thế nào, nhưng nếu chuyển đổi các gói thì tôi nghĩ đây là một giải pháp tốt hơn so với cách giải quyết của tôi với giữ chỗ.
arkuuu

@ ux.engineer vì tôi thấy Ý tưởng của bạn rất đơn giản và sạch sẽ, tôi có một nghi ngờ (vấn đề) ở đây khi tôi đang in bảng, nó đang in toàn bộ trang inputsbên trong không tốt, tôi muốn xóa đầu vào đó và là nó Giống như trường bình thường, tôi cũng có thể quản lý chiều cao, vì tôi đang sử dụng USB Printerkhông có tờ a4.
manish thakur

@manishthakur bạn có thể sử dụng kiểu CSS toàn cầu với bản in nhắm mục tiêu truy vấn phương tiện, đây là một ví dụ hoạt động: scriptsandbox.io/s/ecstatic-fire-zo2b2
ux.engineer

Ok nó đang hoạt động để tôi có thể xác định cs, vấn đề là ở đây giả sử có bốn hàng, nhưng máy in đang in đầy đủ máy in, tôi đang sử dụng máy in USB là người dùng để in hóa đơn, vui lòng xóa điều này cho tôi
manish thakur

@manishthakur làm thế nào về điều này: Codeandbox.io/s/charming-sound-7h1bg - sử dụng @pagequy tắc CSS ( developer.mozilla.org/en-US/docs/Web/CSS/@page ) như được giải thích ở đây stackoverflow.com/questions / 44064707 / Hoài
ux.engineer

6

Như những người khác đã đề cập, điều này là không thể đối với gói bạn sử dụng, vì dữ liệu bị ràng buộc từ v-modelkhông tồn tại khi in. Vì vậy, bạn cần lấy dữ liệu này một cách tĩnh trong html của bạn. Nguồn

Cách giải quyết sẽ là sử dụng trình giữ chỗ đầu vào:

Thêm một tham chiếu vào bảng của bạn:

<tbody ref="tablebody">

Điều này cho phép bạn chọn yếu tố này trong phương pháp của bạn. Bây giờ thay đổi phương thức in:

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

Sau đó, có thể định kiểu các trình giữ chỗ bằng css, vì mặc định nó có màu xám.

Trước tiên tôi đã cố gắng thiết lập lại giá trị của đầu vào bằng cách nào đó input.value = input.value, nhưng không may là nó không hoạt động.

Cập nhật mã của bạn ở đây


1
Một giải pháp thông minh, mặc dù bity hack. Nhưng dường như cần thiết nếu người ta muốn sử dụng mixin Vue đặc biệt này để in các giá trị động như thế này. Tuy nhiên tại thời điểm này tôi sẽ tìm kiếm các gói thay thế.
ux.engineer

@arkuuu Vui lòng kiểm tra phần chỉnh sửa của tôi bất cứ khi nào bạn sẽ được miễn phí.
manish thakur

@manishthakur Tôi đọc nó nhưng tôi không biết. Có lẽ bạn có thể bao gồm đặt quy tắc css in của mình vào một tệp css riêng và sử dụng stylestùy chọn vue-html-to-paper như bạn đã làm với các bảng định kiểu khác.
arkuuu

1
Tôi đã thử điều đó nhưng không có gì thay đổi, vẫn không có phong cách
manish thakur

0

Theo tiền thưởng mới của bạn cho câu hỏi, để sử dụng vue-html-to-paper, đây là một ví dụ mã được cập nhật để tải biểu định kiểu bên ngoài vào cửa sổ in .

Đầu tiên, nó tải các kiểu Bootstrap từ CDN bên ngoài, sau đó là tệp CSS cục bộ từ thư mục chung. Biểu định kiểu cục bộ này chỉ có một kiểu để sử dụng !importantghi đè cho màu nền đầu vào thành màu xanh lá cây.

Chrome trên Windows áp dụng kiểu nền màu xanh lá cây đó cho các đầu vào nếu đồ họa nền tùy chọn in được áp dụng. Firefox trên Windows có bảng tùy chọn in khác nhau, không có cài đặt như vậy.

Tuy nhiên, cả hai đều đang áp dụng các kiểu Bootstrap ít nhất một phần, do đó, các bảng định kiểu được tải và chơi.

Vấn đề kiểu nền đầu vào này là để chứng minh sự khác biệt trong cách trình duyệt xử lý các kiểu in và đó là một chủ đề rộng hơn ngoài phạm vi của câu hỏi này.

Tái bút Tôi không chắc loại vấn đề bảo mật nào xảy ra với vue-print-nbgói nhưng có lẽ nó có thể được giải quyết. Bạn nên mở một vấn đề trong repo Github của họ với một ví dụ tái tạo lỗi tối thiểu.

Thêm câu trả lời này dưới dạng một mục riêng nếu vue-print-nbvấn đề của giải pháp đó được giải quyết sau đó và câu trả lời của tôi được cập nhật.


Này, tôi đang kiểm tra xem nó không có phong cách hoàn hảo như tôi đang cố gắng loại bỏ input fields nhưng nó đang lấy tất cả chúng.
manish thakur

Không rõ bạn đang cố gắng áp dụng kiểu nào ... Như đã nói, các kiểu không được in theo cùng một kiểu so với trong trình duyệt, vì có những hạn chế. Và thậm chí những người khác nhau giữa các trình duyệt / nền tảng. Nhưng biểu định kiểu Bootstrap có được áp dụng không? Và ghi đè của tôi, vì vậy phong cách được tải?
ux.engineer

Không, tôi đang xóa các trường đầu vào nhưng nó không xóa, vì tôi muốn xóa trường đầu vào và hiển thị nó dưới dạng bảng cơ sở với một số kiểu mà tôi muốn đưa ra trên bản in, ví dụ như cỡ chữ và căn chỉnh nhưng nó không lấy, tôi đang ẩn một cột cũng có nhưng trên bản in nó đang lấy tất cả chúng
manish thakur

Hey Bạn có thể đoán vấn đề print-nblà gì vì đó là vấn đề tốt nhất để làm việc nhưng tôi không biết tại sao trình duyệt không cho phép css
manish thakur
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.