面试题答案
一键面试创建响应式数据
在Solid.js中,通过createSignal
函数来创建响应式数据。例如:
import { createSignal } from 'solid-js';
const [count, setCount] = createSignal(0);
这里createSignal
接受一个初始值(这里是0
),返回一个数组,第一个元素是当前值的读取器函数(count
),第二个元素是更新值的写入器函数(setCount
)。
在模板中使用响应式数据
import { createSignal } from 'solid-js';
import { render } from 'solid-js/web';
const [count, setCount] = createSignal(0);
const App = () => (
<div>
<p>Count: {count()}</p>
<button onClick={() => setCount(count() + 1)}>Increment</button>
</div>
);
render(() => <App />, document.getElementById('app'));
在模板<p>Count: {count()}</p>
中,我们调用count()
来获取当前值。当点击按钮调用setCount(count() + 1)
更新值时,依赖该信号(count
)的模板部分会自动重新渲染。
底层运行时机制
- 跟踪依赖:Solid.js使用一种细粒度的依赖跟踪机制。当模板中访问响应式数据(如
count()
)时,Solid.js会记录当前的渲染函数作为该数据的依赖。 - 响应式更新:当调用写入器函数(如
setCount
)更新响应式数据时,Solid.js会遍历所有依赖该数据的渲染函数,并将其标记为需要重新执行。 - 批处理更新:Solid.js会将多个状态更新进行批处理,避免不必要的重复渲染。例如,在一个事件处理函数中多次调用
setCount
,Solid.js会在事件处理完成后一次性更新所有依赖的模板部分,而不是每次调用setCount
都进行一次渲染。