2016-08-28 6 views
1

Работает, чтобы получить ползунок, чтобы изменить значение «текст» в состоянии React.SetState не работает на OnChange

Держите получаю ошибку:

"App.js: 90 неперехваченным TypeError: this.setState не является функцией", несмотря на все мои усилия по устранению неисправностей.

В чем может быть проблема?

class App extends Component { 
    constructor(props) { 
     super(props); 
     this.state = {list: [{x: "Before Pool", y:85000}, {x: "After Pool", y:82000}], text: 0, options: {bathrooms:'', bedrooms:'', sqft:''}}; 
    } 

    componentDidMount() { 
     setTimeout(() => { 
     this.setState({list: [{x: "Before Pool", y:60000}, {x: "After Pool", y:30000}]}); 
     console.log("testing", this.state.text); 
     }, 2000) ; 
    } 
    handleChange (event) { 
    console.log("from handle change", event); 
    this.setState({text : event }); 
    } 
    render() { 
    return (
     <div className="App"> 
      <div> 
      <div style={wrapperStyle}> 
       <p># of Bathrooms</p> 
       <Slider min={0} max={20} defaultValue={3} onChange={this.handleChange} /> 
      </div> 

enter image description here enter image description here

ответ

2

вам нужно, чтобы связать handleChange методу

<Slider min={0} max={20} defaultValue={3} onChange={this.handleChange.bind(this)} 
+1

Вы можете отметить свой ответ, как правильный ответ, так что другие могут получить помощь форме это –

1

Вы должны связать свое состояние обратного вызова в setTimeout, так как вы находитесь в другом контексте. Я верю, это будет делать трюк:

setTimeout(() => { 
this.setState({list: [{x: "Before Pool", y:60000}, {x: "After Pool", y:30000}]}); 
console.log("testing", this.state.text); 
    }.bind(this), 2000) ; 
+0

пятно на, спасибо @httpNick! Сейчас все работает. – realsimonburns

+0

Рад это слышать, если ваша проблема полностью решена, она помогает вам принять ответ, чтобы указать на других пользователей. Конечно, это не должно быть моим, но было бы полезно, если бы вы приняли его. – httpNick

+0

Абсолютно - только что принял ответ! – realsimonburns

1

Ответ довольно прост: Вы смотрите на неправильном this.

Поскольку вы пишете обратный вызов в закрытии, важно знать, что вы не можете получить доступ к this снаружи. Он всегда относится к текущему контексту.

В качестве обходного пути, определить свою собственную переменную (обычно называемый self) для использования внутри затвора:

componentDidMount() { 
    var self = this; // copy the reference 
    setTimeout(() => { 
     self.setState({list: [{x: "Before Pool", y:60000}, {x: "After Pool", y:30000}]}); 
     console.log("testing", this.state.text); 
    }, 2000) ; 
} 
+0

Цените это @Mario! Ваш ответ повторяет два других ответа - отличный анализ. – realsimonburns