preface
Forum posts have editor requirements, note the introduction and use of rich text editors
vue-quill-editor
Quill-based rich text editor for Vue, supporting server-side rendering and single-page applications.
Open source website: github.com/surmon-chin…
The introduction of NuxtJS
The installation
npm install vue-quill-editor --save
# or
yarn add vue-quill-editor
Copy the code
Nuxt. Config. Js configuration
plugins: [
'@/plugins/element-ui',
{
src: '~plugins/nuxt-quill-plugin.js'.ssr: false // Render only on the client side}].Copy the code
plugins/nuxt-quill-plugin.js
import Vue from 'vue'
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
if (process.browser) {
// Add a browser-side judgment to render only on the browser side
const VueQuillEditor = require('vue-quill-editor/dist/ssr')
Vue.use(VueQuillEditor)
}
Copy the code
Components use
<template>
<div class="quill-editor">
<slot name="toolbar"></slot>
<div ref="editor"></div>
</div>
</template>
<script>
// require sources
import _Quill from 'quill'
import defaultOptions from './options'
const Quill = window.Quill || _Quill
// pollfill
if (typeof Object.assign ! ='function') {
Object.defineProperty(Object.'assign', {
value(target, varArgs) {
if (target == null) {
throw new TypeError('Cannot convert undefined or null to object')}const to = Object(target)
for (let index = 1; index < arguments.length; index++) {
const nextSource = arguments[index]
if(nextSource ! =null) {
for (const nextKey in nextSource) {
if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
to[nextKey] = nextSource[nextKey]
}
}
}
}
return to
},
writable: true.configurable: true})}// export
export default {
name: 'quill-editor'.data() {
return {
_options: {},
_content: ' ',
defaultOptions
}
},
props: {
content: String.value: String.disabled: {
type: Boolean.default: false
},
options: {
type: Object.required: false.default: () = >({})},globalOptions: {
type: Object.required: false.default: () = >({})}},mounted() {
this.initialize()
},
beforeDestroy() {
this.quill = null
delete this.quill
},
methods: {
// Init Quill instance
initialize() {
if (this.$el) {
// Options
this._options = Object.assign({}, this.defaultOptions, this.globalOptions, this.options)
// Instance
this.quill = new Quill(this.$refs.editor, this._options)
this.quill.enable(false)
// Set editor content
if (this.value || this.content) {
this.quill.pasteHTML(this.value || this.content)
}
// Disabled editor
if (!this.disabled) {
this.quill.enable(true)}// Mark model as touched if editor lost focus
this.quill.on('selection-change'.range= > {
if(! range) {this.$emit('blur'.this.quill)
} else {
this.$emit('focus'.this.quill)
}
})
// Update model if text changes
this.quill.on('text-change'.(delta, oldDelta, source) = > {
let html = this.$refs.editor.children[0].innerHTML
const quill = this.quill
const text = this.quill.getText()
if (html === '<p><br></p>') html = ' '
this._content = html
this.$emit('input'.this._content)
this.$emit('change', { html, text, quill })
})
// Emit ready event
this.$emit('ready'.this.quill)
}
}
},
watch: {
// Watch content change
content(newVal, oldVal) {
if (this.quill) {
if(newVal && newVal ! = =this._content) {
this._content = newVal
this.quill.pasteHTML(newVal)
} else if(! newVal) {this.quill.setText(' ')}}},// Watch content change
value(newVal, oldVal) {
if (this.quill) {
if(newVal && newVal ! = =this._content) {
this._content = newVal
this.quill.pasteHTML(newVal)
} else if(! newVal) {this.quill.setText(' ')}}},// Watch disabled change
disabled(newVal, oldVal) {
if (this.quill) {
this.quill.enable(! newVal) } } } }</script>
Copy the code
Use effect
Refer to the website
Github.com/surmon-chin…
Juejin. Cn/post / 684490…
www.jianshu.com/p/dcd2aac87…
Stackoverflow.com/questions/4…
www.cnblogs.com/hrrm/p/1101…