Bagaimana saya bisa mendapatkan Tinggi sebuah elemen setelah React merender elemen itu?
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')
);
HASIL
Size: 36px but it should be 18px after the render
Ini menghitung tinggi kontainer sebelum render (36px). Saya ingin mendapatkan ketinggian setelah render. Hasil yang benar harus 18px dalam kasus ini. jsfiddle.dll
javascript
reactjs
faia20
sumber
sumber
setState
untuk menetapkan nilai ketinggian ke variabel status.Jawaban:
Lihat biola ini (benar-benar memperbarui milik Anda)
Anda perlu menghubungkan
componentDidMount
yang dijalankan setelah metode render. Di sana, Anda mendapatkan ketinggian elemen yang sebenarnya.sumber
Berikut ini adalah contoh ES6 terkini menggunakan ref .
Ingatlah bahwa kita harus menggunakan komponen kelas React karena kita perlu mengakses metode Lifecycle
componentDidMount()
karena kita hanya dapat menentukan tinggi elemen setelah dirender di DOM.Anda dapat menemukan contoh yang sedang berjalan di sini: https://codepen.io/bassgang/pen/povzjKw
sumber
<div ref={ divElement => this.divElement = divElement}>{children}</div>
melempar "[eslint] Fungsi panah seharusnya tidak mengembalikan tugas. (No-return-assign)" danthis.setState({ height });
melempar "[eslint] Jangan gunakan setState di componentDidMount (react / no- did-mount-set-state) ". Adakah yang punya solusi sesuai styleguide?ref={ divElement => {this.divElement = divElement}}
componentDidUpdate
juga.Bagi mereka yang tertarik menggunakan
react hooks
, ini mungkin bisa membantu Anda memulai.sumber
useLayoutEffect
bukanuseEffect
? Dokumen tampaknya menunjukkan bahwa kita harus melakukannya. Lihat "tip" Bagian sini: reactjs.org/docs/hooks-effect.html#detailed-explanation (2) Untuk kasus ini di mana kita hanya perlu referensi ke elemen anak, yang harus kita gunakanuseRef
bukancreateRef
? Dokumen tampaknya menunjukkan bahwauseRef
lebih sesuai untuk kasus penggunaan ini. Lihat: reactjs.org/docs/hooks-reference.html#userefuseLayoutEffect
setelah membaca komentar lain di sini. Sepertinya bekerja dengan baik. :)useEffect(() => setDimensions({width: popup.current.clientWidth, height: popup.current.clientHeight}))
, dan IDE saya (WebStorm) menyarankan saya ini: ESLint: React Hook useEffect berisi panggilan ke 'setDimensions'. Tanpa daftar dependensi, ini dapat menyebabkan rantai pembaruan yang tak terbatas. Untuk memperbaikinya, berikan [] sebagai argumen kedua ke Hook useEffect. (react-hooks / exhaustive-deps) , jadi berikan[]
argumen kedua keuseEffect
Anda juga ingin menggunakan referensi pada elemen daripada menggunakan
document.getElementById
, itu hanya hal yang sedikit lebih kuat.sumber
angularJs
danreact
saat bermigrasi dari satu ke yang lain? Ada beberapa kasus di mana manipulasi DOM langsung sangat dibutuhkanJawaban saya tahun 2020 (atau 2019)
biarkan menggunakan imajinasi Anda untuk apa yang hilang di sini (WidgetHead),
reactstrap
adalah sesuatu yang dapat Anda temukan di npm: gantiinnerRef
denganref
untuk elemen dom warisan (katakanlah a<div>
).useEffect atau useLayoutEffect
Yang terakhir dikatakan sinkron untuk perubahan
useLayoutEffect
(atauuseEffect
) argumen keduaArgumen kedua adalah array, dan diperiksa sebelum menjalankan fungsi dalam argumen pertama.
Saya dulu
karena diriku.current adalah null sebelum rendering, dan itu adalah hal yang baik untuk tidak diperiksa, parameter kedua di akhir
myself.current.clientHeight
adalah apa yang ingin saya periksa perubahannya.apa yang saya selesaikan di sini (atau coba pecahkan)
Di sini saya memecahkan masalah widget pada kisi yang mengubah ketinggiannya sesuai keinginan mereka sendiri, dan sistem kisi harus cukup elastis untuk bereaksi ( https://github.com/STRML/react-grid-layout ).
sumber
useLayoutEffect
dan div aktual untuk mengikat wasit.Menggunakan dengan kait:
Jawaban ini akan membantu jika dimensi konten Anda berubah setelah pemuatan.
onreadystatechange : Terjadi saat status muat data yang termasuk dalam elemen atau dokumen HTML berubah. Peristiwa onreadystatechange diaktifkan pada dokumen HTML saat status muat konten halaman telah berubah.
Saya mencoba bekerja dengan pemutar video youtube yang disematkan yang dimensinya dapat berubah setelah memuat.
sumber
Saya menemukan paket npm yang berguna https://www.npmjs.com/package/element-resize-detector
Pemroses pengubahan ukuran lintas browser yang dioptimalkan untuk elemen.
Dapat menggunakannya dengan komponen React atau komponen fungsional (Berguna khusus untuk kait reaksi)
sumber
Berikut ini satu lagi jika Anda membutuhkan acara pengubahan ukuran jendela:
kode pena
sumber
Solusi alternatif, jika Anda ingin mengambil ukuran elemen React secara sinkron tanpa harus merender elemen secara jelas, Anda dapat menggunakan ReactDOMServer dan DOMParser .
Saya menggunakan fungsi ini untuk mendapatkan ketinggian penyaji item daftar saya saat menggunakan react-window ( react-virtualized ) alih-alih harus melakukan hardcode
itemSize
prop yang diperlukan untuk FixedSizeList .utilities.js:
sumber