index.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <template>
  2. <div>
  3. <div style="height: 0px; overflow: hidden">
  4. <fileUpload v-if="showFileUpload" :multiple="true" :limit="10000" :uid="uid" @getFiles="getFiles" />
  5. </div>
  6. <quill-editor
  7. v-model="center"
  8. ref="myQuillEditor1"
  9. :options="options"
  10. @focus="onEditorFocus($event)"
  11. ></quill-editor>
  12. </div>
  13. </template>
  14. <script>
  15. const toolbarOptions = [
  16. ['bold', 'italic', 'underline', 'strike'],
  17. ['blockquote', 'code-block'],
  18. [{ header: 1 }, { header: 2 }],
  19. [{ list: 'ordered' }, { list: 'bullet' }],
  20. [{ script: 'sub' }, { script: 'super' }],
  21. [{ indent: '-1' }, { indent: '+1' }],
  22. [{ direction: 'rtl' }],
  23. [{ size: ['small', false, 'large', 'huge'] }],
  24. [{ header: [1, 2, 3, 4, 5, 6, false] }],
  25. [{ color: [] }, { background: [] }],
  26. [{ font: [] }],
  27. [{ align: [] }],
  28. ['link', 'image', 'video']
  29. ]
  30. import { quillEditor } from 'vue-quill-editor'
  31. import 'quill/dist/quill.core.css'
  32. import 'quill/dist/quill.snow.css'
  33. import 'quill/dist/quill.bubble.css'
  34. import fileUpload from '@/components/file-upload'
  35. import uploadFile from '@/utils/upload-file.js'
  36. export default {
  37. name: 'v-quill-editor',
  38. components: { quillEditor, fileUpload },
  39. props: {
  40. value: {
  41. type: [String, Number, Object, Array],
  42. default: ''
  43. },
  44. disabled: {
  45. type: Boolean,
  46. default: false
  47. }
  48. },
  49. data() {
  50. return {
  51. uid: `class_${Math.random().toFixed(6).slice(-6)}`,
  52. showFileUpload: true,
  53. editorImages: [],
  54. center: this.value,
  55. options: {
  56. placeholder: '请输入内容',
  57. theme: 'snow',
  58. modules: {
  59. toolbar: {
  60. container: toolbarOptions,
  61. handlers: {
  62. image: value => {
  63. if (value) {
  64. document.querySelector(`.${this.uid} input`).click()
  65. }
  66. }
  67. }
  68. },
  69. clipboard: {}
  70. }
  71. }
  72. }
  73. },
  74. watch: {
  75. value() {
  76. this.center = this.value
  77. },
  78. center() {
  79. this.$emit('input', this.center)
  80. }
  81. },
  82. mounted() {
  83. // 自定义粘贴图片功能
  84. let quill = this.$refs.myQuillEditor1.quill
  85. quill.root.addEventListener(
  86. 'paste',
  87. evt => {
  88. if (evt.clipboardData && evt.clipboardData.files && evt.clipboardData.files.length) {
  89. evt.preventDefault()
  90. ;[].forEach.call(evt.clipboardData.files, file => {
  91. if (!file.type.match(/^image\/(gif|jpe?g|a?png|bmp)/i)) {
  92. return
  93. }
  94. uploadFile(file, data => {
  95. let length = quill.getSelection().index
  96. quill.insertEmbed(length, 'image', this.$imageUrl + data.aliyunAddress)
  97. quill.setSelection(length + 1)
  98. })
  99. })
  100. }
  101. },
  102. false
  103. )
  104. },
  105. methods: {
  106. getFiles(fileList) {
  107. fileList.forEach(item => {
  108. this.editorImages.push(item.url)
  109. })
  110. this.showFileUpload = false
  111. this.$nextTick(() => {
  112. this.showFileUpload = true
  113. })
  114. this.showImage1()
  115. },
  116. showImage1() {
  117. let quill = this.$refs.myQuillEditor1.quill
  118. this.editorImages.forEach(item => {
  119. let length = quill.getSelection().index
  120. quill.insertEmbed(length, 'image', item)
  121. quill.setSelection(length + 1)
  122. })
  123. this.editorImages = []
  124. },
  125. onEditorFocus(event) {
  126. if (this.disabled) {
  127. event.enable(false)
  128. }
  129. event.enable(true)
  130. }
  131. }
  132. }
  133. </script>
  134. <style lang="scss" scoped>
  135. ::v-deep .edit_container {
  136. font-family: 'Avenir', Helvetica, Arial, sans-serif;
  137. -webkit-font-smoothing: antialiased;
  138. -moz-osx-font-smoothing: grayscale;
  139. text-align: center;
  140. color: #2c3e50;
  141. margin-top: 60px;
  142. }
  143. ::v-deep .ql-editor {
  144. height: 400px;
  145. }
  146. </style>