2017-12-13 112 views
7

Chúng tôi đang cố gắng cuộn đến một thành phần cụ thể khi người dùng đóng thành phần khác.scrollIntoView bằng React refs

ví dụ của chúng tôi là rất giống với xuống dưới, lấy từ 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} 
     /> 
    ); 
    } 
} 

Chúng tôi đang vẽ một danh sách lớn của thẻ và muốn để có thể di chuyển đến một thẻ cụ thể bằng cách gọi this.refs[elem].scrollIntoView()

Nhưng vấn đề của chúng tôi là gọi this.refs trả về một đối tượng trống ở tất cả các cấp và vì vậy chúng tôi không thể đính kèm vào một phần tử cụ thể và sau đó kích hoạt nó khi người dùng quay lại để xem thành phần này.

Bạn muốn được trợ giúp về cách giải quyết vấn đề này.

+0

Ví dụ thực sự của tôi, tôi không sử dụng các thành phần chức năng ở mọi cấp độ. –

+1

khi bạn gán ref bằng cách sử dụng hàm gọi lại, bạn không còn truy cập bằng cách sử dụng this.refs, thay vì tên biến lớp, như this.inputElement –

+0

@ShubhamKhatri cảm ơn vì điều đó, hóa ra bộ não của chúng ta đã chết, chúng tôi đã xem nhận xét của bạn và thực sự đã giúp chúng tôi. –

Trả lời

1

Bạn đang cố gắng gọi số this.refs[elem].scrollIntoView() ở đâu? Bạn nên làm việc với ref s bên trong componentDidMount hoặc componentDidUpdate, không phải bên trong phương thức render.

+0

Vâng, chúng tôi đã cố gắng để làm điều đó mà không có bất kỳ may mắn, quản lý để sửa chữa nó mặc dù! :) –

0

Tôi đã giải quyết vấn đề cụ thể của mình bằng cách cung cấp câu lệnh if được viết bên dưới trong thành phần Grandparent của tôi.

inputRef={el => { 
    if (el && el.id == this.state.selectedBuildingRef) { 
    this.myelement.scrollIntoView(); 
    window.scrollBy(0, -65); 
    } 
}} 
Các vấn đề liên quan