Skip to content

Instantly share code, notes, and snippets.

@rafaelsq
Created April 12, 2017 16:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save rafaelsq/04b4cae0717f30a51ddf128418ee5e31 to your computer and use it in GitHub Desktop.
Save rafaelsq/04b4cae0717f30a51ddf128418ee5e31 to your computer and use it in GitHub Desktop.
Vue ContentEditable
export default {
name: 'content_editable',
template: '<div ref="element" v-html="text"></div>',
props: {
text: [String],
customTag: [String],
},
mounted: function() {
let newElement = document.createElement(this.customTag || 'div')
this.$refs.element.parentNode.replaceChild(newElement, this.$refs.element)
this.$refs.element = newElement
this.$refs.element.contentEditable = true
this.$refs.element.innerHTML = this.text
this.$refs.element.addEventListener('DOMSubtreeModified', () => {
this.$emit('edit', this.$refs.element.innerText)
})
this.$refs.element.addEventListener('blur', () => {
this.$emit('blur')
})
this.$refs.element.addEventListener('focus', () => {
this.$emit('focus')
})
},
beforeDestroy: function() {
this.$refs.element.parentNode.removeChild(this.$refs.element)
},
watch: {
text: function() {
if (this.text !== this.$refs.element.innerHTML) {
this.$refs.element.innerHTML = this.text
}
}
}
}
@rafaelsq
Copy link
Author

rafaelsq commented Apr 12, 2017

usage:

import content_editable from 'content_editable.js'

{
    template: '<content_editable :text="my_text" v-on:edit="apply" customTag="pre" v-on:blur="save" v-on:focus="focus" />',
    components: {
        content_editable
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment