index.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import { defineComponent, nextTick, onMounted, reactive } from "vue";
  2. import state, { EnumMusicRenderType } from "/src/state";
  3. import MusicScore from "../../view/music-score";
  4. import styles from "./index.module.less";
  5. import { getQuery } from "/src/utils/queryString";
  6. import { closeToast, showLoadingToast } from "vant";
  7. import { svg2canvas } from "/src/utils/svg2canvas";
  8. export default defineComponent({
  9. name: "music-list",
  10. setup() {
  11. const query: any = getQuery();
  12. const productRenderType = "productRenderType"
  13. const detailData = reactive({
  14. isLoading: true,
  15. isProductLoading: false,
  16. step: 0,
  17. product: [
  18. {
  19. state: false,
  20. name: "五线谱",
  21. type: EnumMusicRenderType.staff,
  22. base64: "" as any,
  23. },
  24. {
  25. state: false,
  26. name: "首调",
  27. type: EnumMusicRenderType.firstTone,
  28. base64: "" as any,
  29. },
  30. {
  31. state: false,
  32. name: "固定调",
  33. type: EnumMusicRenderType.fixedTone,
  34. base64: "" as any,
  35. },
  36. ],
  37. });
  38. onMounted(() => {
  39. (window as any).appName = "colexiu";
  40. state.xmlUrl = query.xmlUrl;
  41. //课堂乐器,默认简谱
  42. sessionStorage.setItem(productRenderType, detailData.product[detailData.step].type);
  43. showLoadingToast({ message: "生成中", duration: 0 });
  44. setTimeout(() => {
  45. detailData.isLoading = false;
  46. }, 500);
  47. });
  48. /** 渲染完成 */
  49. const handleRendered = async () => {
  50. detailData.product[detailData.step].state = true;
  51. detailData.product[detailData.step].base64 = await downPng();
  52. try {
  53. console.log(JSON.parse(JSON.stringify(detailData.product)), detailData.step);
  54. } catch (error) {}
  55. detailData.step += 1;
  56. if (detailData.step !== detailData.product.length) {
  57. //课堂乐器,默认简谱
  58. sessionStorage.setItem(productRenderType, detailData.product[detailData.step].type);
  59. nextTick(() => {
  60. detailData.isLoading = true;
  61. setTimeout(() => {
  62. detailData.isLoading = false;
  63. }, 500);
  64. });
  65. return;
  66. }
  67. closeToast();
  68. console.log(detailData.product,123456);
  69. window.parent?.postMessage(
  70. {
  71. api: "webApi_renderSvg",
  72. product: JSON.stringify(detailData.product),
  73. },
  74. "*"
  75. );
  76. };
  77. const downPng = () => {
  78. return new Promise((resolve) => {
  79. setTimeout(async () => {
  80. try {
  81. const svg: any = document.getElementById("osmdSvgPage1")?.cloneNode(true);
  82. if (!svg) {
  83. resolve("");
  84. return;
  85. }
  86. const cw = svg.width.animVal.value;
  87. const ch = svg.height.animVal.value;
  88. const rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
  89. rect.setAttribute("x", "0");
  90. rect.setAttribute("y", "0");
  91. rect.setAttribute("width", `${cw * 2}`);
  92. rect.setAttribute("height", `${ch * 2}`);
  93. rect.setAttribute("fill", "#fff");
  94. svg.prepend(rect);
  95. const _canvas = svg2canvas(svg.outerHTML);
  96. const base64 = _canvas.toDataURL("image/png", 1);
  97. resolve(base64);
  98. } catch (error) {
  99. resolve("");
  100. }
  101. }, 500);
  102. });
  103. };
  104. return () => (
  105. <div class={styles.detail}>
  106. <div id="scrollContainer" class={[styles.container, "hideCursor"]}>
  107. {/* 曲谱渲染 */}
  108. {!detailData.isLoading && <MusicScore renderTypeKey={productRenderType} showSelection={false} isDownXml={true} onRendered={handleRendered} />}
  109. </div>
  110. </div>
  111. );
  112. },
  113. });