vue3 自定义调控参数-简易生成器
文章目录
- 封装生成器控件如下
- 父组件使用如下:
 
- 此功能好像是某厂的在线视频笔试题,当时写完也没有结果。。。
- 我觉得此 demo 适用场景:自定义动态表单时需要定制字段、用户自定义信息等
封装生成器控件如下
//创建CustomControlParams.vue 文件, 内容如下
<template>
    <div v-for="(item, index) in keyValArr">
        <input type="text" v-model="item.prop" @input="setObj" />
        <span>:</span>
        <input type="text" v-model="item.value" @input="setObj" />
        <button @click="() => onDelete(item.id)">删除</button>
    </div>
    <button @click="onAdd">新增字段</button>
</template>
<script lang="ts" setup>
import { onMounted, ref } from "vue";
//获取随机字符串 32uuid
const getRandomStr = (length = 32) => {
    const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    const maxPos = chars.length;
    let _string = "";
    for (let i = 0; i < length; i++) {
        _string += chars.charAt(Math.floor(Math.random() * maxPos));
    }
    return _string;
}
const props = defineProps({
    customeKeyValue: {
        type: Object,
        default: {}
    }
});
const emits = defineEmits(["update:customeKeyValue"]);
//对象映射成数组,方便操作
const keyValArr = ref<{
    id: string;
    prop: string;
    value: any;
}[]>([]);
//初始转换
onMounted(() => {
    keyValArr.value = Object.keys(props.customeKeyValue).map(prop => ({
        id: getRandomStr(),
        prop,
        value: props.customeKeyValue[prop]
    }));
});
//操作值变化时,同步修改
const setObj = () => {
    let newCustomeKeyValue = {} as any;
    keyValArr.value.map(item => {
        newCustomeKeyValue[item.prop] = item.value;
    });
    emits("update:customeKeyValue", newCustomeKeyValue);
};
//删除
const onDelete = (prop: string) => {
    keyValArr.value = keyValArr.value.filter(item => item.prop !== prop);
    setObj();
};
//添加
const onAdd = () => {
    keyValArr.value.push({
        id: getRandomStr(),
        prop: 'Custom' + Date.now(),
        value: ""
    });
    setObj();
};
</script>
父组件使用如下:
<template>
  <h2>自定义调控参数</h2>
  <CustomControlParams v-model:customeKeyValue="formVal" />
  <div>{{ formVal }}</div>
</template>
<script setup lang="ts">
import { ref } from "vue";
import CustomControlParams from "./CustomControlParams.vue";
const formVal = ref<any>({
  MAX: 1,
  MIN: 2
})
</script>
结果如图:
 
- 没有做相同属性 key 的校验,相同的默认会后定义覆盖之前定义。
- demo 记录而已。不喜勿喷
 有疑问的同学可以私信我、对帮助到同学欢迎大家点赞、收藏评论。



















