使用 Switch 样式有条件地禁用 material-table 的列
conditionally disable material-table's column with Switch style
我有一个包含 4-5 列的 material-table。
我允许用户使用 onRowAdd、onRowUpdate 和 onRowDelete 函数添加、编辑和删除行。一切似乎都运行良好,没有任何问题。唯一缺少的是 'status' 列的一些奇怪行为,它基本上是一个带有 Materil-ui 元素的开关。当用户删除一行时,状态列(Swtich 类型)仍处于启用状态,用户可以更改状态,从 UI 的角度来看这有点误导。即当用户删除了一行时,我希望禁用此 Swtich。我尝试了几个不同的选项,包括添加一个函数并从函数返回 'disabled' 文本,并按照下面的说明在列声明中使用它,但没有任何效果......有什么想法吗?
isDelete() 函数只是 returns 'disabled' 基于 rawStatus 值。 rawStatus 值在 onRowDelete() 承诺中设置。请参阅此 post
的末尾
const isDeleted = (data) => {
return data.rawStatus === "delete" ? "disabled" : "";
}
我的 'status' 列定义如下 ...
{
field: "status",
title: "Status",
editable: "never",
headerStyle: {
width: 50,
minWidth: 50,
whiteSpace: "nowrap",
},
render: (data, id) => (
<FormControlLabel
control={
<Switch
disabled={isDeleted(data)}
checked={data.status}
onChange={(e) => changeStatus(data, e)}
name="status"
color="primary"
/>
}
label={data.status ? "Active" : "Disabled"}
/>
),
}
我的 onRowDelete 函数如下所示,我将 rowStatus 元素值(在 API 中使用执行 required CRUD 操作)
onRowDelete: (oldData) =>
new Promise((resolve, reject) => {
setTimeout(() => {
const dataDelete = [...usersData];
const index = oldData.tableData.id;
if (oldData.recordStatus !== "existing") {
dataDelete.splice(index, 1);
setUsersData([...dataDelete]);
} else {
oldData.recordStatus = "delete";
oldData.disabled = true;
dataDelete[index] = oldData;
setUsersData([...dataDelete]);
}
resolve();
}, 1000);
}),
您的 isDeleted
函数正在返回字符串,但要禁用 Switch,我们应该返回 true 或 false 修改 isDeleted
如下
const isDeleted = (data) => { return data.rawStatus === "delete" ? true : false; }
正如我在你的 codesandbox 中看到的那样,你现在从 isDeleted
返回 true 或 false,这是正确的,但下一个问题是你在 isDeleted
函数中的条件,它被写为
return data.rawStatus==="delete"? true:false
但是在您的模式中 rawStatus
没有值,这就是它总是返回 false 并且您的切换按钮未被禁用的原因。
条件应该是
return data.recordStatus === "delete" ? true : false;
已更正 codesandbox link
我有一个包含 4-5 列的 material-table。
我允许用户使用 onRowAdd、onRowUpdate 和 onRowDelete 函数添加、编辑和删除行。一切似乎都运行良好,没有任何问题。唯一缺少的是 'status' 列的一些奇怪行为,它基本上是一个带有 Materil-ui 元素的开关。当用户删除一行时,状态列(Swtich 类型)仍处于启用状态,用户可以更改状态,从 UI 的角度来看这有点误导。即当用户删除了一行时,我希望禁用此 Swtich。我尝试了几个不同的选项,包括添加一个函数并从函数返回 'disabled' 文本,并按照下面的说明在列声明中使用它,但没有任何效果......有什么想法吗?
isDelete() 函数只是 returns 'disabled' 基于 rawStatus 值。 rawStatus 值在 onRowDelete() 承诺中设置。请参阅此 post
的末尾const isDeleted = (data) => {
return data.rawStatus === "delete" ? "disabled" : "";
}
我的 'status' 列定义如下 ...
{
field: "status",
title: "Status",
editable: "never",
headerStyle: {
width: 50,
minWidth: 50,
whiteSpace: "nowrap",
},
render: (data, id) => (
<FormControlLabel
control={
<Switch
disabled={isDeleted(data)}
checked={data.status}
onChange={(e) => changeStatus(data, e)}
name="status"
color="primary"
/>
}
label={data.status ? "Active" : "Disabled"}
/>
),
}
我的 onRowDelete 函数如下所示,我将 rowStatus 元素值(在 API 中使用执行 required CRUD 操作)
onRowDelete: (oldData) =>
new Promise((resolve, reject) => {
setTimeout(() => {
const dataDelete = [...usersData];
const index = oldData.tableData.id;
if (oldData.recordStatus !== "existing") {
dataDelete.splice(index, 1);
setUsersData([...dataDelete]);
} else {
oldData.recordStatus = "delete";
oldData.disabled = true;
dataDelete[index] = oldData;
setUsersData([...dataDelete]);
}
resolve();
}, 1000);
}),
您的 isDeleted
函数正在返回字符串,但要禁用 Switch,我们应该返回 true 或 false 修改 isDeleted
如下
const isDeleted = (data) => { return data.rawStatus === "delete" ? true : false; }
正如我在你的 codesandbox 中看到的那样,你现在从 isDeleted
返回 true 或 false,这是正确的,但下一个问题是你在 isDeleted
函数中的条件,它被写为
return data.rawStatus==="delete"? true:false
但是在您的模式中 rawStatus
没有值,这就是它总是返回 false 并且您的切换按钮未被禁用的原因。
条件应该是
return data.recordStatus === "delete" ? true : false;
已更正 codesandbox link