一个支持标签权限设置的列表,使用的是 antd 的 ProTable 、ProColumns 。table 有两个字段使用了 ProColumns 的 render,渲染成一个复选框,表示是否有选中。
下面是两列中的 render 内容。
{
title: formatMessage({id: "authority.role.field.maintenance"}),
width: 100,
dataIndex: 'roleTagAcl',
hideInSearch: true,
render: (value: number, record) => {
const checked = ((record.roleTagAcl & 1) === 1);
console.log("(value & 1) === 1",record.serviceCode,record.roleTagAcl,checked)
return <Checkbox name="binding"
defaultChecked={checked}
onChange={(value) => handleBoxChange(value,record)}></Checkbox> ;
},
},
{
title: formatMessage({id: "authority.role.field.binding"}),
width: 100,
dataIndex: 'roleTagAcl',
hideInSearch: true,
render: (value: number, record) => {
const checked = ((record.roleTagAcl & 2) === 2);
console.log("(value & 2) === 2",record.serviceCode,record.roleTagAcl,checked)
return <Checkbox name="binding"
defaultChecked={checked}
onChange={(value) => handleBoxChange(value,record)}></Checkbox> ;
},
},
现在有几个问题
1
lalalaqwer 2021-10-14 12:22:41 +08:00
1 因为每条数据渲染都会输出日志,所以你可以看到多次日志
2 查询的时候,可能先触发了一次渲染,所以输出所有日志,然后有结果了再渲染查询的结果,所以后输出指定的日志 3 系统的优化问题,你渲染的组件存在着复用的情况,所以跟第一条的结果看着是一样的 4 跟 2 一样的 以前用过 antd, 那时候没有 Pro-XXX 的,没有代码,以上都是我瞎猜的 |
2
admol OP @lalalaqwer
你说的 1 我能理解,但是我查询结果就一条时,也看到了多次日志输出,为什么 render 里面要执行多次呢?对应的日志不应该也只是输出一条吗。 你说的 2,为什么要先出发一次渲染呢?第三点的复用我也不是很明白,现在我也是在猜,不咋懂。 大佬再看下我 append 的例子,日志也是多次输出 |
3
lalalaqwer 2021-10-14 13:30:43 +08:00 1
@admol
看了你贴的例子,我也发现了,初始进去的时候同一条记录会有两次日志输出。想去看看源码,hooks 看得人头大,试着把 antd 降到没有用 hooks 的 3.X 版本后就只有一次渲染了,可以猜这个是组件中用了 hooks 但是有地方没做优化导致的二次渲染。然后为什么要先触发一次渲染也可能是这个问题吧,你查询的时候改变了一些东西,然后在结果出来之前触发了一次渲染 3 的话你这个因为是 defaultChecked,应该是 antd 的特性,第一次渲染的时候预设的值。后面渲染的时候组件不是整个重新渲染的,只修改了改变的部分数据的渲染,而预设值只是第一次有效 |