如何在 Material UI v5 sx prop 中实现条件样式

ise*_*sea 26 reactjs material-ui

在 Material UI v5 的 prop 中寻找巧妙的条件样式sx。我玩过的一个例子是:

const statusStyle = (status) => {
  switch (status) {
    case "aborted":
      return "#D66460";
      break;
    case "queue":
      return "#6685F0";
      break;
    case "processing":
      return "#F0E666";
      break;
    default:
      return "#60D660";
  }
};

<TableRow
  key={job.job}
  sx={{ color: statusStyle(status) }}
>
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有人想出了更优雅的东西?

Nea*_*arl 55

如果它只是一个带有原始键的简单映射,您可以使用一个对象:

const statusColors = {
  aborted: '#D66460',
  queue: '#6685F0',
  processing: '#F0E666',
}
Run Code Online (Sandbox Code Playgroud)
sx={{ color: statusColors[job.status] ?? defaultColor }}
Run Code Online (Sandbox Code Playgroud)

如果您想有条件地传递样式对象,可以使用扩展语法...,这就是 MUI 团队将样式应用于具有不同变体和状态的组件的方式:

sx={{
  color: defaultColor,
  backgroundColor: defaultBgcolor,
  ...(job.status === 'aborted' && {
    color: color1,
    backgroundColor: bgcolor1,
  }),
  ...(job.status === 'queue' && {
    color: color2,
    backgroundColor: bgcolor2,
  }),
  ...(job.status === 'processing' && {
    color: color3,
    backgroundColor: bgcolor3,
  }),
}}
Run Code Online (Sandbox Code Playgroud)

  • 当我尝试像 statusColors[job.status] 这样的东西时,我得到“在类型 '{ aborted: string; 上找不到带有'string'类型参数的索引签名” 队列:字符串;处理:字符串;}` (2认同)

ata*_*min 6

这似乎对我有用

const [emailStatus, setEmailStatus] = useState('');
  const [emailStatusText, setEmailStatusText] = useState('');
  const [isEmailSubmitted, setIsEmailSubmitted] = useState(false);
Run Code Online (Sandbox Code Playgroud)

...

return response.json().then((data) => {
            const { success, error } = data;
            setEmailStatus(success ? 'success' : 'error');
            setEmailStatusText(success || error);
            return data;
          });
Run Code Online (Sandbox Code Playgroud)

...

{isEmailSubmitted && (
              <Typography
                sx={{
                  textAlign: 'left',
                  color:
                    emailStatus === 'success'
                      ? theme.palette.success.main
                      : theme.palette.error.main,
                }}
              >
                {emailStatusText}
              </Typography>
            )}
Run Code Online (Sandbox Code Playgroud)