<template> <c-fullbox> <div style="position: relative;"> <el-input :id="id" ref="form-item" v-model="model" :style="{'border-bottom': isShowRed ? `1px solid ${isShowRed}` : ''}" v-bind="attrs" v-on="$listeners" v-bind:disabled="isDisable" :maxlength="maxlength" :show-word-limit="isLimitChar ? false : showWordLimit" :placeholder="placeholderEnable || placeholder || $t('components.请输入')" @change="handleChange" > <template v-slot:suffix> <slot name="suffix"></slot> </template> </el-input> <span v-if="isLimitChar" class="cus-input-count">{{curLength}}/{{maxlength}}</span> </div> <template slot="footer" v-if="isShow.show"> <el-tooltip :content="isShow.warning" placement="bottom" effect="light" popper-class="tooltip"> <i :class="isShow.show ? 'el-icon-warning' : ''" style="margin-left: 10px;color: red;font-size: 16px;cursor: pointer;"></i> </el-tooltip> </template> </c-fullbox> </template> <script> import commonDepend from '~/mixin/commonDepend.js' import markSetShowRed from '~/components/business/componentMixins/markSetShowRed.js' export default { inject: { root: { default: () => null } }, mixins: [commonDepend, markSetShowRed], props: { value: { type: [String, Number], default: undefined }, disabled: { type: Boolean, default: false }, id: { type: String, default: undefined }, // 此对象为markset或者modifySet所在的对象,如果传了此对象可以标记当前对象下的字段为红色下划线 markSetData: { type: Object, default: () => null }, customModifykey: { type: String, default: null }, isShow: { type: Object, default: () => ({ show: false, warning: '' }) }, placeholder:{ type: String, default: null }, maxlength:{ type: [String, Number], default: 1000 }, showWordLimit: { type: Boolean, default: false }, isLimitChar: { type: Boolean, default: false } }, computed: { model: { get () { return this.value }, set (newVal) { this.$emit('input', newVal) } }, mode () { return this.$store.state.Status.mode }, isDisable() { return this.mode === 'display' || this.disabled }, placeholderEnable(){ let label = this.$parent.label || this.$parent.label let curLabel = '' if (label) { curLabel = this.$i18n.locale === 'en' ? this.$t('components.请输入') + ' ' + this.$t('components.' + label) : this.$t('components.请输入') + this.$t('components.' + label) } return curLabel }, 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 }, curLength() { let len = 0 if (this.isLimitChar && this.model && typeof(this.model) == 'string') { len = this.model.replace(/[^x00-xff]/g, 'xx').length } else { len = this.model.length || 0 } return len } }, watch: { disabled(newVal) { if (newVal) { this.resetValidate() } }, isLimitChar(newVal) { if (newVal) { this.initInputValid() } }, maxlength(newVal) { if (newVal) { this.initInputValid() } } }, methods: { handleChange () { if (!this.customModifykey) { // 添加isModify属性 this.changeModify() } }, isCheckInput() { let prop = this.customModifykey || this.$parent.prop if (!prop || !this.root) { return false; } if (this.isLimitChar) { let curProp = [ { validator: (rule, value, callback) => { if (this.curLength > this.maxlength) { callback(new Error('输入内容不能超过' + this.maxlength + '个字节(一个中文字符占两个字节)')) } else { callback() } }, trigger: ['change', 'blur'], source:"mulrow" }, ] // 清除上次校验的问题 this.root.$refs['modelForm'].clearValidate([prop]); //合并交易下必填校验 if(this.root.rules[prop] && this.root.rules[prop].length){ let oldProp = this.root.rules[prop].filter(item=>!item.source) curProp = [...oldProp,...curProp]; this.$set(this.root.rules, prop, curProp) }else{ this.$set(this.root.rules, prop, curProp) } console.log('input校验规则rules:', this.root.rules, prop) } }, initInputValid() { this.$nextTick(() => { this.isCheckInput() }) } }, mounted() { this.initInputValid() } } </script> <style> /* .el-input.highl ight .el-input__inner{ border-color: red; } .el-textarea.highlight .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; } */ body > .tooltip { color: red; } body > .el-tooltip__popper.is-light{ border: 1px solid #DFDCE6; } /* 改变三角形外边框 */ /* 三角形朝下的时候 */ .el-tooltip__popper[x-placement^="bottom"] .popper__arrow { border-bottom-color: #DFDCE6 !important; } </style> <style lang="less" scoped> .cus-input-count { position: absolute; right: 10px; bottom: 5px; z-index: 10; height: 16px; line-height: 16px; color: #939099; } </style>