即使元素从页面中删除,js 代码也会继续运行。
使用 react-js
编码时的第一个困难。因为页面没有重新加载,所以初始脚本仍在运行,如 setInterval、websocket、etc
代码。下面的简单示例元素已被删除但仍在运行。如果我必须使用全局变量创建,则无效
<button onclick="createNewJsCode()">create new js</button> <button onclick="removeJsCode()">remove js</button> <script> let id = '' function createNewJsCode(){ let s = document.createElement('script') let code = 'setInterval(`console.log(new Date())`,500)' s.id = (id = crypto.randomUUID()) s.appendChild(document.createTextNode(code)); document.body.appendChild(s); } function removeJsCode(){ document.getElementById(id).remove() } </script>
P粉3443557152024-02-18 12:15:34
你不能仅仅删除 <script>
节点,你必须做一些更具体的清理。
setInterval
返回一个间隔 ID,您可以将其传递给 clearInterval
以停止它。
一般来说,我想说你的代码在 React 上下文中没有多大意义,但在你的情况下,你可以这样做:
sssccc
P粉0837850142024-02-18 10:00:45
这是一个 React 问题,下面是在 React 组件中使用 setInterval
的示例。如果您使用某种形式的 React Router,下面的代码也将正确卸载/安装等。
const {useState, useEffect} = React; function Page() { const [counter, setCounter] = useState(0); useEffect(() => { const i = setInterval(() => { console.log(new Date()); setCounter(c => c +1); }, 1000); return () => { console.log('umount'); clearInterval(i); } }, []); returnThis is a page, and when unmounted will end the setInterval.} function OtherInfo() { return
Counter: {counter}, time: {new Date().toLocaleString()}
Check console you will also see console logging of datetime finishes.Notice how the timer stopped inside the console.} function App() { const [pageVis, setPageVis] = useState(true); return
If you click Show Page the component will be mounted again, this is kind of the basis of how React Router works in a Single Page Application (SPA).{pageVis &&} const root = ReactDOM.createRoot(document.querySelector('#mount')); root.render(} {!pageVis && }
{pageVis && } {!pageVis && });
sssccc sssccc