[英]React error: from controlled to uncontrolled component
編輯:此問題被某些用戶標記為重復。 不知道他們在這樣做之前是否已閱讀過。 如果有人這樣做,請說明在什么意義上是重復的。
我有一個復選框組件:
class Checkbox extends Component {
onChange = (e) => {
if (this.props.input) {
this.props.input.onChange(e.target.checked);
} else if (this.props.onChange) {
this.props.onChange(e.target.checked, this.props.id);
}
};
render() {
const { input, value, className, label } = this.props;
let inputValue = (input && input.value) || value;
return (
<div className={'Checkbox' + (className ? ' Checkbox--' + className : '')}>
<input
className="Checkbox-input"
type="checkbox"
onChange={this.onChange}
checked={inputValue}
/>
<span className="Checkbox-helper" />
<span className="Checkbox-label" htmlFor="">
{label}
</span>
</div>
);
}
}
值更改時,此組件將返回錯誤。
警告:組件正在更改要控制的類型為非受控輸入的復選框。 輸入元素不應從不受控制切換為受控制(反之亦然)。 確定在組件的使用壽命期間使用受控或不受控制的輸入元素。
但是,如果我替換:
let inputValue = (input && input.value) || value;
與
let inputValue = value;
if (input) {
inputValue = input.value;
}
像這樣:
class Checkbox extends Component {
onChange = (e) => {
if (this.props.input) {
this.props.input.onChange(e.target.checked);
} else if (this.props.onChange) {
this.props.onChange(e.target.checked, this.props.id);
}
};
render() {
const { input, value, className, label } = this.props;
let inputValue = value;
if (input) {
inputValue = input.value;
}
return (
<div className={'Checkbox' + (className ? ' Checkbox--' + className : '')}>
<input
className="Checkbox-input"
type="checkbox"
onChange={this.onChange}
checked={inputValue}
/>
<span className="Checkbox-helper" />
<span className="Checkbox-label" htmlFor="">
{label}
</span>
</div>
);
}
}
它不返回任何錯誤。 為什么?
一種可能性,有沒有足夠的信息,這里說的肯定,是input.value
是存在的,但false
(或falsy),這樣你就回落到value
道具,這是undefined
,你最終設置checked
到undefined
您輸入。
這將導致不受控制的復選框。
然后,在隨后的遍歷中, input.value
或props.value
都已更改,並且您將checked
設置為實際值,這意味着它現在是受控輸入,並且react會發出警告。
在最初的情況下,即使input.value
顯式為false
或0
或為空字符串,您也將獲得value
prop:
// if input.value === false here you get
// the fallback value which may be undefined
let inputValue = (input && input.value) || value;
在您修改的情況下...
let inputValue = value;
if (input) {
inputValue = input.value;
}
…您避免了這種情況,因為您是根據input
本身而不是input.value
來預測它的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.