Browse Source
* fix: fix * fix: fix * fix: fix * fix: fix * fix: fix * fix: fix * fix: fix * fix: fix * fix: fix * test: fix test * fix: fix * fix: fix * fix: fix * test: add test * fix: fix testpull/37915/head
lijianan
2 years ago
committed by
GitHub
5 changed files with 85 additions and 126 deletions
@ -1,51 +1,38 @@ |
|||
import React, { memo, useContext, useRef, useState } from 'react'; |
|||
import { render, fireEvent } from '../../../tests/utils'; |
|||
import LocaleProvider, { ANT_MARK } from '..'; |
|||
import React, { memo, useContext } from 'react'; |
|||
import { fireEvent, pureRender } from '../../../tests/utils'; |
|||
import LocaleProvider from '..'; |
|||
import LocaleContext from '../context'; |
|||
|
|||
const defaultLocale = { locale: 'locale' }; |
|||
let innerCount = 0; |
|||
let outerCount = 0; |
|||
|
|||
const handleClick = () => { |
|||
outerCount++; |
|||
}; |
|||
|
|||
// we use'memo' here in order to only render inner component while context changed.
|
|||
const CacheInner = memo(() => { |
|||
const countRef = useRef(0); |
|||
countRef.current++; |
|||
const CacheInner: React.FC = memo(() => { |
|||
innerCount++; |
|||
// subscribe locale context
|
|||
useContext(LocaleContext); |
|||
return ( |
|||
<div> |
|||
Child Rendering Count: <span id="child_count">{countRef.current}</span> |
|||
</div> |
|||
); |
|||
return null; |
|||
}); |
|||
|
|||
const CacheOuter: React.FC = () => { |
|||
// We use 'useState' here in order to trigger parent component rendering.
|
|||
const [count, setCount] = useState(1); |
|||
const handleClick = () => { |
|||
setCount(count + 1); |
|||
}; |
|||
// During each rendering phase, the cached context value returned from method 'LocaleProvider#getMemoizedContextValue' will take effect.
|
|||
// So 'CacheInner' component won't rerender.
|
|||
return ( |
|||
<div> |
|||
<button type="button" onClick={handleClick} id="parent_btn"> |
|||
Click |
|||
</button> |
|||
Parent Rendering Count: <span id="parent_count">{count}</span> |
|||
<LocaleProvider locale={defaultLocale} _ANT_MARK__={ANT_MARK}> |
|||
<CacheInner /> |
|||
</LocaleProvider> |
|||
</div> |
|||
); |
|||
}; |
|||
|
|||
const CacheOuter: React.FC = memo(() => ( |
|||
<> |
|||
<button type="button" onClick={handleClick} id="parent_btn"> |
|||
Click |
|||
</button> |
|||
<LocaleProvider locale={{ locale: 'locale' }}> |
|||
<CacheInner /> |
|||
</LocaleProvider> |
|||
</> |
|||
)); |
|||
it("Rendering on LocaleProvider won't trigger rendering on child component.", () => { |
|||
const { container } = render(<CacheOuter />); |
|||
fireEvent.click(container.querySelector('#parent_btn')!); |
|||
expect(container.querySelector('#parent_count')?.innerHTML).toBe('2'); |
|||
// child component won't rerender
|
|||
expect(container.querySelector('#child_count')?.innerHTML).toBe('1'); |
|||
const { container } = pureRender(<CacheOuter />); |
|||
expect(outerCount).toBe(0); |
|||
expect(innerCount).toBe(1); |
|||
fireEvent.click(container.querySelector('#parent_btn')!); |
|||
expect(container.querySelector('#parent_count')?.innerHTML).toBe('3'); |
|||
// child component won't rerender
|
|||
expect(container.querySelector('#child_count')?.innerHTML).toBe('1'); |
|||
expect(outerCount).toBe(1); |
|||
expect(innerCount).toBe(1); |
|||
}); |
|||
|
Loading…
Reference in new issue