MST
星途 面试题库

面试题:Solid.js createMemo 的依赖管理与性能

在一个具有多层嵌套组件的 Solid.js 应用中,某个深层次组件使用 `createMemo` 依赖了来自顶层组件传递下来的多个 props。当顶层组件的部分 props 频繁变化,但其中只有少数几个真正影响 `createMemo` 的计算结果时,如何优化 `createMemo` 的依赖以避免不必要的计算?说明具体的优化思路和可能用到的技术。
11.0万 热度难度
前端开发Solid.js

知识考点

AI 面试

面试题答案

一键面试
  1. 优化思路
    • 减少 createMemo 的依赖范围,只让其依赖真正影响计算结果的 props。这样当其他不相关的 props 变化时,createMemo 不会重新计算。
  2. 可能用到的技术
    • 手动提取依赖:从传递下来的多个 props 中,手动提取出真正影响计算结果的 props 并作为 createMemo 的依赖。例如,如果顶层组件传递了 props1, props2, props3, props4,而只有 props2props4 影响 createMemo 的计算,那么 createMemo 的依赖就只设置为 props2props4。示例代码如下:
import { createMemo } from'solid-js';

const DeepComponent = ({ props1, props2, props3, props4 }) => {
    const memoizedValue = createMemo(() => {
        // 这里的计算只依赖 props2 和 props4
        return props2 + props4;
    });

    return <div>{memoizedValue()}</div>;
};
  • 使用 createSelector(类似 Redux - reselect 的思路):虽然 Solid.js 本身没有 createSelector,但可以自行实现类似功能。这个函数接收多个依赖值和一个计算函数,只有当依赖值变化时才会重新计算。例如:
import { createMemo } from'solid-js';

const createSelector = (...depsAndFunc) => {
    const deps = depsAndFunc.slice(0, -1);
    const func = depsAndFunc[depsAndFunc.length - 1];
    return createMemo(() => {
        const depValues = deps.map(dep => dep());
        return func(...depValues);
    });
};

const DeepComponent = ({ props1, props2, props3, props4 }) => {
    const memoizedValue = createSelector(
        () => props2,
        () => props4,
        (p2, p4) => {
            return p2 + p4;
        }
    );

    return <div>{memoizedValue()}</div>;
};

这样,只有当 props2props4 变化时,createMemo(这里通过 createSelector 包装)才会重新计算,避免了因 props1props3 变化导致的不必要计算。