面试题答案
一键面试- 代码示例
- 假设我们有如下复杂数据结构:
import { createMemo, createSignal } from'solid-js'; const App = () => { const [data, setData] = createSignal({ outer: { middle: { inner: [1, 2, 3] } } }); const specificValue = createMemo(() => { return data().outer.middle.inner[1]; }); const updateData = () => { setData(prev => { const newInner = [...prev.outer.middle.inner]; newInner[1] = 4; return { ...prev, outer: { ...prev.outer, middle: { ...prev.outer.middle, inner: newInner } } }; }); }; return ( <div> <p>Specific value: {specificValue()}</p> <button onClick={updateData}>Update Data</button> </div> ); }; export default App;
- 解释
- 数据结构和信号:我们使用
createSignal
创建了一个包含多层嵌套对象和数组的data
信号。这个信号存储了整个复杂数据结构。 - createMemo:
createMemo
用于创建一个依赖于data
信号的记忆化值specificValue
。createMemo
中的回调函数会在data
信号变化时重新计算。在这个回调函数中,我们提取了data
中特定部分data().outer.middle.inner[1]
。 - 更新数据:在
updateData
函数中,我们使用setData
来更新data
。为了让Solid.js能够检测到变化,我们使用了不可变数据更新的方式。具体来说,我们先展开原有的对象结构,然后更新需要变化的部分(这里是inner
数组中的第二个元素)。 - 性能优化:由于
createMemo
的记忆化特性,只有当data
信号中影响specificValue
计算的部分(即data().outer.middle.inner[1]
相关的部分)发生变化时,specificValue
才会重新计算。如果data
的其他部分发生变化,specificValue
不会重新计算,从而达到性能优化的目的。
- 数据结构和信号:我们使用