demoBlock.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <template>
  2. <div class="online-code" ref="onlineCode">
  3. <slot></slot>
  4. <div class="online-part">
  5. <a class="list" :href="jumpHref1" target="_blank">
  6. <img
  7. class="online-icon"
  8. src="https://img13.360buyimg.com/imagetools/jfs/t1/125518/28/24027/2723/6204ae85E8bf8b7e9/af2d55aabeb6bbb6.png"
  9. />
  10. <div class="online-tips">codesandbox</div>
  11. </a>
  12. <a class="list" :href="jumpHref" target="_blank">
  13. <img
  14. class="online-icon"
  15. src="https://img12.360buyimg.com/imagetools/jfs/t1/214225/34/8715/7002/61c31bf1E69324ee9/7a452063eba88be4.png"
  16. />
  17. <div class="online-tips">在线调试</div>
  18. </a>
  19. <div class="list" @click="copyCode">
  20. <img
  21. class="online-icon"
  22. src="https://img10.360buyimg.com/imagetools/jfs/t1/142615/10/25537/3671/61c31e6eE3ba7fb90/d1953e2b47e40e86.png"
  23. />
  24. <div class="online-tips">复制代码</div>
  25. </div>
  26. </div>
  27. </div>
  28. </template>
  29. <script>
  30. import { ref, getCurrentInstance, onMounted, computed } from 'vue';
  31. import { compressText, copyCodeHtml, decompressText } from './basedUtil';
  32. import { getParameters } from 'codesandbox/lib/api/define';
  33. import codesandboxPackage from './demoCodePackage.json'; // 引入josn文件
  34. export default {
  35. setup(props, ctx) {
  36. const sourceMainReactJsStr = `//import VConsole from "vconsole";
  37. //var vConsole = new VConsole();
  38. import React from "react";
  39. import ReactDOM from "react-dom";
  40. import '@nutui/nutui-react/dist/style.css'
  41. import App from "./app.jsx";
  42. import "./app.scss";
  43. ReactDOM.render(
  44. <App/>,
  45. document.getElementById("app")
  46. );`;
  47. const sourceMainJsStr = `//import VConsole from "vconsole";
  48. //var vConsole = new VConsole();
  49. import { createApp } from "vue";
  50. import App from "./app.vue";
  51. import NutUI from "@nutui/nutui";
  52. import "./app.scss";
  53. import "@nutui/nutui/dist/style.css";
  54. createApp(App).use(NutUI).mount("#app");`;
  55. const MainJsStr = `import { createApp } from "vue";
  56. import App from "./App.vue";
  57. import NutUI from "@nutui/nutui";
  58. import "@nutui/nutui/dist/style.css";
  59. createApp(App).use(NutUI).mount("#app");`;
  60. const onlineCode = ref(null);
  61. const sourceMainJs = compressText(sourceMainJsStr);
  62. const mainJs = ref(sourceMainJs);
  63. const sourceMainReactJs = compressText(sourceMainReactJsStr);
  64. const mainReactJs = ref(sourceMainReactJs);
  65. const jumpHref = ref(``);
  66. const jumpHref1 = ref(``);
  67. onMounted(() => {
  68. console.log('codesandboxPackage', codesandboxPackage);
  69. console.log('onlineCode', onlineCode.value.dataset);
  70. const sourceValue = decompressText(onlineCode.value.dataset.value);
  71. console.log('sourceValue', sourceValue);
  72. const parameters = getParameters({
  73. files: {
  74. 'package.json': {
  75. content: codesandboxPackage
  76. },
  77. 'src/main.js': {
  78. content: MainJsStr
  79. },
  80. 'src/App.vue': {
  81. content: sourceValue
  82. }
  83. }
  84. });
  85. if (onlineCode.value.dataset.type === 'react') {
  86. jumpHref.value = `https://codehouse.jd.com/?source=share&type=react&mainJs=${mainReactJs.value}&appValue=${onlineCode.value.dataset.value}&scssValue=`;
  87. } else {
  88. jumpHref1.value = `https://codesandbox.io/api/v1/sandboxes/define?parameters=${parameters}`;
  89. jumpHref.value = `https://codehouse.jd.com/?source=share&type=vue&mainJs=${mainJs.value}&appValue=${onlineCode.value.dataset.value}&scssValue=`;
  90. }
  91. });
  92. const copyCode = () => {
  93. const sourceValue = decompressText(onlineCode.value.dataset.value);
  94. copyCodeHtml(sourceValue, () => {
  95. alert('复制成功');
  96. });
  97. };
  98. return {
  99. jumpHref,
  100. jumpHref1,
  101. onlineCode,
  102. copyCode
  103. };
  104. }
  105. };
  106. </script>