구성 요소가 제어되지 않는 자동 완성을 제어하도록 변경하고 있습니다.
"A component is changed a complete uncontrolled Autocomplete to controlled" (컴포넌트가 제어되지 않은 자동완료를 제어하도록 변경 중) 오류가 발생하는 이유를 알려 주시겠습니까?요소는 제어되지 않은 상태에서 제어되지 않은 상태로 전환되지 않아야 합니다(또는 그 반대도 마찬가지입니다.컴포넌트 수명 동안 제어된 요소와 제어되지 않은 요소 중 하나를 사용할지 결정합니다."
컴포넌트:
function AutoComplete(props) {
  const defaultProps = {
    options: props.options,
    getOptionLabel: option => option.name,
  };
  const handleChange = (e, value) => {
    props.onChange(value);
  };
  return (
    <Autocomplete
      {...defaultProps}
      renderInput={params => (
        <TextField {...params} label={props.label} margin="normal" />
      )}
      onChange={handleChange}
      value={props.value}
    />
  );
}
자동 컴퓨팅 호출:
               <Controller
                control={control}
                name = 'country'
                as = {
                  <AutoComplete
                    options={countryOptions}
                    onChange={selectCountryHandler}
                    label="Country"
                    value={selectedCountry  || ''}
                  />
                } />
어떻게 하면 이 오류를 해결할 수 있을까요?
값 속성이 정의되지 않았음을 확인했지만 inputValue에 대해서도 동일한 작업을 수행해야 했습니다.
- value/onChange 소품 조합을 사용하여 "value" 상태를 표시합니다.이 상태는 예를 들어 Enter 키를 누를 때 사용자가 선택한 값을 나타냅니다.
- inputValue/onInputChange 소품 조합으로 "input value" 상태.이 상태는 텍스트 상자에 표시되는 값을 나타냅니다.
⚠132 이 두 상태는 격리되어 있으므로 독립적으로 제어해야 한다.
inputValue 속성이 정의되지 않은 경우 컴포넌트가 제어되지 않으며 그 반대도 마찬가지입니다.
다음 예제에서 빈 문자열을 삭제한 경우React.useState('')첫 번째 렌더링 중 inputValue는 다음과 같기 때문에 동일한 오류 메시지가 나타납니다.undefined.
import React from 'react'
import TextField from '@material-ui/core/TextField'
import Autocomplete from '@material-ui/lab/Autocomplete'
const options = ['Option 1', 'Option 2']
export default function AutocompleteLab() {
  const [value, setValue] = React.useState(options[0])
  const [inputValue, setInputValue] = React.useState('')
  return (
    <div>
      <div>{`value: ${value !== null ? `'${value}'` : 'null'}`}</div>
      <div>{`inputValue: '${inputValue}'`}</div>
      <br />
      <Autocomplete
        value={value}
        onChange={(_, newValue) => {
          setValue(newValue)
        }}
        inputValue={inputValue}
        onInputChange={(_, newInputValue) => {
          setInputValue(newInputValue)
        }}
        options={options}
        style={{ width: 300 }}
        renderInput={(params) => <TextField {...params} label="Name" variant="outlined" />}
      />
    </div>
  )
}
값을 선택하지 않은 경우 다음을 추가해야 합니다.|| null자동 완성이 제어되지 않는 모드로 전환되는 것을 방지하려면:
<Autocomplete {...props} value={props.value || null} />
합격하면value={undefined}Autocomplete 컴포넌트는 "제어되지 않음" 모드로 시작됩니다. 즉, 자체 내부 상태를 유지합니다.나중에 a를 제공하면value"A component is changing" 오류가 발생합니다.하지만 당신이 합격한다면value={null}대신value={undefined}자동 완성이 제어 모드로 시작됩니다.Autocomplete(자동완료)는 사용자가 자신의 상태를 유지하는 것이 아니라 상태를 제공한다고 가정하고 오류가 사라집니다.
이 문제를 해결하려면default value.
             <Autocomplete
                multiple
                id="multiple-limit-tags"
                options={(option) => option.label}
                getOptionLabel={(option) => option}
                // defaultValue={options || []}
                renderInput={(params) => <TextField {...params} label="My Label" />}           
              />
이 문제를 해결하는 방법은 명확하지 않고 문서도 별로 도움이 되지 않습니다.이 문서의 복사 붙여넣기 예제가 이 오류를 발생시키는 것은 이상합니다.선택지가 하드코드로 되어있기 때문에 그 예가 효과가 있다고 생각합니다.
이전 답변은 전적으로 옳았습니다만, inputValue가 가치여야 한다는 것을 깨닫기 위해 20분 정도 시간을 할애하여 작업 예를 제시하겠습니다.
export default function AddModal(): ReactElement {
const [resource, setResource] = useState('one');
<Autocomplete
    id="autocomplete"
    options={['one', 'two']}
    defaultValue={resource}
    value={resource}
    PopperComponent={StyledPopper}
    onChange={(event, newInputValue) => setResource(newInputValue)}
    renderInput={(params) => <TextField {...params} />}
/>
오늘도 같은 문제가 있었습니다만, 디폴트값의 null과 존재하지 않는 경우의 null값을 지정함으로써 해결할 수 있었습니다.나에게 효과가 있었던 코드를 남깁니다.
<Autocomplete
    value={filters.tag || null}
    defaultValue={null}
    options={tags || []}
    getOptionLabel={(option) => option}
    renderInput={(params) => (
        <TextField {...params} label="Search" variant='outlined' size='small' />
    )}
    fullWidth
    onChange={(event, value) => {
           if (value) {
               setFilters({ ...filters, tag: value });
           } else {
               setFilters({ ...filters, tag: '' });
           }
    }}
/>
언급URL : https://stackoverflow.com/questions/63295924/a-component-is-changing-an-uncontrolled-autocomplete-to-be-controlled
'programing' 카테고리의 다른 글
| 스프링 부트 메모리 사용량을 줄이는 방법 (0) | 2023.03.06 | 
|---|---|
| 스프링 부팅에서 enableLoggingRequestDetails='true'를 설정하는 방법 (0) | 2023.03.06 | 
| Angular의 선택적 종속성JS (0) | 2023.03.06 | 
| 배열하는 방법이 있습니다.반작용으로 합류하다 (0) | 2023.03.06 | 
| Wordpress 웹 사이트가 마이그레이션 후 이전 URL로 리디렉션됨 (0) | 2023.03.06 |