select2异步加载数据

本文详细介绍了Select2组件的基本使用方法及高级配置选项,包括如何加载数组数据、异步加载远程数据等,并提供了详细的参数说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.select2 加载数组数据
<script type="text/javascript">
var data = [{ id: 0, text: 'enhancement' }, { id: 1, text: 'bug' }, { id: 2, text: 'duplicate' }, { id: 3, text: 'invalid' }, { id: 4, text: 'wontfix' }];

$(".js-example-data-array").select2({
  data: data
})

$(".js-example-data-array-selected").select2({
  data: data
})
</script>

<select class="js-example-data-array"></select>

<select class="js-example-data-array-selected">
  <option value="2" selected="selected">duplicate</option>
</select>

2.select2异步加载远程数据
select2的异步加载数据使用的jquery的ajax进行加载

html

 <select class="form-control select2" style="width: 100%;" id="exmaple2" onchange="changeselect()" name="example2">
                                  <option value=""></option>
                                </select>

js
$("#example2").select2({
   theme: "bootstrap",
   language: "zh-CN",
   placeholder: "",
               placeholderOption: "first",
   allowClear: true,
ajax: {
url: "/getProducts",
dataType: 'json',
delay: 250,
type:"post",
data: function(params) {
var query = {
q: params.term,
pageSize:config.select2PageSize,
page: params.page
      }
return query;
},
processResults: function(data, params) {
params.page = params.page || 1;
var results = [];
$.each(data.items,function(i,v){
    var o ={};
    o.id=v.oid;
    o.oid=v.oid;
    o.productName=v.productName;
    o.comment=v.comment;
    results.push(o);
});

return {
results: results,
pagination: {
more: (params.page * config.select2PageSize) < data.total_count
}
};
},
cache: true
},
escapeMarkup: function(markup) {
return markup;
},
minimumInputLength: 1,
maximumInputLength:20,
templateResult: function(repo){
repo.id =repo.oid;
if(repo.comment!="")
{
repo.text =repo.productName+"("+repo.comment+")"; 
}
else
{
repo.text =repo.productName
}
if(repo.id==undefined)
{
return;
}

    var markup='<div class="clearfix" id='+repo.id+'>' + 
     '<div class="col-sm-20">' + repo.text + '</div>' + 
     '</div>';
return markup;
},
templateSelection: function(repo){
repo.selected = true;  
    repo.id = repo.oid;
    repo.productName = repo.text;
    if(repo.id == null || repo.id == ""){ 
        repo.text = ''; 
        repo.productName = repo.text; 
    }
    return repo.productName;
  }
});

参数项说明:

theme:select2采用的样式
language:select2使用的语言,可以实现select2的国际化
placeholder:select2默认的提示信息

placeholderOption:

allowClear:是否可以清楚选择项,true表示可以,false表示不可用

ajax

    url:代表请求的后端服务器地址

    datatype:返回的数据类型,一般采用json

    data:表示传递给后端的参数。可以支持多个参数传递

    var select2PageSize=10;

     eg:  data: function(params) {
                            var query = {
                                    q: params.term,
                                    pageSize:select2PageSize,
                                    page: params.page
                                  }
                            return query;
                        }

 

     pagesize:每页显示数据的大少。

     page:当前是第几页。

 

processResults:服务端返回的结果。

 

processResults: function(data, params) {
params.page = params.page || 1;
var results = [];
$.each(data.items,function(i,v){
    var o ={};
    o.id=v.oid;
    o.oid=v.oid;
    o.name=v.name;
    o.comment=v.comment;
    results.push(o);
});

 

return {
                                results: results,
                                pagination: {
                                    more: (params.page * select2PageSize) < data.total_count
                                }
                            };

 

服务端返回数据的格式:{

items:{[

 {'zhangsan1','1'}, {'zhangsan2','2'}, {'zhangsan3','3'},

]}

total_count:15

}

 

select2需要的数据格式中必须包含id属性,否则出来的select2组件会遇到不能选择下拉值的问题,所以需要重新分装返回的结果信息。

 

pagination:是否采用分页加载处理。

 

escapeMarkup:特殊的格式化处理。

multiple:multiple 实现多选

minimumInputLength:最少输入的字符数的长度

maximumInputLength:最大输入字符数的长度

templateResult:格式化服务端返回的结果,可以支持图文结合的方式。

templateSelection:选择下拉值的格式化处理函数。

 

 

 

 

   

 

 

 

 

 

 

 

 

 

 

在使用 `el-tree-select` 组件时,若需实现异步加载数据的功能,可以通过结合 `el-select` 和 `el-tree` 的方式来实现。虽然 Element UI 本身并未提供 `el-tree-select` 组件的原生异步加载支持,但通过自定义封装和利用 `el-tree` 的懒加载机制,可以实现类似的效果。 ### 实现思路 1. **使用 `el-select` 包裹 `el-tree`** 利用 `el-select` 提供下拉选择框,将 `el-tree` 嵌套在其内部作为下拉内容,实现树形结构的选择效果。 2. **开启懒加载模式(lazy mode)** `el-tree` 支持懒加载节点数据,通过设置 `lazy` 属性并配合 `load` 方法,可实现异步加载子节点数据。该方法适用于点击展开某个节点时请求接口获取子级数据。 3. **控制选中状态与层级信息返回** 在用户点击树节点后,可通过事件监听获取当前节点及其父节点信息,并结合单选逻辑处理。 ### 示例代码 以下是一个基于 Vue 2 和 Element UI 的示例实现: ```vue <template> <el-form-item label="选择节点"> <el-select v-model="selectedNode" placeholder="请选择" filterable :filter-method="handleFilter" clearable > <el-tree ref="tree" :props="props" :load="loadNode" lazy show-checkbox node-key="id" @check-change="handleCheckChange" :check-strictly="true" ></el-tree> </el-select> </el-form-item> </template> <script> export default { data() { return { selectedNode: '', props: { label: 'label', children: 'children', isLeaf: 'leaf' }, currentNode: null, parentNodes: [] }; }, methods: { // 懒加载节点 async loadNode(node, resolve) { if (node.level === 0) { const data = await this.fetchRootNodes(); // 获取根节点 this.$refs.tree.updateKey = Math.random(); return resolve(data); } if (node.level >= 1) { const data = await this.fetchChildNodes(node.data); // 根据当前节点请求子节点 return resolve(data); } }, // 获取根节点数据 fetchRootNodes() { return new Promise(resolve => { setTimeout(() => { resolve([ { id: 1, label: '一级节点1', leaf: false }, { id: 2, label: '一级节点2', leaf: false } ]); }, 500); }); }, // 获取子节点数据 fetchChildNodes(parentNode) { return new Promise(resolve => { setTimeout(() => { resolve([ { id: parentNode.id * 10 + 1, label: '子节点1', leaf: true }, { id: parentNode.id * 10 + 2, label: '子节点2', leaf: true } ]); }, 500); }); }, // 筛选方法 handleFilter(value) { this.$refs.tree.filter(value); }, // 节点点击或勾选变化 handleCheckChange(currentNode, isChecked) { if (isChecked) { this.selectedNode = currentNode.label; this.currentNode = currentNode; this.parentNodes = this.getParentNodes(currentNode); } }, // 获取父节点路径 getParentNodes(node) { let parents = []; let current = node.parent; while (current && current.level > 0) { parents.unshift(current.data); current = current.parent; } return parents; } } }; </script> ``` ### 功能说明 - **异步加载**:通过 `load` 方法实现懒加载,每次展开非叶子节点时触发异步请求。 - **过滤功能**:结合 `filter-method` 实现模糊搜索,提升用户体验。 - **节点选中与父子关系**:通过 `check-change` 事件获取当前选中节点及所有父节点信息,满足业务需求中的层级返回要求。 - **单选控制**:通过 `check-strictly` 配合手动管理选中状态,实现单选效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值