2017-12-13 113 views
7

Kullanıcı başka bir bileşeni kapattığında belirli bir bileşene ilerlemeye çalışıyoruz.scrollIntoView kullanarak React refs

Bizim örnek this.refs[elem].scrollIntoView()

arayarak aşağı aşağıda, 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} 
     /> 
    ); 
    } 
} 

Biz kartların büyük oluşturma listesinin ve belirli bir karta ilerleyin edebilmek istiyorsanız alınan bu çok benzer Ancak bizim sorunumuz, this.refs numaralı telefonun aranmasının her seviyede boş bir nesne döndürdüğü ve bu nedenle belirli bir öğeye ekleyemediğimiz ve kullanıcı bu bileşeni görüntülemek için geri geldiğinde onu tetiklediğidir.

Bu sorunu çözme konusunda nasıl yardımcı olabileceğimiz konusunda yardım ister misiniz?

+0

Gerçek örneğim, herhangi bir düzeyde işlevsel bileşenleri kullanmıyorum. –

+1

geri çağırma işlevini kullanarak ref atadığınızda, artık this.refs kullanarak ona erişemezsiniz, bunun yerine, sınıf değişken adı this.inputElement –

+0

@ShubhamKhatri bunun için teşekkürler, beyinlerimizin öldüğü ortaya çıktı, yorumunuza baktık ve bize gerçekten yardım etti. –

cevap

1

this.refs[elem].scrollIntoView() numaralı telefonu aramaya çalışıyorsunuz? render yönteminin içinde değil, componentDidMount veya componentDidUpdate içinde ref s ile çalışmalısınız.

+0

Evet, bunu hiç şans olmadan yapmaya çalışıyorduk, düzeltmeyi başarmıştık! :) –

0

Büyükbaba bileşenimde aşağıda yazılı bir if ifadesi sağlayarak özel sorunumu çözdüm.

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