MST

星途 面试题库

面试题:Solid.js的createMemo在复杂场景的数据更新处理

假设有一个复杂的Solid.js应用场景,页面中有多个列表,每个列表项的某些属性依赖于通过createMemo计算得到的值。当某个列表项发生变化时,如何确保createMemo的计算不会过度触发,且能正确更新相关视图?请描述思路并给出关键代码片段。
19.7万 热度难度
前端开发Solid.js

知识考点

AI 面试

面试题答案

一键面试

思路

  1. 细粒度依赖管理:使用 createMemo 时,确保其依赖项是尽可能细粒度的,避免依赖不必要的数据,这样可以减少不必要的重新计算。
  2. 局部状态管理:对于每个列表项,将其状态管理独立化,避免一个列表项的变化影响到其他无关列表项所依赖的 createMemo
  3. 使用 on 事件处理:在处理列表项变化时,精确控制更新逻辑,只有在真正相关的数据变化时才触发 createMemo 的重新计算。

关键代码片段

import { createSignal, createMemo, on } from 'solid-js';

// 示例数据
const list = createSignal([
  { id: 1, value: 'a', dependentValue: null },
  { id: 2, value: 'b', dependentValue: null }
]);

// 创建createMemo
const memoizedValue = createMemo(() => {
  return list().map(item => {
    // 这里进行复杂计算,假设依赖于item.value
    return item.value.toUpperCase();
  });
});

// 处理列表项变化
const handleItemChange = (itemId, newValue) => {
  on(() => {
    const newList = list().map(item => {
      if (item.id === itemId) {
        return {...item, value: newValue };
      }
      return item;
    });
    list(newList);
  }, []);
};

// 渲染部分
const App = () => {
  return (
    <div>
      {list().map(item => (
        <div key={item.id}>
          <input
            type="text"
            value={item.value}
            onChange={(e) => handleItemChange(item.id, e.target.value)}
          />
          {/* 显示依赖于createMemo计算的值 */}
          <span>{memoizedValue()[list().findIndex(i => i.id === item.id)]}</span>
        </div>
      ))}
    </div>
  );
};

export default App;

在上述代码中:

  • createMemo 依赖于 list,但计算逻辑仅依赖于列表项的 value 属性,实现细粒度依赖。
  • handleItemChange 使用 on 事件处理,精确控制列表项变化时的更新逻辑,避免过度触发 createMemo
  • 渲染部分通过索引关联列表项和 memoizedValue 中的对应计算值,确保正确更新相关视图。