React Material <Select> 与常规 HTML <input> 或 <select>

Posted

技术标签:

【中文标题】React Material <Select> 与常规 HTML <input> 或 <select>【英文标题】:React Material <Select> with regular HTML <input> or <select> 【发布时间】:2021-10-25 10:53:58 【问题描述】:

是否可以使用常规 html 或 React Material ?

我想使用材质选择,但它使用我的或。

我知道你有输入属性,但我没有让它工作。

<Select
            labelId="demo-customized-select-label"
            id="demo-customized-select"
            variant="outlined"
            className="form-control"
            input=<input /> // or <select>
          >
            clientAppContext.currentProfile?.profiles?.map((profile: Profile) => (
              <MenuItem key=profile.number value=profile.number>
                <div className="flex flex-col">
                  <span className="text-gray-900 text-sm">profile.name</span>
                  <span className="font-light text-gray-700 text-xs">profile.name - profile.number</span>
                </div>
              </MenuItem>
            ))
          </Select>

【问题讨论】:

你能给我们提供实际的错误吗?或者如果 MenuItem 中的 HTML 没有正确呈现,则截图 @Terminat 没有错误。 在那里,但是当我单击输入时没有任何反应。 相同 @Terminat 你有例子吗? 【参考方案1】:

我检查了它,使其开箱即用的唯一方法是使用 Material UI 提供的 Input。使用原生 HTML 输入元素是不可能的,因为它不知道如何处理 Select 提供的道具。

但是,您可以围绕此本机输入创建一个包装器。 Select 组件将注入您创建自己的自定义下拉菜单所需的所有道具。

查看我创建的这个示例。很抱歉没有正确设置它的样式,但我想专注于让它发挥作用。

记得将native 属性设置为false。否则,它将不允许您控制它是否打开。

App.js

import React,  useState  from 'react';

import Select from '@material-ui/core/Select';
import MenuItem from '@material-ui/core/MenuItem';
import Input from './Input';

function App() 
  const [age, setAge] = useState(10);
  const [isOpen, setIsOpen] = useState(false);
  console.log(isOpen);

  const handleChange = (event) => 
    setAge(event.target.value);
  
  return (
    <div className="App">
      <Select
        labelId="demo-simple-select-label"
        id="demo-simple-select"
        value=age
        onChange=handleChange
        style= width: 500 
        native=false
        open=isOpen
        inputComponent="input"
        inputProps= onClick: () => setIsOpen(true), onBlur: () => setIsOpen(false) 
        input=<Input />
      >
        <MenuItem value=50>
          <div className="flex flex-col">
            <span className="text-gray-900 text-sm">My name</span>
            <span className="font-light text-gray-700 text-xs">My name - 12</span>
          </div>
        </MenuItem>
        <MenuItem value=50>
          <div className="flex flex-col">
            <span className="text-gray-900 text-sm">My name</span>
            <span className="font-light text-gray-700 text-xs">My name - 13</span>
          </div>
        </MenuItem>
        <MenuItem value=50>
          <div className="flex flex-col">
            <span className="text-gray-900 text-sm">My name</span>
            <span className="font-light text-gray-700 text-xs">My name - 14</span>
          </div>
        </MenuItem>
      </Select>
    </div>
  );


export default App;

自定义输入元素 - 原生 HTML 元素的包装器

import React,  useState  from 'react';


function Input(props) 
  console.log(props);

  return (
    <>
      <input value=props.inputProps.value onClick=props.inputProps.onClick onBlur=props.inputProps.onBlur />
      props.inputProps.open ? props.inputProps.children : null
    </>

  );


export default Input;

【讨论】:

不幸的是,您的 sn-p 没有编译。试试看,谢谢 这里没有在 SO 上编译,因为我想分离组件。它应该在本地环境中工作。这里的问题是,导入不起作用。

以上是关于React Material <Select> 与常规 HTML <input> 或 <select>的主要内容,如果未能解决你的问题,请参考以下文章

React Material-UI Select未检测到滚动事件

React Material Multi Select 默认值未选中

Typescript React <Select> onChange 处理程序类型错误

在 react-datatable-component 中使用时,Material UI select throws event.target.getAttribute 不是函数

为 SelectField 显示空白菜单项的正确方法是啥(material-ui,react)

对 Material UI Select 组件的更改做出反应测试库