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

如何创建包含Input与Select的Material UI自定义复用组件?

实现Material UI + React + TypeScript 自定义Input&Select组合复用组件

核心思路

基于Material UI组件封装,用Box作为容器实现Input与Select的并排布局,通过TypeScript定义通用Props保证复用性与类型安全,允许外部传入各组件的原生属性以适配不同场景。

步骤1:定义组件Props类型

先通过TypeScript明确组件接收的属性,让Input、Select和容器Box都能透传各自的原生Props,同时保留扩展能力:

import { BoxProps, InputProps, SelectProps } from '@mui/material';

// 组合组件的Props类型
type CombinedInputSelectProps = {
  // Input组件的原生属性
  inputProps: InputProps;
  // Select组件的原生属性
  selectProps: SelectProps;
  // 容器Box的原生属性(可选,用于自定义布局样式)
  boxProps?: BoxProps;
};

步骤2:实现组合组件

创建CombinedInputSelect组件,用Box做容器设置默认并排布局,同时透传各组件的属性:

import React from 'react';
import { Box, Input, Select } from '@mui/material';

const CombinedInputSelect: React.FC<CombinedInputSelectProps> = ({
  inputProps,
  selectProps,
  boxProps = {},
}) => {
  return (
    <Box
      display="flex"
      gap={2} // 组件间默认间距,可通过boxProps覆盖
      alignItems="center"
      {...boxProps} // 透传容器属性,允许外部自定义样式
    >
      <Input {...inputProps} />
      <Select {...selectProps}>
        {selectProps.children}
      </Select>
    </Box>
  );
};

export default CombinedInputSelect;

步骤3:复用组件示例

在任意页面或组件中直接调用,传入各自的配置属性即可:

import CombinedInputSelect from './CombinedInputSelect';
import { MenuItem } from '@mui/material';
import { useState } from 'react';

const App = () => {
  const [selectedVal, setSelectedVal] = useState('');

  return (
    <div style={{ padding: '20px' }}>
      <CombinedInputSelect
        inputProps={{
          placeholder: '请输入内容',
          onChange: (e) => console.log('输入值:', e.target.value),
        }}
        selectProps={{
          value: selectedVal,
          onChange: (e) => setSelectedVal(e.target.value as string),
          placeholder: '请选择',
        }}
        // 自定义容器样式(可选)
        boxProps={{
          gap: 3,
          flexWrap: 'wrap',
        }}
      >
        <MenuItem value="opt1">选项1</MenuItem>
        <MenuItem value="opt2">选项2</MenuItem>
        <MenuItem value="opt3">选项3</MenuItem>
      </CombinedInputSelect>
    </div>
  );
};

export default App;

扩展优化建议

  • 全局样式统一:通过Material UI的ThemeProvider自定义主题,或给组件添加固定className覆盖默认样式。
  • 表单集成:若需和Formik、React Hook Form配合,可在组件内添加name属性并处理表单onChange逻辑,或直接透传表单相关属性。
  • 响应式适配:在boxProps中设置flexDirection: { xs: 'column', sm: 'row' },实现移动端垂直、桌面端水平的布局切换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:44:58