2017-12-13 14 views
7

ユーザーが別のコンポーネントを閉じるときに、特定のコンポーネントにスクロールしようとしています。React refsを使用したscrollIntoView

私たちの例では、我々は、カードの大きなリストをレンダリングし、this.refs[elem].scrollIntoView()

を呼び出すことにより、特定のカードにスクロールできるようにしたいされているhttps://reactjs.org/docs/refs-and-the-dom.html#exposing-dom-refs-to-parent-components

function CustomComponents(props) { 
    const items = [1,2,3,4].map((x, i) => return (
    <div ref={props.inputRef} key={i}> 
    x + hello 
    </div> 
) 

    return (
    <div> 
     { items } 
    </div> 
); 
} 

function Parent(props) { 
    return (
    <div> 
     <CustomComponents inputRef={props.inputRef} /> 
    </div> 
); 
} 


class Grandparent extends React.Component { 
    render() { 
    return (
     <Parent 
     inputRef={el => this.inputElement = el} 
     /> 
    ); 
    } 
} 

から取られ、以下のダウンと非常に似ていますしかし問題は、this.refsを呼び出すと、すべてのレベルで空のオブジェクトが返されるため、特定の要素にアタッチしてから、ユーザーがこのコンポーネントを表示するために戻ったときに呼び出すことができないということです。

この問題をどのように解決するかについてのヘルプが必要です。

+0

実際の例では、どのレベルでも機能コンポーネントを使用していません。 –

+1

コールバック関数を使用してrefを割り当てると、this.inputElementのようなクラス変数名ではなくthis.refsを使用してアクセスしなくなりました –

+0

@ShubhamKhatriはそれに感謝し、頭が死んでいることがわかりました。本当に私たちを助けました。 –

答えて

1

ここでthis.refs[elem].scrollIntoView()に電話をかけようとしていますか? refcomponentDidMountまたはcomponentDidUpdateの内部で作業する必要があります。renderメソッドの内部ではありません。

+0

ええ、私たちはすでに運が無ければそれをやろうとしていましたが、それを修正することができました! :) –

0

下記のif文を私のGrandparentコンポーネントに提供することで、私の特定の問題を解決しました。

inputRef={el => { 
    if (el && el.id == this.state.selectedBuildingRef) { 
    this.myelement.scrollIntoView(); 
    window.scrollBy(0, -65); 
    } 
}} 
関連する問題