2017-07-08 1 views
1

Ich möchte auf die Refs von der Renderfunktion zugreifen und es auf den Status festlegen.Status wird nicht in ComponentDidMount festgelegt

Hier ist mein Code:

export default class App extends Component { 
    constructor(props) { 
     super(); 
      this.arr = this.generateTimelineArray(); 
      this.state = {el : 'empty'}; 
     } 
    componentDidMount() { 
     this.setState({ 
      el: this.refs.el 
     }); 
     console.log(this.state.el) 
    } 
render() { 
    return (
     <div className="timeline__container--line" ref="el" ></div> 
    ); 
    } 

Ich kann console.log(this.refs.el) und der Wert protokolliert. Aber ich muss es im Konstruktor speichern, um es an eine andere Komponente zu übergeben.

Problem ist, dass der Zustand nicht geändert wird.

Was mache ich falsch?

Vielen Dank im Voraus

+0

BTW Warum möchten Sie Dom-Element Referenz auf den Zustand der Komponente setzen? –

+0

Ich brauche Offset von der div – Giedrius

+0

Mögliche Duplikat von [this.setState nicht Wert aktualisieren] (https://stackoverflow.com/questions/41278385/this-setstate-doesnt-update-value) –

Antwort

3

setState ist async. Docs. Wenn Sie den Status Rückruf für den Status verwenden möchten.

componentDidMount() { 
     this.setState({ 
      el: this.refs.el 
     },() => console.log(this.state.el)); 
    } 
+0

Es ist großartig , aber warum muss ich console.log() um Status zu setzen, ist es möglich, Callback ohne console.log zu tun? – Giedrius

+0

@Giedrius Sie müssen sich nicht anmelden. Wenn Sie den Status ** updated ** verwenden möchten, müssen Sie einen Rückruf verwenden. Aber es liegt ganz bei Ihnen, was genau Sie mit dem neuen Zustand machen wollen. –

+0

Ok, letzte Frage dann, wie übertrage ich einen aktualisierten Zustand als Prop zu einer anderen Komponente? Muss ich auch Callback-Funktion ? – Giedrius

0

Wie Yury sagte, ist this.setState asynchron. Neben einer Callback-Funktion können Sie einen Booleschen Zustandsvariablen verwenden und überprüfen Sie, dass in machen:

export default class App extends Component { 
    constructor(props) { 
     super(); 
      this.arr = this.generateTimelineArray(); 
      this.state = {el : 'empty', flag : true}; 
     } 
    componentDidMount() { 
     this.setState({ 
      el: this.refs.el, 
      flag : false 
     }); 
     console.log(this.state.el) 
    } 
render() { 
    return (
     this.state.flag == false && 
     <div className="timeline__container--line" ref="el" ></div> 
    ); 
    } 

Dies wird nun nur machen, wenn die asynchronen setState abgeschlossen haben.

Verwandte Themen