【Vue3+Vite+TS】12.0 组件九:城市选择
Author: 图恩Category: 编程开发Views: 853Published: 2022-05-11 以下是针对该Vue组件代码的分析和优化建议:
---
### 一、核心功能分析
1. **弹出框交互**:
- 使用`el-popover`实现侧边栏弹出框,支持点击展开和关闭。
- 通过`visible`状态控制弹出框的显示/隐藏。
2. **搜索下拉框**:
- 使用`el-select`实现可搜索下拉框,支持`filterMethod`自定义过滤逻辑。
- 通过`@change`事件触发选中城市逻辑。
3. **数据处理**:
- 通过`Object.values(cities.value).flat(2)`获取所有城市数据。
- 使用`filterMethod`函数实现拼音+中文的搜索过滤。
---
### 二、优化建议
#### 1. **搜索下拉框性能优化**
- **问题**:`filterMethod`在数据量大时可能频繁调用`Array.prototype.filter`,导致性能下降。
- **解决方案**:
- 使用**防抖(debounce)**或**节流(throttle)**技术,限制过滤频率。
- 使用**数据预处理**,将搜索关键词与城市数据预先存储,避免实时过滤。
- 示例:
```js
const debounce = (fn, delay) => {
let timeoutId;
return (...args) => {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => {
fn(...args);
}, delay);
};
};
const filterMethod = debounce((val) => {
if (!val || val === '') {
options.value = allCityList.value;
} else {
options.value = allCityList.value.filter(item =>
item.name.includes(val) || item.spell.includes(val)
);
}
}, 300);
```
#### 2. **CSS样式优化**
- **问题**:`@import '@/style/mixins.scss'` 未明确指定类名空间,可能导致样式冲突。
- **解决方案**:
- 明确定义类名空间(如`bk--choose`),确保样式在组件内正确应用。
- 调整`el-scrollbar`的样式,确保滚动条在不同设备上显示正常。
- 示例:
```scss
.bk--choose-icon-dialog-body-height {
.el-dialog__body {
height: 5rem;
overflow-y: scroll;
overflow-x: auto;
}
}
```
#### 3. **交互体验提升**
- **问题**:搜索下拉框的`filterMethod`未处理空值情况。
- **解决方案**:
- 在`filterMethod`中添加空值判断,避免空字符串导致的过滤错误。
- 示例:
```js
const filterMethod = (val) => {
if (!val || val === '') {
return true; // 允许空值
} else {
return item.name.includes(val) || item.spell.includes(val);
}
};
```
#### 4. **代码可维护性改进**
- **问题**:重复代码(如`v-for`循环)可能导致维护困难。
- **解决方案**:
- 将循环逻辑提取为独立函数或使用Vue的`v-for`指令优化。
- 示例:
```js
const renderCityList = (data, key) => {
return data.map(item => (
{item.name}
));
};
```
---
### 三、关键代码示例
#### 1. **优化后的搜索过滤方法**
```js
const debounce = (fn, delay) => {
let timeoutId;
return (...args) => {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => {
fn(...args);
}, delay);
};
};
const filterMethod = debounce((val) => {
if (!val || val === '') {
return true; // 允许空值
} else {
return item.name.includes(val) || item.spell.includes(val);
}
}, 300);
```
#### 2. **优化后的CSS样式**
```scss
.bk--choose-icon-dialog-body-height {
.el-dialog__body {
height: 5rem;
overflow-y: scroll;
overflow-x: auto;
}
}
```
#### 3. **交互优化**
```js
const selectChange = (val) => {
let city = allCityList.value.find(item => item.id === val);
handleClickItem(city);
};
```
---
### 四、总结
通过优化搜索逻辑、提升代码可维护性、增强样式兼容性,可以显著改善组件的性能和用户体验。关键点包括:
- 使用防抖/节流控制过滤频率。
- 明确类名空间避免样式冲突。
- 优化数据处理逻辑提升效率。
建议进一步测试不同场景下的性能表现,并根据实际需求调整参数(如`debounce`延迟值)。