Senior Computer Scientist, Adobe
Twitter: @jasonsanjose
Github: @jasonsanjose
Slides
http://slides.com/jasonsanjose/vueconf2017
const EditPlugin = new Vue({
data() {
return { enableEdit: false }
},
watch: {
enableEdit() {
// "re-render" all elements when enableEdit changes
this.renderAll();
}
},
methods: {
render(el) {
el.setAttribute('contenteditable', this.enableEdit);
},
renderAll() {
this._elements.forEach((el) => this.render(el));
},
install(Vue) {
this._elements = new Set();
Vue.directive('edit', {
bind(el) {
EditPlugin._elements.add(el);
// "render" the directive for the current element
EditPlugin.render(el);
},
unbind(el) {
EditPlugin._elements.remove(el);
}
});
}
}
});
Vue.use(EditPlugin);
new Vue({
el: '#app',
computed: {
enableEdit() {
return EditPlugin.enableEdit;
},
buttonLabel() {
return this.enableEdit ? 'Save' : 'Edit';
}
},
methods: {
toggleEdit() {
// Update plugin state
EditPlugin.enableEdit = !EditPlugin.enableEdit;
}
},
template: `
<div>
<button @click="toggleEdit">{{ buttonLabel }}</button>
<h1 v-edit>Heading</h1>
<p v-edit>Paragraph</p>
</div>`
});