React和高階函數的定義就不説了,主要是記錄下小白看react庫時大佬用高階組件時看不懂的地方。
export const createCesiumComponent = <E, P, C, CC = {}, R = {}>(
opts: CesiumComponentOption<E, P, C, CC, R>,
): CesiumComponentType<E, P, C> => {
class CesiumComponent extends React.PureComponent<WithContextProps<P, C>> {
......
}
先看 class CesiumComponent extends React.PureComponent<WithContextProps<P,C>>
React.PureComponent 與 React.Component 幾乎完全相同,但 React.PureComponent 通過prop和state的淺對比來實現 shouldComponentUpate()。
如果React組件的 render() 函數在給定相同的props和state下渲染為相同的結果,在某些場景下你可以使用 React.PureComponent 來提升性能。
React.PureComponent 的 shouldComponentUpdate() 只會對對象進行淺對比。如果對象包含複雜的數據結構,它可能會因深層的數據不一致而產生錯誤的否定判斷(表現為對象深層的數據已改變視圖卻沒有更新, 原文:false-negatives)。當你期望只擁有簡單的props和state時,才去繼承 PureComponent ,或者在你知道深層的數據結構已經發生改變時使用 forceUpate() 。或者,考慮使用 不可變對象 來促進嵌套數據的快速比較。
此外,React.PureComponent 的 shouldComponentUpate() 會忽略整個組件的子級。請確保所有的子級組件也是”Pure”的。
原文鏈接
PureComponent理解了,看Context,withContext,涉及
Context 提供了一種在組件之間共享此類值的方式,而不必通過組件樹的每個層級顯式地傳遞 props
接着看CesiumComponentOption接口
export interface CesiumComponentOption<E, P, C, CC = {}, R = {}> {
name: string;
create: (
cesiumProps: Readonly<P>,
props: Readonly<P>,
context: Readonly<C>,
ref?: React.RefObject<R>,
) => E | [E, any];
mount?: (element: E, context: Readonly<C>, props: Readonly<P>, ref?: React.RefObject<R>) => void;
unmount?: (
element: E,
context: Readonly<C>,
props: Readonly<P>,
ref: React.RefObject<R> | undefined,
state: any,
) => void;
render?: (
element: E | undefined,
props: Readonly<P> & Readonly<{ children?: React.ReactNode }>,
mounted: boolean,
ref: React.RefObject<R> | undefined,
) => React.ReactNode;
update?: (element: E, props: Readonly<P>, prevProps: Readonly<P>, context: Readonly<C>) => void;
provide?: (element: E, props: Readonly<P>, state: any) => CC;
cesiumProps?: (keyof P)[];
cesiumReadonlyProps?: (keyof P)[];
cesiumEventProps?: EventkeyMap<E, keyof P>;
setCesiumPropsAfterCreate?: boolean;
noRender?: boolean;
createRef?: boolean;
defaultProps?: Partial<P>;
}
看這個
cesiumProps: Readonly<P>,
props: Readonly<P>,
context: Readonly<C>,
ref?: React.RefObject<R>,
泛型大概知道了,看create,mount,unmount,update,這看起來是定義了生命週期。
後面就不用看了,大概就是有這樣的一個組件:Clock,它是通過高階組件createCesiumComponent創建的,高階組件在Clock本身有的
componentDidMount,componentDidUpdate,componentWillUnmount中加了料,又封裝了一套生命週期。
後面的看懂了再分享。