s-table和columns初始化不完整,造成table文件的filter报错

文章讲述了在开发过程中遇到的问题,涉及到了错误处理文件和Vue组件间的关联。作者追踪到错误源于`columnsSetting`的值问题,发现由于`columns`在`onMounted`后才被赋值为`ref([])`,导致组件渲染时为`null`而非`[]`。修正了这个问题后,S-table组件的错误得以解决。

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

问题

在这里插入图片描述

顺藤摸瓜找errorHandler.js文件

在这里插入图片描述
发现文件并没有什么问题

顺藤摸瓜找index.vue文件

在这里插入图片描述
首先找到报错的filter,发现与columnsSetting相关
在这里插入图片描述
找到columnsSetting发现等于columns
在这里插入图片描述
返回自己使用S-table组件的地方,发现columns初始化时仅初始化为ref()未表明格式以及未赋予初始数据,并且给columns赋值发生在onMounted
在这里插入图片描述
在方法initColumns中才给columns赋值
在这里插入图片描述
由此推断有可能是渲染问题,当组件渲染出来时,columnsnull并不为[]
请求完onMounted后,columns才被赋值。
尝试给columns 赋初始空值 const columns = ref([])
经测试后,发现推断正确,S-table不再报错。

### 实现 a-table 组件中父级与子集选中状态联动 为了使 `a-table` 中的父级子集选中状态能够相互关联,可以按照以下方式实现: #### 1. 初始化表格数据结构 确保每一行的数据项都包含一个表示是否被选中的属性(例如 `checked`),以及用于存储其子项的数组。 ```javascript const columns = [ { title: 'Name', dataIndex: 'name' }, // ...其他列定义 ]; // 表格初始数据 const data = ref([ { key: '1', name: 'Parent Item 1', children: [ { key: '1-1', name: 'Child Item 1' } ] }, // 更多数据... ]); ``` #### 2. 自定义 Checkbox 渲染器 通过自定义渲染函数来控制复选框的行为逻辑。当用户勾选某个项目时,会触发相应的事件处理程序更新该条目及其后代的状态;反之亦然——即当所有直系孩子都被选定时自动标记父亲为已选中。 ```vue <template> <a-checkbox :checked="record.checked" @change="(e) => handleCheck(e.target.checked, record)"> {{ record.name }} </a-checkbox> </template> <script setup lang="ts"> import { defineProps } from "vue"; defineProps({ record: Object, }); function handleCheck(isChecked: boolean, item: any): void { setItemAndChildrenSelection(item, isChecked); } function setItemAndChildrenSelection(item: any, checkedState: boolean): void { item.checked = checkedState; if (item.children && Array.isArray(item.children)) { item.children.forEach((childItem: any) => setItemAndChildrenSelection(childItem, checkedState)); } updateParentSelectionStatus(item.parentKey); // 更新上级的选择状况 } </script> ``` #### 3. 处理父节点的选择情况 每当更改任意一项的选中状态之后,都需要重新评估并调整它所属组别的根部成员所处的位置。具体来说就是检查当前节点是否有兄弟姐妹也被选择了,并据此决定要要改变它们共同拥有的直接上层管理者的“全选”标志位。 ```typescript let parentKeysWithPendingUpdates = new Set(); function updateParentSelectionStatus(parentKey?: string | number): void { if (!parentKey || !data.value.some(d => d.key === parentKey)) return; let allChildrenSelected = true; const directChildrenOfThisParent = getDirectChildrenByParentKey(parentKey); for (const child of directChildrenOfThisParent) { if (!child.checked) { allChildrenSelected = false; break; } } const parentNode = findNodeByKey(data.value, parentKey); parentNode.checked = allChildrenSelected; if (parentNode.parentKey !== undefined) { parentKeysWithPendingUpdates.add(parentNode.parentKey); } [...parentKeysWithPendingUpdates].forEach(keyToUpdate => updateParentSelectionStatus(keyToUpdate)); parentKeysWithPendingUpdates.clear(); } function getDirectChildrenByParentKey(parentKey: string | number): any[] { return data.value.filter(node => node.parentKey === parentKey); } function findNodeByKey(nodes: any[], targetKey: string | number): any { for (const node of nodes) { if (node.key === targetKey) return node; if (node.children?.length > 0) { const resultFromSubtreeSearch = findNodeByKey(node.children, targetKey); if (resultFromSubtreeSearch) return resultFromSubtreeSearch; } } } ``` 上述代码片段展示了如何构建一个简单的父子关系链表模型,并实现了基本的功能需求[^1]。需要注意的是实际应用环境中可能还需要考虑更多边界条件其他业务场景下的特殊要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coisini_甜柚か

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值