以下是该组件中 自定义属性 和 el-select
自带属性 的对比表格:
属性/功能 | 自定义 | el-select 自带 | 说明 |
---|---|---|---|
label | ✔️ | ❌ | 自定义属性,用于设置表单项的标签。 |
prop | ✔️ | ❌ | 自定义属性,用于表单验证时的字段名。 |
labelWidth | ✔️ | ❌ | 自定义属性,用于设置标签的宽度。 |
labelAlign | ✔️ | ❌ | 自定义属性,用于设置标签的对齐方式。 |
tip | ✔️ | ❌ | 自定义属性,用于设置提示信息(显示在 el-tooltip 中)。 |
operateType | ✔️ | ❌ | 自定义属性,用于控制组件的行为(如 view 模式下禁用输入)。 |
inputWidth | ✔️ | ❌ | 自定义属性,用于设置输入框的宽度。 |
value | ✔️ | ❌ | 自定义属性,用于绑定 v-model 的值。 |
multiple | ✔️ | ✔️ | 自定义属性,用于控制是否支持多选;el-select 也支持该属性。 |
list | ✔️ | ❌ | 自定义属性,用于设置下拉框的选项数据。 |
optionLabel | ✔️ | ❌ | 自定义属性,用于指定选项的显示字段。 |
optionValue | ✔️ | ❌ | 自定义属性,用于指定选项的值字段。 |
placeholder | ✔️ | ✔️ | 自定义属性,用于设置占位符;el-select 也支持该属性。 |
inputEnd | ✔️ | ❌ | 自定义属性,用于在输入框后添加额外的内容。 |
allowCreate | ✔️ | ✔️ | 自定义属性,用于控制是否允许用户创建新选项;el-select 也支持该属性。 |
defaultFirstOption | ✔️ | ✔️ | 自定义属性,用于控制是否默认选中第一个选项;el-select 也支持该属性。 |
filterable | ❌ | ✔️ | el-select 自带属性,用于启用搜索功能。 |
clearable | ❌ | ✔️ | el-select 自带属性,用于启用清除按钮。 |
@input | ❌ | ✔️ | el-select 自带事件,用于监听输入值的变化。 |
@change | ❌ | ✔️ | el-select 自带事件,用于监听选择值的变化。 |
@visible-change | ❌ | ✔️ | el-select 自带事件,用于监听下拉框的显示/隐藏状态变化。 |
el-option | ❌ | ✔️ | el-select 自带组件,用于定义下拉框的选项。 |
el-tooltip | ❌ | ✔️ | el-tooltip 是 Element UI 自带的组件,用于显示提示信息。 |
el-form-item | ❌ | ✔️ | el-form-item 是 Element UI 自带的组件,用于包裹表单项。 |
总结
- 自定义属性:主要用于扩展功能,如设置标签、宽度、提示信息等。
el-select
自带属性:主要用于控制下拉框的行为,如多选、搜索、清除等。- 自定义逻辑:通过
v-if
、v-for
等指令实现动态渲染和逻辑控制。
<template><div class="wrap"><div class="box"><el-form-item :label="label" :prop="prop" :label-width="labelWidth"><div slot="label" :style="`text-align: ${labelAlign};`"><span>{{ label }}<el-tooltip class="item" effect="dark" :content="tip || label || placeholder" placement="bottom-start"><i class="el-icon-warning-outline" /></el-tooltip></span></div><span v-if="operateType === 'view'"><template v-if="multiple">{{ list && list.length && list.filter(o => val.includes(o[optionValue])).map(o => o[optionLabel]).join(',') }}</template><template v-else><!-- {{ getSelectLabel(val) }} -->{{ list && list.length && list.find(o => val === o[optionValue]) && list.find(o => val === o[optionValue])[optionLabel] }}</template></span><el-selectv-elsev-model="val":multiple="multiple"filterableclearable:placeholder="placeholder || label || tip":allow-create="allowCreate":default-first-option="defaultFirstOption":style="inputWidth ? `width: ${inputWidth};` : `width: 100%;`"@input="value => $emit('input', value)"@change="value => $emit('change', value)"@visible-change="value => $emit('visible-change', value)"><el-optionv-if="list.length":label="` `":value="` `"/><el-optionv-for="(item, i) in list":key="'' + item[optionLabel] + item[optionValue] + i":label="item[optionLabel]":value="item[optionValue]"/></el-select><template v-if="inputEnd"> </template>{{ inputEnd }}</el-form-item></div></div>
</template>
<script lang="ts">javascript">
import { Component, Vue, Prop, Emit, Watch } from 'vue-property-decorator'
import { AppModule } from '@/store/modules/app'
import { UserModule } from '@/store/modules/user'@Component({name: 'w-form-input',components: {}
})export default class extends Vue {@Prop({ default: '' })public label!: string@Prop({ default: '' })public prop!: string@Prop({ default: '160px' })public labelWidth: string@Prop({ default: 'right' })public labelAlign: string@Prop({ default: '' })public tip?: string@Prop({ default: '' })public operateType!: string@Prop({ default: false })@Prop({ default: '100%' })public inputWidth?: string@Prop({ default: '' })public value?: any@Prop({ default: false })public multiple: boolean@Prop({ default: () => [] })public list!: any@Prop({ default: '' })public optionLabel: string@Prop({ default: 'value' })public optionValue: String@Prop({ default: '' })public placeholder?: string@Prop({ default: '' })public inputEnd?: string@Prop({ default: false })public allowCreate?: boolean@Prop({ default: false })public defaultFirstOption?: boolean@Watch('list')watchList(v: any) {this.selList = v}@Watch('value')watchValue(v: any) {this.val = v}private multipleFlag: boolean = falseprivate selList: any = this.listprivate val: any = this.value
}
</script>
<style scoped lang="scss">
.wrap {width: 100%;.box {width: 100%;}
}
</style>