Mam widżet czatu, który wyświetla szereg wiadomości za każdym razem, gdy przewijam w górę. Problem, z którym teraz mam do czynienia, polega na tym, że suwak pozostaje na górze podczas ładowania wiadomości. Chcę, aby skupił się na ostatnim elemencie indeksu z poprzedniej tablicy. Dowiedziałem się, że mogę tworzyć dynamiczne referencje, przekazując indeks, ale musiałbym również wiedzieć, jakiego rodzaju funkcji przewijania użyć, aby to osiągnąć
handleScrollToElement(event) {
const tesNode = ReactDOM.findDOMNode(this.refs.test)
if (some_logic){
//scroll to testNode
}
}
render() {
return (
<div>
<div ref="test"></div>
</div>)
}
javascript
reactjs
ecmascript-6
edmamerto
źródło
źródło
Odpowiedzi:
React 16.8 +, komponent funkcjonalny
Kliknij tutaj, aby zobaczyć pełne demo na StackBlits
React 16.3 +, składnik klasy
Komponent klasy - odwołanie zwrotne
Nie używaj referencji typu String.
String refs szkodzi wydajności, nie można ich komponować i są w drodze (sierpień 2018).
zasób1 zasób2
Opcjonalnie: Wygładź animację przewijania
Podanie referencji dziecku
Chcemy, aby ref był dołączony do elementu dom, a nie do składnika reagującego. Zatem przekazując go do komponentu potomnego, nie możemy nazwać właściwości ref.
Następnie dołącz element ref do elementu dom.
źródło
window.scrollTo(0, offsetTop)
jest lepszą opcją z lepszym wsparciem wśród obecnych przeglądarekto działało dla mnie
EDYCJA: Chciałem to rozwinąć na podstawie komentarzy.
źródło
Po prostu znajdź najwyższą pozycję elementu, który już ustaliłeś https://www.w3schools.com/Jsref/prop_element_offsettop.asp, a następnie przewiń do tej pozycji
scrollTo
metodą https://www.w3schools.com/Jsref/met_win_scrollto.aspCoś takiego powinno działać:
AKTUALIZACJA:
od React v16.3
React.createRef()
jest korzystneźródło
ReactDOM.findDomNode()
jest lepszą praktyką - ponieważ React ponownie renderuje komponenty, div, który otrzymujesz po prostu za pomocą jego identyfikatora, może nie istnieć do czasu wywołania funkcjifindDOMNode
. W większości przypadków możesz dołączyć odwołanie do węzła DOM ifindDOMNode
w ogóle nie używać .this.myRef.current.scrollIntoView()
zamiastwindow.scrollTo(0, this.myRef)
.Korzystanie z findDOMNode będzie ostatecznie przestarzałe.
Preferowaną metodą jest użycie odwołań zwrotnych.
github eslint
źródło
Możesz teraz używać
useRef
interfejsu API z funkcji react hookhttps://reactjs.org/docs/hooks-reference.html#useref
deklaracja
składnik
Posługiwać się
źródło
console.log
to, że wykonuje twojewindow.scrollTo
polecenie (dostosowane do mojego przypadku), ale mimo to się nie przewija. Czy może to być związane z faktem, że używam modalu React Bootstrap?Możesz również użyć
scrollIntoView
metody, aby przejść do danego elementu.źródło
Mogę się spóźnić na imprezę, ale starałem się zaimplementować dynamiczne odniesienia do mojego projektu we właściwy sposób, a wszystkie odpowiedzi, które znalazłem, dopóki nie wiem, nie są spokojne, satysfakcjonujące w moim guście, więc wymyśliłem rozwiązanie, które moim zdaniem jest prosty i używa natywnego i zalecanego sposobu reagowania, aby utworzyć ref.
czasami okazuje się, że sposób pisania dokumentacji zakłada, że masz znaną liczbę widoków iw większości przypadków ta liczba jest nieznana, więc potrzebujesz sposobu na rozwiązanie problemu w tym przypadku, utwórz dynamiczne odniesienia do nieznanej liczby widoków, których potrzebujesz pokazać w klasie
więc najprostszym rozwiązaniem, jakie mogłem wymyślić i działałem bezbłędnie, było wykonanie następujących czynności
w ten sposób przewiń przejdzie do dowolnego wiersza, którego szukasz.
okrzyki i mam nadzieję, że pomoże innym
źródło
Lipiec 2019 - Dedykowany haczyk / funkcja
Dedykowany punkt zaczepienia / funkcja może ukrywać szczegóły implementacji i zapewnia proste API dla twoich komponentów.
React 16.8 + Komponent funkcjonalny
Użyj go w dowolnym funkcjonalnym komponencie.
pełne demo
Reaguj Komponent klasy 16.3 +
Użyj go w dowolnym komponencie klasy.
Pełne demo
źródło
Możesz spróbować w ten sposób:
źródło
Możesz użyć czegoś takiego jak
componentDidUpdate
źródło
Miałem prosty scenariusz, kiedy użytkownik kliknie element menu na moim pasku nawigacyjnym interfejsu użytkownika materiałów, chcę przewinąć je w dół do sekcji na stronie. Mógłbym użyć refs i przeplatać je przez wszystkie komponenty, ale nienawidzę wątkowania rekwizytów wielu komponentów, ponieważ to sprawia, że kod jest kruchy.
Właśnie użyłem vanilla JS w moim komponencie React, okazuje się, że działa dobrze. Umieściłem identyfikator na elemencie, do którego chciałem przewinąć, iw komponencie nagłówka właśnie to zrobiłem.
źródło
Wykonaj następujące kroki:
1) Zainstaluj:
2) Zaimportuj pakiet:
3) Użycie:
źródło
Oto fragment kodu komponentu klasy, którego możesz użyć do rozwiązania tego problemu:
To podejście wykorzystywało odniesienie, a także płynnie przewijało do odniesienia docelowego
źródło
Co mi pomogło:
źródło
Uwaga, nie mogłem zmusić tych rozwiązań do pracy z komponentami Material UI. Wygląda na to, że nie mają
current
nieruchomości.Właśnie dodałem pusty
div
element wśród moich komponentów i ustawiłem na nim atrybut ref.źródło
źródło
Dla każdego, kto to czyta, kto nie miał szczęścia z powyższymi rozwiązaniami lub po prostu chce prostego rozwiązania typu drop-in, ten pakiet zadziałał dla mnie: https://www.npmjs.com/package/react-anchor-link- płynne przewijanie . Miłego hakowania!
źródło
Użyłem tego wewnątrz funkcji onclick, aby płynnie przewijać do elementu div, którego identyfikator to „step2Div”.
źródło
Najmilszym sposobem jest użycie
element.scrollIntoView({ behavior: 'smooth' })
. Spowoduje to przewinięcie elementu do widoku z ładną animacją.Kiedy połączysz to z Reactem
useRef()
, możesz to zrobić w następujący sposób.Jeśli chcesz przewinąć do komponentu React, musisz przekazać ref do renderowanego elementu. W tym artykule szczegółowo omówimy problem .
źródło