Как я могу передать событие в функцию обратного вызова setState? - PullRequest
0 голосов
/ 13 июня 2018

Возможно ли в React передать внешнее событие в функцию обратного вызова setState?

Пример

someFunc(event) { 
    this.setState(
        {
            value: event.target.value
        },
        () => {                 
            this.props.onChange(event);    // <- cannot pass to here                
        }
    );
}

РЕДАКТИРОВАТЬ: См. Принятое решение Лиамом ниже для превосходного ответа, Вот конкретное решение моей проблемы:

Решение

someFunc(event) { 
    event.persist() // <- add this line and event should pass without a problem
    this.setState(
        {
            value: event.target.value
        },
        () => {                 
            this.props.onChange(event);                 
        }
    );
}

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Вам нужно извлечь значения или использовать e.persist()

https://reactjs.org/docs/events.html#event-pooling

class App extends React.Component {

something = (value) =>{
  {console.log(value, 'coming from child')}
}
  render() {

    return (
      <div >
        <Hello text={this.something} />
      </div>
    );
  }
}


class Hello extends React.Component {

  constructor() {
    super()
    this.state = {
      value: ''
    }
  }
  onChange = (e) => {
    const value = e.target.value;
    this.setState({ value }, () => {
    
      this.props.text(value)
    })
  }
  render() {

    return (
      <div style={{ padding: 24 }}>
        <input onChange={this.onChange} value={this.state.value} />

      </div>
    );
  }
}



ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id='root' ></div>

Или, если вы намеревались передать состояние значения, вы можете использовать this.state.value в обратном вызове, оно будет работать.

someFunc(event) { 
    this.setState(
        {
            value: event.target.value
        },
        () => {                 
            this.props.onChange(this.state.value);    // <- this should work                
        }
    );
}
0 голосов
/ 13 июня 2018

РЕДАКТИРОВАТЬ: НЕПРАВИЛЬНОЕ РЕШЕНИЕ

Одним из решений является написание другой функции, например,

updateInput(e) {
    this.setState(
        {
            value: e.target.value
        },
        this.handleUpdate(e)
    );
 }

handleUpdate(e) {
    this.props.onChange(e, this.props.tag);
}

РЕДАКТИРОВАТЬ:

Как указано в комментариях ниже ФеликсомКинг, это не решение вообще.Он будет запускать функцию handleUpdate до того, как будет установлено состояние, которое побеждает цель.Настоящее решение опубликовано выше Лиамом.

...