这可能与React的本质相反,但是...我可以无限地更新DOM吗?我想运行这样的东西,直到我杀死应用程序。添加一个停止按钮会很好,但我可以在控制台CTRL+C。
x=1; while(x > 0){ // append DOM with `<div>${x}</div>` x+=1; }
我使用useRef作为DOM容器,并尝试将逻辑放在useEffect钩子中,但React不喜欢开放式更新。
a64a0gku1#
我对您的用例非常感兴趣,了解更多信息会很好,因为请求很奇怪,但我喜欢挑战,所以我开始了。React具有无限循环检测功能,但您可以通过确保仅在每个DOM元素都已提交到DOM之后才添加DOM元素来实现这一点。
import { useState, useLayoutEffect } from "react"; export default function InfiniteDivAppender() { const [divCount, setDivCount] = useState(1); const [pause, setPause] = useState(false); useLayoutEffect(() => { if (pause) return; setImmediate(() => setDivCount((prev) => prev + 1)); }, [divCount, pause]); return ( <> <button onClick={() => setPause((prev) => !prev)}> {pause ? "Resume" : "Pause"} </button> {[...Array(divCount).keys()].map((n, index) => ( <div key={index}>{index}</div> ))} </> ); }
请注意,这仍然是一个疯狂的浏览器操作量,您可能需要等待几秒钟的标签赶上,但它最终打印,它也不会触发循环检测,因为我使用的是setImmediate与useLayoutEffect(注意:而不是useEffect)。注意控制台上的ctrl+c可能不会让你从崩溃的浏览器选项卡中解脱出来--它最终会崩溃,因为你不可能在一个网页上有无限的节点。
setImmediate
useLayoutEffect
useEffect
s4n0splo2#
我用一个无限循环useEffect完成了这一点。看起来它在控制台中给了你一个关于最大深度的错误,但它似乎还在运行?
import "./styles.css"; import {useState, useEffect} from "react" export default function App() { const [array, setArray] = useState([]) useEffect(() => { setArray([...array, "hi"]) }, [array]) return ( <div className="App"> {array.map((_, i) => <h1 key={i}>#{i}</h1>)} </div> ); }
2条答案
按热度按时间a64a0gku1#
我对您的用例非常感兴趣,了解更多信息会很好,因为请求很奇怪,但我喜欢挑战,所以我开始了。
React具有无限循环检测功能,但您可以通过确保仅在每个DOM元素都已提交到DOM之后才添加DOM元素来实现这一点。
请注意,这仍然是一个疯狂的浏览器操作量,您可能需要等待几秒钟的标签赶上,但它最终打印,它也不会触发循环检测,因为我使用的是
setImmediate
与useLayoutEffect
(注意:而不是useEffect
)。注意控制台上的ctrl+c可能不会让你从崩溃的浏览器选项卡中解脱出来--它最终会崩溃,因为你不可能在一个网页上有无限的节点。
s4n0splo2#
我用一个无限循环useEffect完成了这一点。看起来它在控制台中给了你一个关于最大深度的错误,但它似乎还在运行?