2017-04-19 6 views
1

コンポーネントの実際の高さに基づいてクラスを設定する必要があるコンポーネントを作成しています。例えば:コンポーネントのレンダリングされた高さに基づいてリアクションsetState

身長>maxHeight<div className='greater-than-max-height' />

高< = maxHeight<div className='less-than-max-height' />

のみcomponentDidMountで知られているコンポーネントの高さ。 componentDidMountにsetStateを実行すると、再レンダリングが発生するため、お勧めしません。これをどうやって解決しますか?

+1

あなたはまだ、とにかく再レンダリングする必要がある、またはどのようにあなたが 'レンダリングすることができますあなたが望むclassNameを使ってdivを付けてください – CodinCat

+0

はい、bどのようにそれを行うには? 'componentDidMount'で' setState'を行うのが唯一の方法ですか? –

+0

これは私が想像できる唯一の方法です、もっと良い解決策があるかもしれません。 – CodinCat

答えて

1

もっとも簡単な解決策は、setStatecomponentDidMountに入れるだけです。あなたはとにかく再レンダリングが必要なので。単純なコンポーネントの場合、再レンダリングはそれほど高価ではありません。

しかし、コンポーネントの構造が複雑で子どもの中には計算が必要なものがある場合は、shouldComponentUpdate(または単にPureComponent)を子コンポーネントに実装することをお勧めします。

もう1つの解決策は、実際のDOMを直接操作することです。それは汚れて見えますが、あなたは最高のパフォーマンスが(あなたが不要なレンダリングコンポーネントやDOMの更新がないことを保証することができます)を取得

あなたのコンポーネントが更新され、その高さを変更している場合、あなたはクラス名を更新することに注意
componentDidMount() { 
    const height = getHeight() 
    const div = document.getElementById('yourDivId') 
    if (height > MAX_HEIGHT) { 
    div.className = 'greater-than-max-height' 
    } else { 
    div.className = 'less-than-max-height' 
    } 
} 

、あなたはそのための機能を抽出することができ

(両方のソリューションがする必要がある)componentDidUpdateでこれを行うためにも必要があります:

updateDivClass() { 
    const height = getHeight() 
    const div = document.getElementById('yourDivId') 
    if (height > MAX_HEIGHT) { 
    div.className = 'greater-than-max-height' 
    } else { 
    div.className = 'less-than-max-height' 
    } 
} 

componentDidMount() { 
    this.updateDivClass() 
} 

componentDidUpdate() { 
    this.updateDivClass() 
} 
関連する問題