我想我对反应性方面的信号、反应、推导非常了解。
但是,我无法理解如何突然将它们放入函数中,App()并且信号可以在信号更新时重复更新到 DOM 中?
我想也许这个文档解释了它,但它似乎太复杂了,难以理解。能用几段话解释清楚吗?
例如,我想象
<div>{value()}</div>
Run Code Online (Sandbox Code Playgroud)
从哪里来value()
const [value, setValue] = createSignal(123);
Run Code Online (Sandbox Code Playgroud)
会有一些代码来产生一些 Reaction 来对 Signalvalue的更改做出反应并更新 DOM,但是它是如何发生的呢?这createSignal()和普通版一样createSignal()还是特别版,设置了一个 Reaction 来更新 DOM?另外相关的是,既然App()只运行一次,那么为什么render()需要采取() => <App />但不能只采取<App />作为它的第一个参数呢?如果App()仅运行一次,则意味着() => <App />仅运行一次。那么为什么不直接给出 a<App />呢?
所以据说useCallback可以缓存一个函数,我认为目的是让代码运行得更快。
例如,如果我有:
const handleChange = (ev) => {
setMsg(ev.target.value);
};
Run Code Online (Sandbox Code Playgroud)
我也可以将其更改为:
const handleChange = useCallback((ev) => {
setMsg(ev.target.value);
}, []);
Run Code Online (Sandbox Code Playgroud)
这样现在函数就被缓存了。但是,每次重新渲染组件时是否都需要创建此函数?
为了测试它,我将其更改为 IIFE,以便从其中吐出该函数,并且它会打印出该函数正在吐出。
请参阅: https ://codesandbox.io/s/jolly-nightingale-zxqp8k
因此,每次当您在输入字段中输入内容时,都会输出一个新函数,如控制台中所示。因此,这意味着 IIFE 每次都会以任何方式执行,这意味着即使它不是 IIFE,函数文字每次也会被制作成函数对象。那么这如何帮助代码运行得更快呢?