Maison > Questions et réponses > le corps du texte
P粉6424362822023-08-16 10:19:47
Vous mélangez du DOM créé à l'aide de React et du DOM manipulé à l'aide de Javascript pur. Vous ne pouvez pas faire cela, cela romprait simplement la relation DOM/VDOM.
Si vous souhaitez éviter de déplacer l'ensemble du composant pour qu'il fonctionne comme le fait React, utilisez simplement Ref sur un élément vide, l'avantage est que vous bénéficiez des avantages du montage et du démontage des composants.
Ensuite, vous pouvez copier-coller le code Javascript et simplement tout mettre à l'intérieur useEffect
.
Par exemple :
Ci-dessous, j'ai créé deux boutons, l'un entièrement contrôlé par React et l'autre par JS, qui feront simplement basculer la classe pink-button
lorsque vous cliquerez dessus.
J'ai également placé une case à cocher pour inverser l'ordre des boutons afin de provoquer un nouveau rendu montrant que l'état de la version JS n'a pas été détruit, assurez-vous d'utiliser l'attribut key
lors de cette opération pour faire savoir à React qu'il s'agit du même composant. L'essentiel ici est de montrer que React n'interférera désormais plus avec ce bouton, c'est désormais entièrement votre responsabilité. J'espère que cela vous aidera à comprendre comment mélanger React avec du JS pur.
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>