HTML Editor using Vue.js and Quilljs
You can use Yarn or NPM
$ npm install --save vue2-editor
OR
yarn add vue2-editor
// Basic Use - Covers most scenarios
import { VueEditor } from 'vue2-editor'
// Advanced Use - Hook into Quill's API for Custom Functionality
import { VueEditor, Quill } from 'vue2-editor'
Name | Type | Default | Description |
---|---|---|---|
id | String | quill-container | Set the id (necessary if multiple editors in the same view) |
v-model | String | - | Set v-model to the the content or data property you wish to bind it to |
useCustomImageHandler | Boolean | false | Handle image uploading instead of using default conversion to Base64 |
placeholder | String | - | Placeholder text for the editor |
disabled | Boolean | false | Set to true to disable editor |
editorToolbar | Array | ** Too long for table. See toolbar example below | Use a custom toolbar |
editorOptions | Array | - | Offers object for merging into default config (add formats, custom Quill modules, ect) |
Name | Parameters | Description |
---|---|---|
imageAdded | file, Editor, cursorLocation | Emitted when useCustomImageHandler is true and photo is being added to the editor |
<template>
<div id="app">
<vue-editor v-model="content"></vue-editor>
</div>
</template>
<script>
import { VueEditor } from 'vue2-editor'
export default {
components: {
VueEditor
},
data() {
return {
content: '<h1>Some initial content</h1>'
}
}
}
</script>
If you choose to use the custom image handler, an event is emitted when a a photo is selected. You can see below that 3 parameters are passed.
- It passes the file to be handled however you need
- The Editor instance
- The cursor position at the time of upload so the image can be inserted at the correct position on success
NOTE In addition to this example, I have created a example repo demonstrating this new feature with an actual server.
<template>
<div id="app">
<vue-editor id="editor"
useCustomImageHandler
@imageAdded="handleImageAdded" v-model="htmlForEditor">
</vue-editor>
</div>
</template>
<script>
import { VueEditor } from 'vue2-editor'
import axios from 'axios'
export default {
components: {
VueEditor
},
data() {
return {
htmlForEditor: ''
}
},
methods: {
handleImageAdded: function(file, Editor, cursorLocation) {
// An example of using FormData
// NOTE: Your key could be different such as:
// formData.append('file', file)
var formData = new FormData();
formData.append('image', file)
axios({
url: 'https://fakeapi.yoursite.com/images',
method: 'POST',
data: formData
})
.then((result) => {
let url = result.data.url // Get url from response
Editor.insertEmbed(cursorLocation, 'image', url);
})
.catch((err) => {
console.log(err);
})
}
}
}
</script>
<template>
<div id="app">
<button @click="setEditorContent">Set Editor Contents</button>
<vue-editor v-model="htmlForEditor"></vue-editor>
</div>
</template>
<script>
import { VueEditor } from 'vue2-editor'
export default {
components: {
VueEditor
},
data() {
return {
htmlForEditor: null
}
},
methods: {
setEditorContent: function() {
this.htmlForEditor = '<h1>Html For Editor</h1>'
}
}
}
</script>
<template>
<div id="app">
<vue-editor id="editor1" v-model="editor1Content"></vue-editor>
<vue-editor id="editor2" v-model="editor2Content"></vue-editor>
</div>
</template>
<script>
import { VueEditor } from 'vue2-editor'
export default {
components: {
VueEditor
},
data() {
return {
editor1Content: '<h1>Editor 1 Starting Content</h1>',
editor2Content: '<h1>Editor 2 Starting Content</h1>',
}
}
}
</script>
<style>
#editor1, #editor2 {
height: 350px;
}
</style>
<template>
<div id="app">
<vue-editor v-model="content" :editorToolbar="customToolbar"></vue-editor>
</div>
</template>
<script>
import { VueEditor } from 'vue2-editor'
export default {
components: {
VueEditor
},
data() {
return {
content: '<h1>Html For Editor</h1>',
customToolbar: [
['bold', 'italic', 'underline'],
[{ 'list': 'ordered'}, { 'list': 'bullet' }],
['image', 'code-block']
]
}
}
}
</script>
<template>
<div id="app">
<button @click="saveContent"></button>
<vue-editor v-model="content"></vue-editor>
</div>
</template>
<script>
import { VueEditor } from 'vue2-editor'
export default {
components: {
VueEditor
},
data () {
return {
content: '<h3>Initial Content</h3>'
}
},
methods: {
handleSavingContent: function() {
// You have the content to save
console.log(this.content)
}
}
}
</script>
<template>
<div id="app">
<vue-editor v-model="content"></vue-editor>
<div v-html="content"></div>
</div>
</template>
<script>
import { VueEditor } from 'vue2-editor'
components: {
VueEditor
},
export default {
data() {
return {
content: '<h1>Initial Content</h1>'
}
}
}
</script>
V2E now exports Quill to assist in this process.
- When importing VueEditor, also import Quill.
- Import your custom module
- Register that custom module via the imported Quill
- Add the necessary configuration to the
editorOptions
object
<template>
<div id="app">
<vue-editor :editorOptions="editorSettings"></vue-editor>
</div>
</template>
<script>
import { VueEditor, Quill } from 'vue2-editor'
import { ImageDrop } from 'quill-image-drop-module'
Quill.register('modules/imageDrop', ImageDrop)
export default {
components: {
VueEditor
},
data() {
return {
content: '<h1>Initial Content</h1>'
}
},
editorSettings: {
modules: {
imageDrop: true
}
}
}
</script>
Vue2Editor now uses Poi.js for development and building
yarn dev
: Run example in development modeyarn docs
: Development for Docsyarn build
: Build component in both formatyarn lint
: Run eslint
Check out your npm scripts, it's using Poi under the hood.
MIT