使用场景
有一些页面,可以让用户自由配置页面的显示方案。
例如用户详情页,可能包含了很多个 div,每个 div 是用户相关的属性,那么就可以提供给用户自由配置 div 顺序的能力。
设计
在这个方案中,有两个关键属性,三个关键能力,以及一些优化点。
- 两个关键属性:pageConfigId 和 pageConfig。
- 需要重点说明的是,这里一定要使用 id 进行封装,建立从 id 到 config 的对应关系,以方便后续的处理。
- 三个关键能力:读取页面配置,更改页面配置,根据页面配置渲染页面。
- 读取页面配置
- 可以通过一个函数来实现,传入 id,返回 config。需要注意的是,这个函数往往是异步函数,所以还需要一个属性:pageConfigLoading。
- 更改页面配置
- 可以通过更改 pageConfigId 来实现,pageConfigId 的修改造成了 pageConfig 的修改。
- 根据页面配置渲染页面
- 这里就自由发挥的,主要是要规定好配置的类型。
- 读取页面配置
- 一些优化点
import { useAsyncEffect } from ‘ahooks’ import { Dispatch, useCallback, useState } from ‘react’
export type UsePageConfigParams
- 无论是否是异步函数,处理时都会当作异步函数来处理
/
getPageConfig: (id: string) => TConfig | Promise
defaultPageConfigId?: string /** 如果给定,则会将 page config id 存储到本地中 / localStorageKey?: string }
- 无论是否是异步函数,处理时都会当作异步函数来处理
/
getPageConfig: (id: string) => TConfig | Promise
export type UsePageConfigReturns
export function usePageConfig
const [pageConfigId, setPageConfigId] = useState
useAsyncEffect(async () => { setPageConfigLoading(true) const res = await getPageConfig(pageConfigId) setPageConfig(res) setPageConfigLoading(false) }, [pageConfigId])
const getIdFromLocal = useCallback(() => { if (localStorageKey) { return localStorage.getItem(localStorageKey) } return }, [])
const setIdToLocal = useCallback(() => { localStorageKey && localStorage.setItem(localStorageKey, pageConfigId) }, [pageConfigId])
return { pageConfigId, setPageConfigId, pageConfigLoading, pageConfig, getIdFromLocal, setIdToLocal, } }
```