简单的封装一个城市下拉框组件(可单选和多选)

子组件

<template>
    <el-select
        v-model="innerValue"
        :placeholder="placeholder"
        :multiple="multiple"
        :clearable="clearable"
        :collapse-tags="collapseTags"
        :filterable="filterable"
        :size="size"
        :multiple-limit="multipleLimit"
        :allow-create="allowCreate"
        @change="cityChange"
    >
        <el-option
            v-for="item in optionsList"
            :key="item.cityId"
            :label="item.cityName"
            :value="item.cityId"
        />
    </el-select>
</template>
<script>
import { defineComponent, ref, onMounted } from '@vue/composition-api';

export default defineComponent({
    name: 'CitySelect',
    props: {
        value: {
            type: [Number, Array],
            default: 0,
        },
        // 是否禁用
        disabled: {
            type: Boolean,
            default: false,
        },
        // 是否多选
        multiple: {
            type: Boolean,
            default: false,
        },
        // 是否可清空
        clearable: {
            type: Boolean,
            default: true,
        },
        // 多选时是否将选中值按文字的形式展示 +1那种
        collapseTags: {
            type: Boolean,
            default: false,
        },
        // 是否可搜索
        filterable: {
            type: Boolean,
            default: true,
        },
        // 占位符
        placeholder: {
            type: String,
            default: '请选择',
        },
        // 输入框尺寸
        size: {
            type: String,
            default: 'medium',
        },
        // 多选时用户最多可以选择的项目数,为 0 则不限制
        multipleLimit: {
            type: Number,
            default: 0,
        },
        // 是否允许用户创建新条目,需配合 filterable 使用
        allowCreate: {
            type: Boolean,
            default: false,
        },
        // 是否需要全部选项
        isAllSelect: {
            type: Boolean,
            default: false,
        },

    },
    setup(props, { emit }) {
        const innerValue = ref('');
        innerValue.value = props.value;
        const optionsList = ref([]);

        // 模拟接口
        const getCityList = () => {
            setTimeout(() => {
                optionsList.value = [
                    { cityId: 1, cityName: '广州' },
                    { cityId: 2, cityName: '深圳' },
                    { cityId: 3, cityName: '武汉' },
                    { cityId: 4, cityName: '上海' },
                    { cityId: 5, cityName: '北京' },
                ];
                // 如果需要展示全部选项且不是多选时展示
                if (props.isAllSelect && !props.multiple) {
                    optionsList.value.unshift({ cityId: -1, cityName: '全部' });
                }
            }, 3000);
        };

        onMounted(() => {
            getCityList();
        });

        // 城市发生变化
        const cityChange = (val) => {
            emit('input', val);
        };

        return {
            innerValue,
            optionsList,
            getCityList,
            cityChange,

        };
    },
});

</script>

父组件

<template>
    <div>
        <citySelect
            v-model="cityValue"
            :placeholder="'请选择城市'"
            :multiple="multiple"
            :is-all-select="true"
        />
    </div>
</template>


//导入
import citySelect from '../components/citySelect';

components: { citySelect },


setup() {
        // 单选这样传,  数据回显
        // const cityValue = ref(1);
        // const multiple = ref(false);

        // 多选这样传,  数据回显
        const multiple = ref(true);
        const cityValue = ref([1, 2]);

        return {
            multiple,
            cityValue,
        };
    },

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值