通过antd中的Select组件封装组件实现通过搜索来动态加载下拉数据

功能描述

(1)某个变量的值通过下拉选择得出;
(2)下拉数据量大;
(3)只能通过分页获取的下拉数据;
(4)可根据搜索内容动态显示下拉数据。
能同时满足这几个项目要求,select组件的基本能实现,为在项目中更好的复用这个功能和使用时更简洁,接下来就封装成新的组件datat-select。

Props

参数描述类型默认值
v-model选中值string-
width选择框的宽度string“100%”
fieldNames自定义 options 中 label value 的字段object{ label: ‘label’, value: ‘value’}
getList请求后端list接口的方法function(params)-
searchName需要搜索的字段名string-
placeholder输入提示语sting-
pageSize如果数据是分页加载,那么默认一次加载多少条number20

代码实现

<template>
  <Select
    v-model:value="currentValue"
    show-search
    :placeholder="placeholder || '搜索名称'"
    :style="{ width }"
    :options="options"
    allowClear
    :filter-option="filterOption"
    :fieldNames="fieldNames"
    @search="searchChange"
  />
</template>
<script setup>
import { ref, defineProps, defineEmits, watch, onMounted, computed } from "vue";
import { Select } from "ant-design-vue";
import useApi from "@/utils/hooks/use-api";
import { useDebounceFn } from "@vueuse/core";

/**
 * 大数据且分页查询时用到的选择框组件,根据搜索条件查询后端数据
 */
const props = defineProps({
  width: {
    type: String,
    default: "100%"
  },
  modelValue: String,
  fieldNames: Object,
  getList: Function, //请求后端list接口的方法
  searchName: String, //需要搜索的字段名
  placeholder: String,
  pageSize: { type: Number, default: 20 }
});
const emits = defineEmits(["update:modelValue"]);
const currentValue = computed({
  get: () => props.modelValue,
  set: (v) => emits("update:modelValue", v)
});

const options = ref([]);
const filterOption = () => true;

const { result: listResult, fetchResource: fetchList } = useApi(props.getList);
const getOptionList = async (params = {}) => {
  await fetchList({
    ...params,
    pageNum: 1,
    pageSize: props.pageSize
  });
  options.value = listResult.value?.data?.datas || [];
};

watch(currentValue, (newValue) => {
  !newValue && getOptionList();
});

const searchChange = useDebounceFn((value) => {
  getOptionList({
    [props.searchName || props.fieldNames?.label || "name"]: value
  });
}, 300);

onMounted(async () => {
  getOptionList();
});
</script>

可以使用antd中的Select组件和Table组件实现这个功能。具体步骤如下: 1. 在Table组件中添加一个列,该列包含Select组件。可以使用Table组件的render属性来渲染该列。 2.Select组件中设置数据源,可以通过props传递数据源,也可以在组件内部设置。数据源通常是一个数组,每个数组元素都代表一个选项。 3.Select组件中设置选中项。可以使用props传递选中项,也可以在组件内部设置。选中项通常是一个值或者一个数组,表示当前选中的选项。 4.Select组件中设置事件处理函数。可以使用props传递事件处理函数,也可以在组件内部设置。事件处理函数通常是一个回调函数,当用户选中某个选项时会被调用。 示例代码如下: ```jsx import { Table, Select } from 'antd'; const { Option } = Select; const dataSource = [ { key: '1', name: 'John Brown', age: 32, address: 'New York No. 1 Lake Park', }, { key: '2', name: 'Jim Green', age: 42, address: 'London No. 1 Lake Park', }, { key: '3', name: 'Joe Black', age: 32, address: 'Sidney No. 1 Lake Park', }, ]; const columns = [ { title: 'Name', dataIndex: 'name', key: 'name', }, { title: 'Age', dataIndex: 'age', key: 'age', }, { title: 'Address', dataIndex: 'address', key: 'address', }, { title: 'Action', key: 'action', render: (text, record) => ( <Select defaultValue="1" style={{ width: 120 }}> <Option value="1">Option 1</Option> <Option value="2">Option 2</Option> <Option value="3">Option 3</Option> </Select> ), }, ]; const App = () => { return ( <Table dataSource={dataSource} columns={columns} /> ); }; export default App; ``` 在上述代码中,我们在Table组件的columns属性中添加了一个名为Action的列,该列包含了一个Select组件。我们在Select组件中设置了数据源和事件处理函数,用户选择某个选项时会触发onChange事件,我们在事件处理函数中可以获取到用户选择的选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值