reactjs MUI自定义文本字段在状态更改时失去焦点

7xzttuei  于 2022-12-12  发布在  React
关注(0)|答案(3)|浏览(178)

我正在使用MUI库创建我的React Js应用程序。
在这里,我使用受控的文本字段组件创建一个简单的搜索UI。
但是有一点很奇怪,Text Field组件在改变值后失去了焦点这是我第一次遇到这个问题,我以前从来没有遇到过这个问题。
"这是怎么发生的?解决方案是什么"
下面是代码和操场:是吗?
注意:如果我从代码中删除了breakpoint typeText Field组件在其值更改后仍然会失去焦点。

xdyibdwo

xdyibdwo1#

这是因为您在另一个组件中定义了一个组件,因此每次呈现组件时都会重新创建组件定义(而每次用户键入输入时,您的组件都会呈现)。
两种解决方案:
1.不要将其作为单独的组件。
代替:

const MyComponent = () => {
  const MyInput = () => <div><input /></div>; // you get the idea

  return (
    <div>
      <MyInput />
    </div>
  );
};

应执行:

const MyComponent = () => {    
  return (
    <div>
      <div><input /></div> {/* you get the idea */}
    </div>
  );
};

1.在其父零部件外部定义零部件:

const MyInput = ({value, onChange}) => (
  <div>
    <input value={value} onChange={onChange} />
  </div>
);

const MyComponent = () => {
  const [value, setValue] = useState('');

  return (
    <div>
      <MyInput
        value={value}
        onChange={event => setValue(event.target.value)}
      />
    </div>
  );
};
rbpvctlc

rbpvctlc2#

对于MUI V5
已将自定义样式的代码移到组件之外
例如:

import React from 'react';
import { useTheme, TextField, styled } from '@mui/material'; 
import { SearchOutlined } from '@mui/icons-material';

interface SearchInputProps {   placeholder?: string;   onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;   value: string; dataTest?: string; }

const StyledSearchInput = styled(TextField)(({ theme }: any) => {   return {
    '& .MuiOutlinedInput-root': {
      borderRadius: '0.625rem',
      fontSize: '1rem',
      '& fieldset': {
        borderColor: `${theme.palette.text.secondary}`
      },
      '&.Mui-focused fieldset': {
        borderColor: `${theme.palette.primary}`
      }
    }   }; });

const SearchInput: React.FC<SearchInputProps> = ({   placeholder = 'Search...',   onChange,   value,   dataTest,   ...props }) => {   const theme = useTheme();

  return (
    <StyledSearchInput
      {...props}
      onChange={onChange}
      placeholder={placeholder}
      variant="outlined"
      value={value}
      inputProps={{ 'data-testid': dataTest ? dataTest : 'search-input' }}
      InputProps={{
        startAdornment: (
          <SearchOutlined
            sx={{ color: theme.palette.text.secondary, height: '1.5rem', width: '1.5rem' }}
          />
        )
      }}
    />   ); };

export default SearchInput;
inb24sb2

inb24sb23#

注意你的组件的键,如果你把动态值设置为键属性,也会导致焦点丢失。

{people.map(person => (
    <div key={person.name}>
      <Input type="text" value={person.name} onChange={// function which manipulates person name} />
    </div>
))}

相关问题