Jak mogę uzyskać wysokość elementu po wyrenderowaniu tego elementu przez React?
HTML
<div id="container">
<!-- This element's contents will be replaced with your component. -->
<p>
jnknwqkjnkj<br>
jhiwhiw (this is 36px height)
</p>
</div>
ReactJS
var DivSize = React.createClass({
render: function() {
let elHeight = document.getElementById('container').clientHeight
return <div className="test">Size: <b>{elHeight}px</b> but it should be 18px after the render</div>;
}
});
ReactDOM.render(
<DivSize />,
document.getElementById('container')
);
WYNIK
Size: 36px but it should be 18px after the render
Oblicza wysokość kontenera przed renderowaniem (36px). Chcę uzyskać wysokość po renderowaniu. W tym przypadku prawidłowy wynik powinien wynosić 18 pikseli. jsfiddle
javascript
reactjs
faia20
źródło
źródło
setState
do przypisania wartości wysokości do zmiennej stanu.Odpowiedzi:
Zobacz te skrzypce (faktycznie zaktualizowałem twoje)
Musisz podłączyć się do
componentDidMount
którego jest uruchamiany po metodzie renderowania. Tam otrzymasz aktualną wysokość elementu.źródło
Poniżej znajduje się aktualny przykład ES6 wykorzystujący ref .
Pamiętaj, że musimy użyć komponentu klasy React, ponieważ potrzebujemy dostępu do metody Lifecycle,
componentDidMount()
ponieważ możemy określić wysokość elementu dopiero po wyrenderowaniu go w DOM.Przykład działania można znaleźć tutaj: https://codepen.io/bassgang/pen/povzjKw
źródło
<div ref={ divElement => this.divElement = divElement}>{children}</div>
zgłasza „[eslint] Funkcja strzałki nie powinna zwracać przypisania. (No-return-assign)” ithis.setState({ height });
zgłasza „[eslint] Nie używaj setState w komponencie componentDidMount (reaguj / nie- did-mount-set-state) ”. Czy ktoś ma rozwiązanie zgodne z przewodnikiem stylistycznym?ref={ divElement => {this.divElement = divElement}}
componentDidUpdate
.Dla tych, którzy są zainteresowani użyciem
react hooks
, może to pomóc w rozpoczęciu.źródło
useLayoutEffect
zamiastuseEffect
? Dokumenty wydają się wskazywać, że powinniśmy. Zapoznaj się z sekcją „ porady ” tutaj: Reactjs.org/docs/hooks-effect.html#detailed-explanation (2) W tych przypadkach, w których potrzebujemy tylko odniesienia do elementu podrzędnego, czy powinniśmy użyćuseRef
zamiastcreateRef
? Dokumentacja wydaje się wskazywać, żeuseRef
jest bardziej odpowiedni dla tego przypadku użycia. Zobacz: responsjs.org/docs/hooks-reference.html#userefuseLayoutEffect
przeczytałem inne komentarze tutaj. Wydaje się, że działa dobrze. :)useEffect(() => setDimensions({width: popup.current.clientWidth, height: popup.current.clientHeight}))
Ustawiałem wymiary mojego komponentu , a moje IDE (WebStorm) zasugerowało mi to: ESLint: React Hook useEffect zawiera wywołanie „setDimensions”. Bez listy zależności może to prowadzić do nieskończonego łańcucha aktualizacji. Aby to naprawić, przekaż [] jako drugi argument do hooka useEffect. (reaguj-haki / wyczerpujące-deps) , więc przekaż[]
jako drugi argument do swojegouseEffect
Chciałbyś również użyć referencji na elemencie zamiast używać
document.getElementById
, jest to tylko trochę bardziej solidna rzecz.źródło
angularJs
ireact
podczas migracji z jednego do drugiego? Są przypadki, w których bezpośrednia manipulacja DOM jest naprawdę potrzebnaMoja odpowiedź z 2020 (lub 2019)
niech wykorzystać swoją wyobraźnię do czego brakuje tutaj (WidgetHead),
reactstrap
jest czymś, co można znaleźć na KMP zamienićinnerRef
zeref
dla elementu dziedzictwo dom (powiedzmy<div>
).useEffect lub useLayoutEffect
Mówi się, że to ostatnie jest synchroniczne dla zmian
useLayoutEffect
(lubuseEffect
) drugi argumentDrugi argument jest tablicą i jest sprawdzany przed wykonaniem funkcji w pierwszym argumencie.
użyłem
Ponieważ self.current ma wartość null przed renderowaniem, a tego dobrze nie sprawdzać, drugi parametr na końcu
myself.current.clientHeight
jest tym, co chcę sprawdzić pod kątem zmian.co tutaj rozwiązuję (lub próbuję rozwiązać)
Rozwiązuję tutaj problem widżetu na siatce, który z własnej woli zmienia swoją wysokość, a układ siatki powinien być na tyle elastyczny, aby zareagować ( https://github.com/STRML/react-grid-layout ).
źródło
useLayoutEffect
i rzeczywistym divem do powiązania ref.Zamiast używać
document.getElementById(...)
, lepszym (aktualnym) rozwiązaniem jest użycie zaczepu React useRef, który przechowuje odniesienie do komponentu / elementu, w połączeniu z punktem zaczepienia useEffect , który odpala przy renderowaniu składników.źródło
Używanie z haczykami:
Ta odpowiedź byłaby pomocna, gdyby wymiar treści zmienił się po załadowaniu.
onreadystatechange : występuje, gdy stan ładowania danych należących do elementu lub dokumentu HTML ulegnie zmianie. Zdarzenie onreadystatechange jest wywoływane w dokumencie HTML, gdy zmienił się stan ładowania zawartości strony.
Próbowałem pracować z osadzaniem odtwarzacza wideo youtube, którego wymiary mogą się zmieniać po załadowaniu.
źródło
Znalazłem przydatny pakiet npm https://www.npmjs.com/package/element-resize-detector
Zoptymalizowany detektor zmiany rozmiaru elementów w różnych przeglądarkach.
Można go używać z komponentem React lub komponentem funkcjonalnym (szczególnie przydatne w przypadku haków reakcyjnych)
źródło
Oto kolejny, jeśli potrzebujesz zdarzenia zmiany rozmiaru okna:
kod pióra
źródło
Alternatywne rozwiązanie, w przypadku gdy chcesz pobrać rozmiar elementu React synchronicznie bez konieczności widocznego renderowania elementu, możesz użyć ReactDOMServer i DOMParser .
Używam tej funkcji, aby uzyskać wysokość renderera pozycji mojej listy podczas korzystania z okna reagowania ( zwirtualizowane reagowanie ), zamiast konieczności kodowania wymaganej właściwości
itemSize
dla FixedSizeList .utilities.js:
źródło