17b87bab创建于 2025年6月20日历史提交
<template>
    <div class="form-name-style re">
        <!-- 使用 @input 事件进行输入校验 -->
        <el-input v-model="name" placeholder="请输入标题" class="w-full" @input="validateInput" />
        <div v-if="old_name !== name" class="form-name-button">
            <el-button type="primary" class="name-button" @click="submit">确定</el-button>
        </div>
    </div>
</template>

<script lang="ts" setup>
import { cloneDeep, isEmpty } from 'lodash';
// 从组件的顶层获取数据,避免多层组件传值导致数据遗漏和多余代码
const diy_data: any = toRef(inject('diy_data', []));

const props = defineProps({
    value: {
        type: String,
        default: () => '',
    },
    modelId: {
        type: String,
        default: '',
    },
    isSubform: {
        type: Boolean,
        default: false,
    },
    subformList: {
        type: Array,
        default: () => ([]),
    },
});
// 如果是子表单,获取子表单的数据
const subformData = computed(() => props.subformList);
// 判断当前是否是只子表单
const show_hidden_operate_list = computed(() => props.isSubform ? subformData.value : diy_data.value);

const old_name = ref(cloneDeep(props.value));
watch(() => props.value, () => {
    old_name.value = cloneDeep(props.value);
});
const name = ref(cloneDeep(props.value));
const emit = defineEmits(['name_change']);

// 输入校验函数
const validateInput = () => {
    const regex = /^[a-zA-Z0-9_]*$/;
    if (!regex.test(name.value)) {
        // 若输入不合法,移除非法字符
        name.value = name.value.replace(/[^a-zA-Z0-9_]/g, '');
    }
};

const submit = () => {
    if (!isEmpty(name.value)) {
        // 取出不是当前数据的内容
        const old_diy_data = show_hidden_operate_list.value.filter((item:any) => item.id !== props.modelId && item.form_name == name.value);
        // 如果有重复的,提示用户
        if (old_diy_data.length > 0) {
            ElMessage.error('FROM名称重复,请重新输入');
            name.value = cloneDeep(old_name.value);
            return;
        } else {
            emit('name_change', name.value);
        }
    } else {
        ElMessage.error('FROM名称不能为空,请重新输入');
        name.value = cloneDeep(old_name.value);
        return;
    }
};
</script>

<style lang="scss" scoped>
.form-name-style {
    display: flex;
    align-items: center;
    :deep(.el-input__wrapper) {
        padding-right: 6.6rem;
    }
}
.form-name-button {
    position: absolute;
    right: 0.2rem;
    top: 0.2rem;
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 1;
    :deep(.el-button--primary) {
        height: 2.8rem;
        padding: 0.6rem 1.5rem;
    }
}
</style>