2017-07-08 20 views
1

レンダリング機能からの参照にアクセスして、その状態に設定します。私はconsole.log(this.refs.el)と値が記録されることができcomponentDidMountに状態が設定されていません

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

は、ここに私のコードです。しかし、別のコンポーネントに渡すためにコンストラクタに保存する必要があります。

問題は、状態が変更されていないことです。私が間違っているのは何

?事前に

おかげ

+0

なぜDOMの要素の参照をコンポーネントの状態に置きたいのですか? –

+0

divのオフセットを取得する必要があります – Giedrius

+0

[this.setStateの値が更新されない可能性があります](https://stackoverflow.com/questions/41278385/this-setstate-doesnt-update-value) –

答えて

3

setStateは非同期です。 Docs。更新された状態のコールバックを使用したい場合

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

重大です、なぜ私は状態を設定するためにconsole.log()をしなければならないのですか?console.logなしでコールバックを行うことは可能ですか? – Giedrius

+0

@Giedriusログをとる必要はありません。 **あなたがコールバックを使用する必要がある**更新**状態を使用したいだけです。しかし、正確に新しい状態でやりたいことはあなた次第です –

+0

最後に質問しますが、更新された状態を別のコンポーネントの小道具としてどのように渡しますか?また、コールバック関数を使用する必要がありますか? – Giedrius

0

と同様に、this.setStateは非同期です。

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

非同期SETSTATEが完了するとこれが今だけレンダリングされます:別にコールバック関数から、あなたは、レンダリングのboolean状態変数を使用し、それをチェックすることができます。