<template> <el-input :class="{'redClass':red && isDisable}" v-storeModify :id="id" ref="form-item" v-model="model" v-bind="attrs" v-on="$listeners" v-bind:disabled="isDisable"> <template v-slot:suffix> <slot name="suffix"></slot> </template> </el-input> </template> <script> export default { inject: ["root"], props: { value: { type: [String, Number], default: undefined }, disabled: { type: Boolean, default: false }, id: { type: String, default: undefined } }, data(){ return { red:false } }, directives:{ storeModify:{ update(el,bind,vnode){ let _this = vnode.context let key = vnode.parent.data.model.expression let keyArray = key.split('.') let curKey = keyArray.pop() let resultKey = keyArray.join(".") let deepData = _this.getProperty(resultKey,_this.root) if(deepData && Array.isArray(deepData.modifySet)){ if(deepData.modifySet.includes(curKey)){ _this.red = true } } el.onchange = (...args)=>{ if(deepData.modifySet){ if(Array.isArray(deepData.modifySet)){ if(deepData.modifySet.includes(curKey)){ return } deepData.modifySet.push(curKey) } } else { deepData.modifySet = [curKey] } } } } }, computed: { model: { get () { return this.value }, set (newVal) { this.$emit('input', newVal) } }, mode () { return this.$store.state.Status.mode }, isDisable: { get () { return this.mode === 'display' || this.disabled } }, highlight () { return this.$store.state.Status.highlights.indexOf(this.id) !== -1 }, highlightChanges () { return this.$store.state.Status.highlightChanges.indexOf(this.id) !== -1 }, attrs(){ if(this.mode === 'display' || this.disabled) { let {placeholder,...rest} = this.$attrs return rest } return this.$attrs } }, methods:{ getProperty(str, value) { let keys = str?.split('.') for (let key of keys) { if (value) { value = value[key] } } return value } } } </script> <style lang="less" scoped> .redClass /deep/ .el-input__inner{ border-color: red; } .redClass /deep/ .el-textarea__inner { border-color: red; } /* .el-input.change-light .el-input__inner{ border-color: #E6A23C; } .el-textarea.change-light .el-textarea__inner { border-color: #E6A23C; } */ </style>