Powiedzmy, że mam składnik widoku, który ma renderowanie warunkowe:
render(){
if (this.state.employed) {
return (
<div>
<MyInput ref="job-title" name="job-title" />
</div>
);
} else {
return (
<div>
<MyInput ref="unemployment-reason" name="unemployment-reason" />
<MyInput ref="unemployment-duration" name="unemployment-duration" />
</div>
);
}
}
MyInput wygląda mniej więcej tak:
class MyInput extends React.Component {
...
render(){
return (
<div>
<input name={this.props.name}
ref="input"
type="text"
value={this.props.value || null}
onBlur={this.handleBlur.bind(this)}
onChange={this.handleTyping.bind(this)} />
</div>
);
}
}
Powiedzmy, że employedto prawda. Za każdym razem, gdy przełączam go na false, a inny widok renderuje się, tylko unemployment-durationjest ponownie inicjowany. unemployment-reasonZostaje również wstępnie wypełniona wartością z job-title(jeśli wartość została podana przed zmianą warunku).
Jeśli zmienię znaczniki w drugiej procedurze renderowania na coś takiego:
render(){
if (this.state.employed) {
return (
<div>
<MyInput ref="job-title" name="job-title" />
</div>
);
} else {
return (
<div>
<span>Diff me!</span>
<MyInput ref="unemployment-reason" name="unemployment-reason" />
<MyInput ref="unemployment-duration" name="unemployment-duration" />
</div>
);
}
}
Wygląda na to, że wszystko działa dobrze. Wygląda na to, że React po prostu nie rozróżnia „tytułu stanowiska” i „powodu bezrobocia”.
Proszę, powiedz mi, co robię źle ...
<div>. Te data-reactidatrybuty wydaje się być różne na obu div owijania i polu tekstowym. job-titlewejście otrzymuje id data-reactid=".0.1.1.0.1.0.1", podczas gdy unemployment-reasonwejście otrzymuje iddata-reactid=".0.1.1.0.1.2.1"
unemployment-duration?
reactidatrybuty są identyczne job-titlei unemployment-reason, podczas gdy w drugim przypadku (przy rozpiętości diff) są one różne.
unemployment-durationtej reactidatrybutu jest zawsze wyjątkowy.
data-reactidkażdym z elementówMyInput(lubinput, jak widać w DOM), przed i poemployedprzełączeniu?