Rumah > Soal Jawab > teks badan
P粉6424362822023-08-16 10:19:47
Anda sedang mencampurkan DOM yang dibuat menggunakan React dan DOM yang dimanipulasi menggunakan Javascript tulen. Anda tidak boleh melakukan ini, ia hanya akan memutuskan hubungan DOM/VDOM.
Jika anda ingin mengelak daripada menggerakkan keseluruhan komponen untuk berfungsi seperti yang dilakukan oleh React, maka hanya gunakan Ref pada elemen kosong, faedahnya ialah anda mendapat faedah pemasangan dan nyahlekap komponen.
Kemudian anda boleh salin-tampal kod Javascript dan letakkan semuanya di dalam useEffect
.
Contohnya:
Di bawah saya telah mencipta dua butang, satu dikawal sepenuhnya oleh React dan satu lagi oleh JS, yang hanya akan menogol kelas pink-button
apabila anda mengklik padanya.
Saya juga meletakkan kotak pilihan untuk membalikkan susunan butang untuk menyebabkan pemaparan semula menunjukkan bahawa keadaan versi JS tidak dimusnahkan, pastikan anda menggunakan atribut key
semasa melakukan ini untuk memberitahu React bahawa ia adalah komponen yang sama. Perkara utama di sini adalah untuk menunjukkan bahawa React kini tidak lagi mengganggu butang ini, ia kini menjadi tanggungjawab anda sepenuhnya. Harap ini membantu anda memahami cara mencampurkan React dengan JS tulen.
const domContainer = document.querySelector('#mount'); const root = ReactDOM.createRoot(domContainer); const {createRef, useEffect, useState} = React; function JSButton() { const btnRef = createRef(); useEffect(() => { //do everything now from inside this useEffect const btn = btnRef.current; btn.innerText = 'This is a Javascript Button'; const doClick = () => btn.classList.toggle('pink-button'); btn.addEventListener('click', doClick); return () => { //we can also do any clean-up here btn.removeEventListner('click', doClick); } }, []); //only render the button component, //don't add any props, classes etc. //our JS will be handling it all. return <button ref={btnRef}/>; } function ReactButton() { const [pink, setPink] = useState(false); return <button onClick={() => setPink(p => !p)} className={pink ? 'pink-button' : ''}> React Button </button>; } function Test() { const [jsFirst, setJsFirst] = useState(false); return <React.Fragment> <input type="checkbox" checked={jsFirst} onChange={(e) => { setJsFirst(e.target.checked); }} />Js First {jsFirst ? <React.Fragment> <JSButton key={'js'}/> <ReactButton key={'r'}/> </React.Fragment> : <React.Fragment> <ReactButton key={'r'}/> <JSButton key={'js'}/> </React.Fragment> } </React.Fragment> } root.render(<Test/>);
.pink-button { background-color: pink; } button { display: block; width: 200px; margin: 1rem; }
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script> <div id="mount"></div>