React: рдХреНрд▓рд┐рдХ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ event.preventDefault onChange рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 17 рдлрд╝рд░ре░ 2017  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/react

рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдмрдЧ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рдмрдЧ!

рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?

input рддрддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ checkbox рдХреЛ onClick рдФрд░ onChange рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╕рдордп, onChange рдХреЛ event.preventDefault() рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ onClick рд╣реИрдВрдбрд▓рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдмрдЧ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ https://jsfiddle.net рдпрд╛ рд╕рдорд╛рди (рдЯреЗрдореНрдкрд▓реЗрдЯ: https://jsfiddle.net/reactjs/69z2wepo/) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдПрдХ рдиреНрдпреВрдирддрдо рдбреЗрдореЛ рдХреЛ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред

http://jsfiddle.net/rf3w7apc/

рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?

event.preventDefault рдХреЛ onClick рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╛ рдЗрд╕рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреВрд░реНрд╡рд╡рдд рдХрд░реЗрдВ), рдЬреЛ input рддрддреНрд╡ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рднреА change рд╢реНрд░реЛрддрд╛ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП https://jsfiddle.net/L1eskzsq/ рджреЗрдЦреЗрдВ

рд░рд┐рдПрдХреНрдЯ рдХреЗ рдХреМрди рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдХреМрди рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ / OS рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реИрдВ?

рдорд╛рд╕реНрдЯрд░ рд╕реЗ рдПрдХ рдмрд┐рд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛, macOS 10.12.2, рдореЗрдВ рд╕рддреНрдпрд╛рдкрд┐рдд:

  • Chrome 56.0.2924.87 (64-рдмрд┐рдЯ)
  • рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ 51.0.1 (64-рдмрд┐рдЯ)

рд╕рдлрд╛рд░реА 10.0.2 рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ change рдЗрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рдХреЛ рдмреБрд▓рд╛рддреА рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдХреНрдпрд╛ рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ? preventDefault рдХреЛ рдПрдХ рдЪреЗрдХрдмреЙрдХреНрд╕ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ onChange рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдФрд░ рд╕рд┐рдВрдХ рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реНрдерд┐рддрд┐: https://codesandbox.io/s/0qpr936xkv

рд╕рднреА 6 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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; } }

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

bloodyowl picture bloodyowl  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zpao picture zpao  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

huxiaoqi567 picture huxiaoqi567  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Prinzhorn picture Prinzhorn  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jvorcak picture jvorcak  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ