AgreementEditor.vue 1.4 KB

1234567891011121314151617181920212223242526272829303132333435
  1. <template>
  2. <div class="agreement-editor">
  3. <Toolbar :editor="editorRef" :default-config="toolbarConfig" mode="default" />
  4. <Editor
  5. :model-value="modelValue"
  6. :default-config="editorConfig"
  7. mode="default"
  8. @update:model-value="value => emit('update:modelValue', value)"
  9. @on-created="onCreated"
  10. />
  11. </div>
  12. </template>
  13. <script setup>
  14. import '@wangeditor/editor/dist/css/style.css'
  15. import { onBeforeUnmount, shallowRef } from 'vue'
  16. import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
  17. defineProps({ modelValue: { type: String, default: '' } })
  18. const emit = defineEmits(['update:modelValue'])
  19. const editorRef = shallowRef()
  20. // 协议仅开放排版和链接;服务端使用同范围白名单清洗,禁用媒体与任意 HTML。
  21. const toolbarConfig = {
  22. toolbarKeys: ['headerSelect', 'bold', 'italic', 'underline', 'through', '|', 'bulletedList', 'numberedList', 'blockquote', 'insertLink', '|', 'undo', 'redo']
  23. }
  24. const editorConfig = { placeholder: '请输入协议正文', maxLength: 50000 }
  25. function onCreated(editor) { editorRef.value = editor }
  26. onBeforeUnmount(() => editorRef.value?.destroy())
  27. </script>
  28. <style scoped>
  29. .agreement-editor { border: 1px solid #d9d9d9; border-radius: 6px; overflow: hidden; }
  30. .agreement-editor :deep(.w-e-toolbar) { border-bottom: 1px solid #d9d9d9; }
  31. .agreement-editor :deep(.w-e-text-container) { height: 520px !important; }
  32. </style>