2022-02-17 18:48:18 +08:00

110 lines
2.6 KiB
Vue

<template>
<div class="quick-edit" :class="[alwaysIcon ? 'quick-always' : '']">
<div v-if="isEdit" v-clickoutside="onClickOut" class="quick-input">
<TagInput v-if="isTag" ref="input" v-model="content" :disabled="isLoad" @on-enter="onEnter" @on-blur="onBlur"/>
<Input v-else ref="input" v-model="content" :disabled="isLoad" @on-enter="onEnter" @on-blur="onBlur"/>
<div v-if="isLoad" class="quick-loading"><Loading/></div>
</div>
<template v-else>
<div class="quick-text"><slot></slot></div>
<Icon class="quick-icon" type="ios-create-outline" @click.stop="onEdit"/>
</template>
</div>
</template>
<script>
import clickoutside from "../directives/clickoutside";
export default {
name: 'QuickEdit',
directives: {clickoutside},
props: {
value: {
},
autoEdit: {
},
isTag: {
type: Boolean,
default: false
},
alwaysIcon: {
type: Boolean,
default: false
},
clickOutSide: {
type: Boolean,
default: true
},
},
data() {
return {
isLoad: false,
isEdit: false,
content: ''
}
},
mounted() {
if (this.autoEdit === true) {
this.onEdit();
}
},
watch: {
isEdit(val) {
this.$emit("on-edit-change", val);
},
autoEdit(val) {
if (val === true) {
setTimeout(this.onEdit, 0)
}
}
},
methods: {
onEdit() {
this.content = this.value;
this.isEdit = true;
this.$nextTick(() => {
this.$refs.input.focus({
cursor: 'all'
});
})
},
onEnter() {
if (this.content == this.value) {
this.isEdit = false;
return;
}
if (this.isLoad) {
return;
}
this.isLoad = true;
this.$emit("input", this.content);
this.$emit("on-update", this.content, () => {
this.isEdit = false;
this.isLoad = false;
})
},
onClickOut() {
if (!this.clickOutSide) {
return;
}
this.onEnter();
},
onBlur() {
if (this.clickOutSide) {
return;
}
this.onEnter();
},
}
}
</script>