面试题答案
一键面试实现思路
- 设计上下文结构:创建一个包含基础数据及额外功能(如权限验证函数、数据缓存对象)的上下文对象。
- 定制
createContext
:使用createContext
创建上下文,并对其进行扩展,添加所需的额外功能。 - 定制
useContext
:封装原生的useContext
,使其返回带有额外功能的上下文对象。 - 在组件中使用:在不同组件中使用定制后的上下文,展示其在权限验证、数据缓存等场景下的有效性。
实现步骤
- 创建基础上下文:使用
createContext
创建一个基础上下文。 - 添加额外功能:对上下文对象进行扩展,添加权限验证、数据缓存等功能。
- 封装
useContext
:创建一个自定义的useContext
钩子,返回扩展后的上下文对象。 - 在组件中使用定制后的上下文:在不同组件中调用自定义的
useContext
钩子,使用上下文的各种功能。
代码示例
import { createContext, createSignal, onCleanup, useContext, useMemo } from "solid-js";
// 创建基础上下文
const BaseContext = createContext();
// 定制上下文,添加权限验证和数据缓存功能
const ExtendedContext = (() => {
const context = BaseContext;
const cache = {};
const hasPermission = (role, permission) => {
// 简单模拟权限验证逻辑
const rolePermissions = {
admin: ["read", "write", "delete"],
user: ["read"]
};
return rolePermissions[role]?.includes(permission) || false;
};
context.extra = {
cache,
hasPermission
};
return context;
})();
// 封装 useContext
const useExtendedContext = () => {
const ctx = useContext(ExtendedContext);
return {
...ctx,
...ExtendedContext.extra
};
};
// 提供上下文的组件
const ContextProvider = ({ children }) => {
const [data, setData] = createSignal('default data');
const role = 'admin';
const value = { data, setData, role };
return (
<ExtendedContext.Provider value={value}>
{children}
</ExtendedContext.Provider>
);
};
// 使用上下文的组件
const ChildComponent = () => {
const { data, setData, role, hasPermission, cache } = useExtendedContext();
// 使用数据缓存
if (!cache.someData) {
cache.someData = 'cached data';
}
// 权限验证
const canWrite = hasPermission(role, 'write');
return (
<div>
<p>Data: {data()}</p>
<p>Cache: {cache.someData}</p>
<p>Can Write: {canWrite? 'Yes' : 'No'}</p>
<button onClick={() => setData('new data')}>Update Data</button>
</div>
);
};
const App = () => {
return (
<ContextProvider>
<ChildComponent />
</ContextProvider>
);
};
export default App;
不同应用场景下的有效性展示
- 权限验证:
ChildComponent
中通过hasPermission
函数验证当前角色是否具有特定权限,并在界面上展示验证结果。 - 数据缓存:
ChildComponent
中首次访问cache.someData
时进行缓存,并在后续访问中直接使用缓存数据,展示了数据缓存功能的有效性。
通过以上步骤和代码示例,完成了对 createContext
和 useContext
的深度定制,并在不同应用场景下展示了定制后上下文的有效性。