在开发体检管理系统的过程中,我遇到了一些颇具挑战性的问题,主要集中在弹窗与选项卡的切换交互以及数据搜索功能的实现上。这些问题不仅影响了系统的用户体验,也对系统的功能完整性提出了考验。通过对这些问题的深入剖析,我希望能够总结经验教训,为后续的开发工作提供参考,同时也希望能给遇到类似问题的开发者提供一些思路。
弹窗与选项卡切换问题
问题描述
在体检管理系统中,存在多个选项卡,分别展示体检套餐、体检项目和体检类型等不同信息。当用户点击新增、编辑等操作时,会弹出相应的弹窗进行数据录入或修改。然而,在弹窗与选项卡的切换过程中,出现了一系列问题。例如,在切换选项卡时,弹窗内的数据显示异常,没有根据当前选项卡的内容进行正确更新;或者在弹窗操作完成后,返回选项卡页面时,页面状态没有正确恢复,导致用户体验不佳。
以选项卡切换函数physical_change
为例:
function physical_change(target, element) {
$('.physical_title').css({
'background-color': 'white',
'color': 'black'
});
let patch = $('.physical_title');
patch.each(function () {
$(this).removeClass('light');
});
$(element).addClass('light');
if (target =='set_menu') {
apply();
$('.content').show();
$('.page_box').show();
$('.light').css('background-color', 'rgba(219, 235, 255, 1)');
$('.light').css('color', 'rgba(0, 110, 255, 1)');
$('#radio_menu').prop('checked', true);
$('#radio_type').prop('checked', false);
$('#menu_item').prop('checked', false);
$('.add_menu_box').show();
$('.add_content_box').hide();
$('.menu_item_box').hide();
} else if (target == 'project') {
phy_item();
$('.content').show();
$('.light').css('background-color', 'rgba(219, 235, 255, 1)');
$('.light').css('color', 'rgba(0, 110, 255, 1)');
$('#radio_menu').prop('checked', false);
$('#radio_type').prop('checked', false);
$('#menu_item').prop('checked', true);
$('.add_menu_box').hide();
$('.add_content_box').hide();
$('.menu_item_box').show();
} else if (target == 'item_type') {
phy_cls();
$('.content').show();
$('.light').css('background-color', 'rgba(219, 235, 255, 1)');
$('.light').css('color', 'rgba(0, 110, 255, 1)');
$('#radio_menu').prop('checked', false);
$('#radio_type').prop('checked', true);
$('#menu_item').prop('checked', false);
$('.add_menu_box').hide();
$('.add_content_box').show();
$('.menu_item_box').hide();
}
}
在新增弹窗的单选按钮点击事件handleRadioClick
中:
function handleRadioClick(target_type) {
let physical = $('.physical_title');
$('.add_content_box').hide();
$('.add_menu_box').hide();
$('.menu_item_box').hide();
$('#radio_type').prop('checked', false);
$('#radio_menu').prop('checked', false);
$('#menu_item').prop('checked', false);
if (target_type === 'type') {
$('.add_content_box').show();
$('#radio_type').prop('checked', true);
target_event = 'type';
physical_change('item_type', physical[2]);
} else if (target_type ==='menu') {
$('.add_menu_box').show();
$('#radio_menu').prop('checked', true);
physical_change('set_menu', physical[0]);
target_event ='menu';
} else if (target_type === 'item') {
$('.menu_item_box').show();
$('#menu_item').prop('checked', true);
target_event = 'item';
physical_change('project', physical[1]);
}
}
问题分析
从上述代码可以看出,在选项卡切换时,虽然通过physical_change
函数对页面元素的显示状态、样式以及相关数据的加载进行了处理,但对于弹窗与选项卡之间的协同工作考虑不足。在handleRadioClick
函数中,只是简单地根据单选按钮的点击来切换弹窗内不同区域的显示,没有充分考虑到选项卡切换对弹窗数据的影响。例如,当从体检套餐选项卡切换到体检项目选项卡时,弹窗内可能仍然显示着体检套餐相关的数据,而没有更新为体检项目的数据。这是因为在选项卡切换过程中,没有一个明确的机制来通知弹窗更新其内部数据,导致数据显示不一致。
解决思路
- 建立数据同步机制:在选项卡切换函数
physical_change
中,不仅要更新页面的显示状态和加载对应的数据,还要向弹窗发送一个信号,告知弹窗当前选项卡的类型。弹窗内部可以根据这个信号来更新自身的数据显示。例如,可以在弹窗中定义一个函数,用于根据选项卡类型更新数据,然后在physical_change
函数中调用这个函数。 - 使用状态管理:引入一个状态管理机制,如使用
sessionStorage
或自定义的状态对象,来记录当前选项卡的状态以及弹窗的状态。在选项卡切换和弹窗操作过程中,通过读取和更新这些状态来确保数据的一致性。例如,在physical_change
函数中,将当前选项卡的类型存储到sessionStorage
中,弹窗在加载或更新时读取这个值,从而决定显示哪些数据。 - 优化代码结构:将与选项卡和弹窗相关的代码进行整合和优化,使其结构更加清晰。例如,可以将选项卡切换、弹窗显示与隐藏以及数据更新等功能分别封装到不同的函数中,提高代码的可维护性和可读性。同时,在这些函数之间建立良好的通信机制,确保各个功能之间能够协同工作。
数据搜索功能问题
问题描述
在体检管理系统中,需要实现对不同选项卡数据的搜索功能。然而,由于所有的数据都渲染到了一个div
容器中,当用户在搜索框中输入关键词并执行搜索时,无法准确地对特定选项卡的数据进行筛选和显示。例如,在体检套餐选项卡中进行搜索时,可能会影响到体检项目选项卡和体检类型选项卡的数据显示,导致搜索结果不准确。
搜索函数handleSearch
如下:
function handleSearch() {
let doctorKeyword = $('#title').val();
let filter_Data = datas.filter(item => {
let doctorMatch =!doctorKeyword || item.name.toLowerCase().includes(doctorKeyword);
return doctorMatch;
});
k = 0;
if (sessionStorage.getItem('type_value') == 1) {
setTimeout(function () {
if (flag) {
applys(filter_Data);
}
}, 50);
} else if (sessionStorage.getItem('type_value') == 2) {
setTimeout(function () {
if (flag) {
phy_items(filter_Data);
}
}, 50);
} else if (sessionStorage.getItem('type_value') == 3) {
setTimeout(function () {
if (flag) {
phy_cls_item(filter_Data);
}
}, 50);
}
}
问题分析
在handleSearch
函数中,虽然根据sessionStorage.getItem('type_value')
来判断当前所在的选项卡,并尝试调用相应的渲染函数来显示搜索结果,但由于所有数据都在同一个div
容器中渲染,在数据筛选和更新时没有进行有效的隔离。filter_Data
是对所有数据datas
进行筛选,而没有区分不同选项卡的数据来源。这就导致在搜索时,可能会将其他选项卡的数据错误地包含在搜索结果中,或者在更新显示时影响到其他选项卡的正常显示。
解决思路
- 数据隔离与分组:在数据获取阶段,将不同选项卡的数据进行分组存储。例如,可以创建一个对象,其中每个属性对应一个选项卡的数据数组。在渲染数据时,从相应的数组中获取数据进行渲染。在搜索时,根据当前选项卡的类型,从对应的数组中进行数据筛选,确保搜索结果只与当前选项卡的数据相关。
- 使用唯一标识符:为每个选项卡的数据项添加唯一标识符,在搜索和数据更新时,通过标识符来确定数据所属的选项卡。这样在对数据进行筛选和操作时,可以准确地定位到特定选项卡的数据,避免不同选项卡数据之间的干扰。
- 优化搜索逻辑:在搜索函数中,根据当前选项卡的特点,定制化搜索逻辑。例如,在体检套餐选项卡中,可能需要根据套餐名称、价格等字段进行搜索;而在体检项目选项卡中,可能需要根据项目名称、所属套餐等字段进行搜索。通过为每个选项卡定义专门的搜索规则,提高搜索结果的准确性。
通过对这些问题的总结和分析,我深刻认识到在开发体检管理系统时,需要更加细致地考虑页面交互和数据处理的各个环节。只有通过优化代码结构、建立有效的数据同步机制以及完善搜索逻辑,才能提升系统的稳定性和用户体验,为用户提供更加高效、准确的体检管理服务。