你能告诉我为什么我会得到错误"一个组件正在将一个不受控的自动完成更改为受控的。元素不应该从不受控切换到受控(反之亦然)。在组件的生命周期内决定使用受控或不受控的自动完成元素。"
组分:
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 || ''}
/>
} />
我怎样才能解决这个错误?
6条答案
按热度按时间dgenwo3n1#
您确保了value属性从未被定义过,但您必须对inputValue执行相同的操作。
1.带有value/onChange属性组合的“value”状态。此状态表示用户选择的值,例如按Enter键时。
这️两个状态是孤立的,它们应该被独立地控制。
未定义inputValue属性时,组件将变为不受控制,反之亦然。
如果在以下示例中从
React.useState('')
中删除空字符串,则将获得相同的错误消息,因为首次渲染期间的inputValue为undefined
。o8x7eapl2#
如果未选择任何值,则需要添加
|| null
以防止自动完成进入不受控模式:如果您将
value={undefined}
传递给自动完成组件,它将以“uncontrolled”模式启动,这意味着它保持自己的内部状态。然后,如果您稍后提供value
,它将引发“A component is changing”错误。但是,如果您传递value={null}
而不是value={undefined}
,则会导致自动完成以受控模式启动。自动完成将假定您将提供状态,而不是保持它自己,错误就会消失。z4iuyo4d3#
我通过删除
default value
解决了这个问题。如何解决这个问题并不明显,文档也没有多大帮助。我发现文档中的一个复制粘贴示例会导致这个错误,这很奇怪。我猜这个示例之所以有效,是因为选择是硬编码的。
d5vmydt94#
前面的答案是绝对正确的,但是我花了20分钟才算出inputValue应该是value,下面是我的工作示例:
soat7uwm5#
我今天遇到了同样的问题,但我能够通过提供一个默认值null以及在它不存在的情况下提供一个null值来解决它。我将留下对我有效的代码:
vm0i2vca6#
对于我来说,我通过更新
onChange
函数并添加|| null
而不是删除默认值修复了这个问题,因为我仍然需要它,下面是代码对于带有选项的自动完成,这是一个简单的数组,没有对象,你可以简单地这样做,你想得到任何问题
如果使用react-hook-form,则可以在
useForm
中设置默认值