全屏el-select下拉
时间: 2024-06-07 19:05:00 浏览: 105
* 全屏 el-select 下拉
* 实现方法
* 固定位置
* 宽高 100%
* 控制样式
* `popper-class`属性
* 示例代码
* `.select-container`样式
* `fullscreen-dropdown`类样式
* 变更范围
* 布局调整
* 自定义外观
* 注意事项
* 浏览器兼容性
* 动态内容高度适应
* 应用场景
* 寻找选项时全屏显示
* 数据量大时用户体验提升
相关问题
el-select不让点击空白区域关闭下拉框
### 防止 Element UI 的 `el-select` 组件在点击页面其他地方时不关闭下拉菜单
Element UI 中的 `el-select` 组件默认行为是在点击页面上的任意位置时自动收起下拉菜单。为了改变这一行为,可以通过自定义事件监听和控制来实现。
#### 方法一:通过修改组件内部逻辑
一种方法是重写或扩展 `el-select` 组件的行为,使其忽略外部点击触发隐藏的功能。这通常涉及到对源码的理解以及可能需要覆盖某些私有属性或函数。不过这种方法较为复杂且容易受到未来版本更新的影响[^1]。
另一种更推荐的方法如下:
#### 方法二:利用原生 JavaScript 和 CSS 解决方案
可以采用简单的解决方案,在打开状态下阻止冒泡到文档级别的点击事件处理程序。具体做法如下所示:
```javascript
// 假设 select 实例挂载到了 this.$refs.select 上
this.$nextTick(() => {
const selectWrapper = document.querySelector('.el-select-dropdown__wrap');
// 添加一个标志变量用于判断是否应该保持弹窗开启
let shouldKeepOpen = false;
function handleDocumentClick(event) {
if (shouldKeepOpen && !selectWrapper.contains(event.target)) {
event.stopPropagation();
return;
}
// 如果不是目标元素,则执行原有逻辑
if (!selectWrapper.contains(event.target)) {
// 执行原有的 clickoutside 处理逻辑...
} else {
// 设置 flag 表明当前处于特殊模式
shouldKeepOpen = true;
}
}
// 监听全局点击事件并应用上述逻辑
document.addEventListener('click', handleDocumentClick);
// 清除监听器以避免内存泄漏等问题
this.$once('hook:beforeDestroy', () => {
document.removeEventListener('click', handleDocumentClick);
});
});
```
此代码片段展示了如何拦截点击事件,并根据条件决定是否继续传播该事件给父级节点。当满足特定情况(即希望保留弹出层可见的情况下),则调用 `event.stopPropagation()` 来中断事件链路,从而达到不让顶层处理器接收到点击通知的效果。
需要注意的是,以上方式适用于大多数场景下的需求调整;但对于一些特殊情况比如全屏模式下可能出现的问题,则还需要额外考虑兼容性因素[^2]。
对于动态渲染的选择框来说,确保每次创建新的实例时都正确设置了这些钩子是非常重要的,这样才能保证所有新添加的选择框都能按照预期工作而不受之前设置影响[^3]。
<u-modal :ref="`senPi`" :size="`huge`" :is-heading-slot-empty="true"> <template #title> <u-text :text="`报价详情`"></u-text> </template> <template #body> <u-linear-layout direction="vertical" wrap> <u-form :layout="`inline`" key="form_13"> <u-form-item :layout="`center`"> <template #label> <u-text :text="`供应商id`"></u-text> </template> <u-select :clearable="true" :placeholder="`请选择供应商id`" :dataSource="__select_20_handleDataSourceLoad()" :pageSize="50" :textField="`supplier.name`" :valueField="`supplier.name`" :pagination="true" :value.sync="filter2.supplierId" :emptyValueIsNull="true" key="select_20" > <template #option="current"></template> <template #renderFooter></template> </u-select> </u-form-item> <u-form-item :layout="`center`"> <template #label> <u-text :text="`最终供应商`"></u-text> </template> <u-select :clearable="true" :value.sync="filter2.finalSupplier" :placeholder="`请选择最终供应商`" :dataSource="$utils['EnumToList']({ concept: 'TypeAnnotation', typeKind: 'reference', typeNamespace: 'app.enums', typeName: 'Is_Final_Supplier', inferred: false, ruleMap: {}, typeArguments: [] })" :emptyValueIsNull="true" key="select_22" > <template #option="current"></template> <template #renderFooter></template> </u-select> </u-form-item> <u-form-item :layout="`center`" :labelSize="`auto`"> <u-button :color="`primary`" :text="`查 询`" @click="onQueryClick($event)"></u-button> </u-form-item> </u-form> <!-- 树形表格,支持折叠子表 --> <el-table :data="treeData" row-key="id" :tree-props="{ children: 'quotedPrices', hasChildren: 'hasChildren' }" border style="--cw-style-font-size: 10px; font-size: 10px; --table-view-th-padding: 1px; --table-view-td-padding: 1px; --table-cell-padding: 0px" > <!-- 展开列 --> <el-table-column type="expand" label="展开" width="50" :expandable="(row) => Array.isArray(row.quotedPrices) && row.quotedPrices.length > 0" :expanded="(row) => row.isExpanded" @expand-change="handleExpandChange" ></el-table-column> <el-table-column prop="materialApplyId" label="物料申请单id" width="150"></el-table-column> <el-table-column prop="supplierId" label="供应商id" width="150"></el-table-column> <el-table-column prop="finalSupplier" label="最终供应商" width="150"></el-table-column> <!-- 子表格:报价详情 --> <el-table-column label="报价详情" width="300"> <template #default="scope"> <el-table v-if="Array.isArray(scope.row.quotedPrices) && scope.row.quotedPrices.length > 0" :data="scope.row.quotedPrices" style="width: 100%; font-size: 10px;" border > <el-table-column prop="times" label="报价次数" width="100"></el-table-column> <el-table-column prop="price" label="报价价格" width="100"></el-table-column> <el-table-column prop="lastPrice" label="是否最终报价" width="100"></el-table-column> </el-table> </template> </el-table-column> </el-table> </u-linear-layout> </template> </u-modal>
<think>好的,我现在需要仔细分析用户提供的这段Vue组件代码,理解它的结构和功能,然后向用户解释清楚。首先,我会先通读整个代码,了解这是一个模态框组件,内部包含表单和表格,用于展示报价详情。
首先,注意到用户使用了`<u-modal>`组件,这个组件引用了`senPi`,尺寸设置为huge,并且标题部分使用了插槽。标题是“报价详情”,通过`<u-text>`组件显示。接下来,模态框的主体部分包含一个垂直布局的线性布局,里面有一个表单和树形表格。
表单部分有三个表单项:供应商ID、最终供应商和查询按钮。供应商ID使用了`u-select`组件,数据源来自`__select_20_handleDataSourceLoad()`方法,可能是一个异步加载的下拉选项,分页显示,每页50条。这里需要注意`textField`和`valueField`都绑定到`supplier.name`,可能是一个对象数组,显示名称并提交名称作为值。不过通常情况下,valueField应该使用唯一的ID,比如`supplier.id`,这里可能需要确认是否有误。
第二个表单项是最终供应商,同样使用`u-select`,数据源通过`$utils['EnumToList']`生成,引用了枚举类型`app.enums.Is_Final_Supplier`,说明这是一个枚举值的选择,可能包括“是”和“否”或其他状态。这里的数据绑定到`filter2.finalSupplier`,用于过滤条件。
查询按钮绑定了`@click`事件,触发`onQueryClick`方法,应该会根据表单中的筛选条件获取数据。
接下来是树形表格部分,使用了`el-table`,数据源是`treeData`,支持行展开显示子表格。每行数据通过`row-key="id"`唯一标识,树形结构配置指定了子节点字段为`quotedPrices`,判断是否有子节点的字段是`hasChildren`。展开列的类型是`expand`,当行的`quotedPrices`数组有元素时显示展开按钮,并且通过`expanded`属性控制是否展开,触发`handleExpandChange`事件。
表格列包括物料申请单ID、供应商ID、最终供应商,以及一个嵌套的报价详情子表格。子表格在父表格的“报价详情”列中显示,数据来自父行的`quotedPrices`数组,包含报价次数、报价价格和是否最终报价。
在样式方面,注意到内联样式设置了较小的字体和紧凑的内边距,可能是为了在有限空间内显示更多内容。同时,子表格也继承了类似的紧凑样式。
潜在问题点:供应商ID的下拉选择可能绑定的是`supplier.name`作为valueField,这可能导致选择后的值存储的是名称而非ID,是否应该使用`supplier.id`?需要根据业务逻辑确认。此外,树形表格的数据结构是否正确,比如`quotedPrices`是否为数组,以及`hasChildren`是否正确设置,可能会影响展开功能。另外,事件处理函数`onQueryClick`和`handleExpandChange`是否在组件中有定义,需要确保逻辑正确。
总结,这个组件是一个包含筛选条件和树形展示的报价详情模态框,用户可以通过供应商和最终供应商状态过滤数据,展开行查看详细的报价历史记录。在实现时需要注意数据绑定的正确性和事件处理的逻辑。</think>这个代码片段是一个基于Vue框架实现的模态框组件,主要用于展示供应商报价的详细信息。以下分步骤解析其核心结构和功能:
---
### **一、模态框基础结构**
```html
<u-modal :ref="`senPi`" :size="`huge`" :is-heading-slot-empty="true">
<template #title>...</template>
<template #body>...</template>
</u-modal>
```
- **功能**: 定义一个全屏大弹窗(`huge`尺寸)
- **关键属性**:
- `ref="senPi"`: 组件引用标识,便于父组件调用
- `is-heading-slot-empty="true"`: 隐藏默认标题栏样式
---
### **二、标题区域**
```html
<template #title>
<u-text :text="`报价详情`"></u-text>
</template>
```
- **作用**: 显示固定标题"报价详情"
---
### **三、主体内容区域**
#### **1. 筛选表单**
```html
<u-form :layout="`inline`" key="form_13">
<!-- 供应商ID下拉 -->
<u-select
:dataSource="__select_20_handleDataSourceLoad()"
:textField="`supplier.name`"
:valueField="`supplier.name`"
:value.sync="filter2.supplierId"
></u-select>
<!-- 最终供应商枚举选择 -->
<u-select
:dataSource="$utils['EnumToList']({...app.enums.Is_Final_Supplier...})"
:value.sync="filter2.finalSupplier"
></u-select>
<!-- 查询按钮 -->
<u-button @click="onQueryClick"></u-button>
</u-form>
```
- **功能点**:
- **供应商ID筛选**: 通过异步加载供应商数据(`__select_20_handleDataSourceLoad()`)
- **最终供应商状态**: 绑定枚举类型`Is_Final_Supplier`(如:是/否)
- **查询逻辑**: 点击按钮触发`onQueryClick`方法,使用`filter2`对象中的条件过滤数据
---
#### **2. 树形表格展示**
```html
<el-table
:data="treeData"
row-key="id"
:tree-props="{ children: 'quotedPrices', hasChildren: 'hasChildren' }"
>
<!-- 展开子表格 -->
<el-table-column type="expand">
<el-table :data="scope.row.quotedPrices">
<el-table-column prop="times" label="报价次数"/>
<el-table-column prop="price" label="报价价格"/>
<el-table-column prop="lastPrice" label="是否最终报价"/>
</el-table>
</el-table-column>
<!-- 父级信息 -->
<el-table-column prop="materialApplyId" label="物料申请单id"/>
<el-table-column prop="supplierId" label="供应商id"/>
<el-table-column prop="finalSupplier" label="最终供应商"/>
</el-table>
```
- **数据结构**:
- 父级数据包含`materialApplyId`等字段
- 子级数据通过`quotedPrices`数组嵌套,记录每次报价详情
- **交互特性**:
- 展开箭头控制子表格显隐
- `hasChildren`字段决定是否显示展开按钮
- **样式优化**:
- 紧凑布局(`font-size: 10px`)
- 内边距微调确保信息密度
---
### **四、潜在注意事项**
1. **数据绑定问题**:
- 供应商ID选择器的`valueField`绑定的是`supplier.name`,可能导致提交值为名称而非ID,建议检查是否需要改为`supplier.id`
2. **枚举类型映射**:
- `Is_Final_Supplier`枚举需确保在服务端正确定义,否则下拉选项可能显示异常
3. **性能优化**:
- 树形表格嵌套可能导致渲染性能下降,建议对大数据量做虚拟滚动或分页处理
---
### **五、典型使用场景**
1. 采购人员查看不同供应商的历史报价记录
2. 对比同一物料申请单下多个供应商的报价详情
3. 标记并筛选最终合作供应商
通过这个组件,用户可以高效完成供应商报价的筛选、展开查看明细等操作,适合复杂供应链管理场景。
阅读全文
相关推荐










