рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдмрдЧ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?
рдмрдЧ!
рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?
input
рддрддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ checkbox
рдХреЛ onClick
рдФрд░ onChange
рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╕рдордп, onChange
рдХреЛ event.preventDefault()
рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ onClick
рд╣реИрдВрдбрд▓рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдмрдЧ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ https://jsfiddle.net рдпрд╛ рд╕рдорд╛рди (рдЯреЗрдореНрдкрд▓реЗрдЯ: https://jsfiddle.net/reactjs/69z2wepo/) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдПрдХ рдиреНрдпреВрдирддрдо рдбреЗрдореЛ рдХреЛ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред
рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?
event.preventDefault
рдХреЛ onClick
рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╛ рдЗрд╕рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреВрд░реНрд╡рд╡рдд рдХрд░реЗрдВ), рдЬреЛ input
рддрддреНрд╡ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рднреА change
рд╢реНрд░реЛрддрд╛ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП https://jsfiddle.net/L1eskzsq/ рджреЗрдЦреЗрдВ
рд░рд┐рдПрдХреНрдЯ рдХреЗ рдХреМрди рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдХреМрди рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ / OS рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реИрдВ?
рдорд╛рд╕реНрдЯрд░ рд╕реЗ рдПрдХ рдмрд┐рд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛, macOS 10.12.2, рдореЗрдВ рд╕рддреНрдпрд╛рдкрд┐рдд:
рд╕рдлрд╛рд░реА 10.0.2 рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ change
рдЗрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рдХреЛ рдмреБрд▓рд╛рддреА рд╣реИред
change
рдШрдЯрдирд╛ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЬрд╛ рд░рд╣реА рд╣реИ ChangeEventPlugin
рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ topChange
, рдкрд╣рд▓реЗ рдЕрдкрдиреЗ onClick
рд╣реИрдВрдбрд▓рд░ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рддреЛ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ preventDefault
рдХреЙрд▓), рдпрд╣рд╛рдВ: https://github.com/facebook/react/blob/master/src/renderers/dom/sared/eventPlugins/ChangeEventPlugin.js#LIN8
рдпрд╣ рдкреНрд▓рдЧрдЗрди рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЪреЗрдХрдмреЙрдХреНрд╕ рдХрд╛ рдореВрд▓реНрдп рдмрджрд▓ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрджрд┐ рд╣рд╛рдБ, рддреЛ рдпрд╣ change
рдИрд╡реЗрдВрдЯ рдХреА рдХрддрд╛рд░ рдмрдирд╛ рджреЗрдЧрд╛ред рдпрд╣ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдкрд┐рдЫрд▓реЗ рдореВрд▓реНрдп рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП inputValueTracking
рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ: https://github.com/facebook/react/blob/master/src/renderers/dom/sared/ inputValueTracking.js # L154
nextValue
рдЗрд╕ рддрд░рд╣ рд╕реАрдзреЗ DOM рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: value = isCheckable(node) ? '' + node.checked : node.value;
https://github.com/facebook/react/blob/master/src/renderers/dom/sared/inputVunueTracking.js# L56
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ node.checked
рдореВрд▓реНрдп рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╕рд╣реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рдХреНрд▓рд┐рдХ рдХреЗ рдмрд╛рдж рдпрд╣ рд╣реИ:
lastValue == false
(рд╕рд╣реА)
nextValue == true
(рдЧрд▓рдд)
рдФрд░ рдЪреЗрдХрдмреЙрдХреНрд╕ рдкрд░ рдЕрдЧрд▓реЗ рдХреНрд▓рд┐рдХ рдкрд░, change
рдШрдЯрдирд╛ рдХреЛ рдЕрдм рдирд┐рдХрд╛рд▓ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореВрд▓реНрдп рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
lastValue == true
(рдЧрд▓рдд)
nextValue == true
(рдЧрд▓рдд)
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ DOM рд╕реЗ рдкреВрдЫ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдиреЛрдб рдХрд╛ checked
рдореВрд▓реНрдп рдХреНрдпрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ onClick
рдореЗрдВ preventDefault рдХрд╣рд╛ рдЬрд╛ рд╕рдХреЗред
рдЗрд╕ рдореЗрдВ рдЦреБрджрд╛рдИ рдХреЗ рд╕рд╛рде рдЖрдкрдХреА рдорджрдж рдХреЗ рд▓рд┐рдП @karelskopek рдФрд░ @Mintaffee рдХреЛ рдзрдиреНрдпрд╡рд╛рджред
@aweary рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рд▓ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ?
рдЗрд╕ рдПрдХ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдирд╣реАрдВ? рдореИрдВ рд░рд┐рдПрдХреНрдЯ v16.2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдПрдХ рд╣реА рд╣реИ - рдСрдирдХреНрд░реЗрдиреНрдЧ рдХреЛ рдкрд╣рд▓реА рдмрд╛рд░ рдЪрд╛рд▓реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдмрд╛рдж рдХреЗ рдХреНрд▓рд┐рдХреНрд╕ рдЗрд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдпрд╣рд╛рдВ рдХрд╛рдлреА рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓рд╛ рдореБрджреНрджрд╛ рдХрд╣реВрдВрдЧрд╛ред
рдХреНрдпрд╛ рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ? preventDefault
рдХреЛ рдПрдХ рдЪреЗрдХрдмреЙрдХреНрд╕ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ onChange
рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдФрд░ рд╕рд┐рдВрдХ рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реНрдерд┐рддрд┐: https://codesandbox.io/s/0qpr936xkv
рдЕрднреА рднреА рдПрдХ рдореБрджреНрджрд╛ рд░рд┐рдПрдХреНрдЯ 16.8.6 рдореЗрдВред рдПрдХ рд╕рдВрднрд╡ рд╕рдорд╛рдзрд╛рди onClick
рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд░рдирд╛ рд╣реИ:
const radios = ['one', 'two', 'three'];
class Row extends Component {
constructor(props) {
super(props);
this.onClick = this.onClick.bind(this);
this.onChange = this.onChange.bind(this);
}
render() {
const { value } = this.props;
return (
<div className="row">
<div className="radio-group">
{radios.map(radio => (
<label key={radio} className="radio">
<input
type="radio"
name="radio"
value={radio}
checked={radio === value}
onClick={this.onClick}
onChange={this.onChange}
/><span>Radio</span>
</label>
))}
</div>
</div>
);
}
onClick(event) {
// Check something to prevent radio change
if (...) {
event.preventDefault();
return;
}
// Sync value in the store
this.props.setValue(event.target.value);
}
onChange() {
// We need this empty handler to suppress React warning:
// "You provided a `checked` prop to a form field without an `onChange` handler.
// This will render a read-only field. If the field should be mutable use `defaultChecked`.
// Otherwise, set either `onChange` or `readOnly`"
}
}
рдпрджрд┐ рдЖрдк рдирд┐рдпрдВрддреНрд░рд┐рдд рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рдорд┐рд▓рд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд░рд╛рдЬреНрдп рдореЗрдВ рдмрд╕ рдореВрд▓реНрдп рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдЫреЛрдбрд╝рдирд╛ рд╣реИ:
onChange(event) {
// Check something to prevent radio change
if (...) {
return;
}
// Sync value in the store
this.props.setDateTime(event.target.value);
}
рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП, рдЖрдк onMouseDown рдШрдЯрдирд╛ рдкрд░ e.preventDefault рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ onChange рдХреЛ рдЧреЛрд▓реАрдмрд╛рд░реА рд╕реЗ рдмрдЪрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред
onMouseDown(e) {
if (...) {
e.preventDefault();
return;
}
}
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдХреНрдпрд╛ рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ?
preventDefault
рдХреЛ рдПрдХ рдЪреЗрдХрдмреЙрдХреНрд╕ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИonChange
рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдФрд░ рд╕рд┐рдВрдХ рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реНрдерд┐рддрд┐: https://codesandbox.io/s/0qpr936xkv