You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React+TypeScript中如何实现三个元素横向并排显示

解决三个元素横向并排的问题

问题出在你用普通<div>包裹了输入框和上传按钮的Grid item,MUI的Grid container仅对直接子级的Grid item生效,这个<div>会占据整行,导致内部两个Grid item上下堆叠。

修改方案一(推荐):移除包裹的<div>,让两个Grid item直接成为外层Grid container的子元素

直接去掉包裹两个Grid item的<div>,用React片段<>包裹条件渲染内的两个元素,这样外层Grid container的三个Grid item会自动横向排列:

return (
<Box padding={2}>
  <Typography variant="h4">
    <FormattedMessage defaultMessage="Add file" />
  </Typography>
  <Grid container alignItems="center" spacing={2} direction="row">
    <Grid item>
      <Button
        startIcon={<Search />}
        variant="contained"
        component="label"
        disabled={rulesFromFile.isLoading}
        onClick={() => setUploadedFile(undefined)}
      >
        <FormattedMessage defaultMessage="Choose file" />
        <input
          type="file"
          hidden
          onChange={(event: ChangeEvent<HTMLInputElement>) =>
            event.target.files && setSelectedFile(event.target.files[0])
          }
        />
      </Button>
    </Grid>
    {selectedFile && (!uploadedFile || rulesFromFile.isLoading) && (
      <>
        <Grid item>
          <form>
            <TextField
              type="text"
              size="small"
              style={{marginLeft: 4}}
              label="someNumber"
              variant="outlined"
              value={someNumber}
              onChange={e => setNumber(e.target.value)}
            />
          </form>
        </Grid>
        <Grid item>
          <LoadingButton
            startIcon={<Upload />}
            loadingPosition="start"
            variant="contained"
            color="secondary"
            style={{marginLeft: 4}}
            onClick={() => {
              selectedFile &&
                rulesFromFile.mutateAsync({
                  file: selectedFile,
                  someNumber: someNumber,
                });
              setUploadedFile(selectedFile);
            }}
            loading={rulesFromFile.isLoading}
          >
            <FormattedMessage defaultMessage="{fileName} upload" values={{fileName: selectedFile.name}} />
          </LoadingButton>
        </Grid>
      </>
    )}
  </Grid>
</Box>
);

修改方案二:将<div>替换为Grid container

把包裹两个Grid item的<div>改成Grid container,并添加item属性让它成为外层Grid的子元素,内部的Grid container会让两个元素横向排列:

return (
<Box padding={2}>
  <Typography variant="h4">
    <FormattedMessage defaultMessage="Add file" />
  </Typography>
  <Grid container alignItems="center" spacing={2} direction="row">
    <Grid item>
      <Button
        startIcon={<Search />}
        variant="contained"
        component="label"
        disabled={rulesFromFile.isLoading}
        onClick={() => setUploadedFile(undefined)}
      >
        <FormattedMessage defaultMessage="Choose file" />
        <input
          type="file"
          hidden
          onChange={(event: ChangeEvent<HTMLInputElement>) =>
            event.target.files && setSelectedFile(event.target.files[0])
          }
        />
      </Button>
    </Grid>
    {selectedFile && (!uploadedFile || rulesFromFile.isLoading) && (
      <Grid container alignItems="center" spacing={2} item>
        <Grid item>
          <form>
            <TextField
              type="text"
              size="small"
              style={{marginLeft: 4}}
              label="someNumber"
              variant="outlined"
              value={someNumber}
              onChange={e => setNumber(e.target.value)}
            />
          </form>
        </Grid>
        <Grid item>
          <LoadingButton
            startIcon={<Upload />}
            loadingPosition="start"
            variant="contained"
            color="secondary"
            style={{marginLeft: 4}}
            onClick={() => {
              selectedFile &&
                rulesFromFile.mutateAsync({
                  file: selectedFile,
                  someNumber: someNumber,
                });
              setUploadedFile(selectedFile);
            }}
            loading={rulesFromFile.isLoading}
          >
            <FormattedMessage defaultMessage="{fileName} upload" values={{fileName: selectedFile.name}} />
          </LoadingButton>
        </Grid>
      </Grid>
    )}
  </Grid>
</Box>
);

内容的提问来源于stack exchange,提问作者inconnu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:00:59