[javascript] 타사 라이브러리를 사용하여 VueJS로 요소 인쇄

HTML 테이블 작업을 html-to-paper하고 vue.js에서 프린터로 테이블을 인쇄하고 있습니다. 추가 행을 추가하고 새 행을 만든 다음 인쇄를 클릭하면 테이블을 인쇄하려고하지만 테이블을 인쇄하지 않습니다. 빈 셀만 표시하는 모든 데이터

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

여기 codesandbox의 작업 코드

실행중인 코드를 확인하십시오

현상금에 따라 편집

나는 ‘html-to-paper’와 함께해야합니다. 문제는 사용하여 인쇄하기 위해 요소에 스타일을 부여 할 수 없다는 것입니다 @media print

  • 대답 ux.engineer은 괜찮지 만 브라우저 문제를 일으키는 크롬 및 파이어 폭스는 보안 문제로 인해 차단합니다.

예를 들어 코드 샌드 박스확인 하십시오. 여기에는 전체 코드가 있습니다. 스타일을 지정하려고하지만 일어나지 않습니다.

  • html-to-print나는 그것이 새로운 페이지에 스타일을 복용하지 않는 인쇄를 클릭하고 때 플러그인 사용은 그래서는 window.open.
  • 그것이 미디어 스타일을 취하지 않는 이유에 갇혀있는 곳입니다. 창에서 내 스타일을 재정의하는 방법은 무엇입니까?

print-nb를 사용 하고 있었지만 보안상의 이유로 브라우저에서 작동하지 않습니다.이것은 print-nb를 사용하는 동안 말하는 것입니다.



답변

불행하게도이 바인딩 뷰의 데이터를 활용 할 수 mycurelabs / VUE – HTML – 투 – 종이 믹스 인 패키지 , 패키지 작성자가 여기에 명시된 바와 같이 .

그러나 여기에 사용 된 패키지를 Power-kxLee / vue-print-nb 지시문 으로 전환하여 해결 방법을 만들었습니다 .

실제 예는 다음과 같습니다. https://codesandbox.io/s/zen-sunset-2szqr

추신. 비슷한 패키지 중에서 선택하는 것은 때때로 까다로울 수 있습니다. 첫 페이지에서 사용한,보기 및 시작과 같은 리포지토리의 사용 및 활동 통계를 평가 한 다음 열기 / 닫힌 문제 및 활성 / 닫힌 풀 요청을 확인한 다음 통계로 이동하여 펄스 (1 개월)를 확인해야합니다. 코드 주파수.

이 두 가지 사이에서, 나는 더 대중적이고 적극적으로 사용되기 위해 vue-print-nb 를 선택합니다 . 또한 mixin보다 지시문을 선호 하기 때문에 .

다른 대답으로는, vue-html-to-paper를이 목적으로 사용하려면 이런 종류의 해키 솔루션이 필요할 것입니다.

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

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


답변

다른 사람들이 언급했듯이, v-model인쇄 할 때 바인딩 된 데이터가 없기 때문에 사용하는 패키지로 는 불가능합니다. 따라서이 데이터를 HTML 안에 정적으로 가져와야합니다. 출처

해결 방법은 입력 자리 표시자를 사용하는 것입니다.

테이블에 대한 참조 를 추가하십시오 .

<tbody ref="tablebody">

이를 통해 분석법에서이 요소를 선택할 수 있습니다. 이제 인쇄 방법을 변경하십시오.

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

그런 다음 기본적으로 회색으로 보이기 때문에 자리 표시자를 CSS로 스타일을 지정할 수 있습니다.

먼저 와 같이 입력 값을 재설정 하려고 input.value = input.value했지만 불행히도 작동하지 않았습니다.

여기에 코드를 업데이트


답변

질문에 대한 새로운 현상금에 따라를 사용 하기 위해 외부 스타일 시트를 인쇄 창에로드vue-html-to-paper 하는 업데이트 된 코드 예제가 있습니다 .

먼저 외부 CDN에서 Bootstrap 스타일을로드 한 다음 공용 디렉토리에서 로컬 CSS 파일을로드합니다. 이 로컬 스타일 시트에는 !important입력 배경색 대체를 녹색으로 대체하기 위한 스타일이 하나만 있습니다.

인쇄 옵션 배경 그래픽 이 적용된 경우 Windows의 Chrome은 녹색 배경 스타일을 입력 에 적용합니다. Windows의 Firefox에는 다른 인쇄 옵션 패널이 있으며 이러한 설정은 없습니다.

그러나 둘 다 부트 스트랩 스타일을 적어도 부분적으로 적용하므로 스타일 시트가로드되어 재생 중입니다.

이 입력 배경 스타일 문제는 브라우저가 인쇄 스타일을 처리하는 방법의 차이점을 보여주기위한 것이며이 질문의 범위를 벗어난 광범위한 주제입니다.

추신. vue-print-nb패키지에 어떤 종류의 보안 문제가 있는지 확실하지 않지만 해결 될 수 있습니다. 최소한의 버그 재현 예제로 Github 저장소에서 문제를 열어야합니다.

해당 vue-print-nb솔루션의 문제가 나중에 해결되고 내 답변이 업데이트 되는 경우이 답변을 별도의 항목으로 추가하십시오 .


답변