Skip to content

Commit 0c45036

Browse files
authored
Merge commit from fork
1 parent 720b566 commit 0c45036

2 files changed

Lines changed: 25 additions & 23 deletions

File tree

src/jsx/base.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -384,15 +384,7 @@ export const memo = <T>(
384384
component: FC<T>,
385385
propsAreEqual: (prevProps: Readonly<T>, nextProps: Readonly<T>) => boolean = shallowEqual
386386
): FC<T> => {
387-
let computed: ReturnType<FC<T>> = null
388-
let prevProps: T | undefined = undefined
389-
const wrapper: MemorableFC<T> = ((props: T) => {
390-
if (prevProps && !propsAreEqual(prevProps, props)) {
391-
computed = null
392-
}
393-
prevProps = props
394-
return (computed ||= component(props))
395-
}) as MemorableFC<T>
387+
const wrapper: MemorableFC<T> = ((props: T) => component(props)) as MemorableFC<T>
396388

397389
// This function is for toString(), but it can also be used for DOM renderer.
398390
// So, set DOM_MEMO and DOM_RENDERER for DOM renderer.

src/jsx/index.test.tsx

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
/* eslint-disable @typescript-eslint/no-explicit-any */
33
import { html } from '../helper/html'
44
import { Hono } from '../hono'
5+
import { DOM_MEMO } from './constants'
56
import { captureRenderContext } from './context'
67
import { Suspense, renderToReadableStream } from './streaming'
78
import DefaultExport, {
@@ -742,7 +743,7 @@ describe('className', () => {
742743
})
743744

744745
describe('memo', () => {
745-
it('memoized', () => {
746+
it('does not reuse the result of a previous render', () => {
746747
let counter = 0
747748
const Header = memo(() => <title>Test Site {counter}</title>)
748749
const Body = () => <span>{counter}</span>
@@ -773,10 +774,24 @@ describe('memo', () => {
773774
</html>
774775
)
775776
expect(template.toString()).toBe(
776-
'<html><head><title>Test Site 0</title></head><body><span>1</span></body></html>'
777+
'<html><head><title>Test Site 1</title></head><body><span>1</span></body></html>'
777778
)
778779
})
779780

781+
it('does not carry a context value into a later render', () => {
782+
const NameContext = createContext('anonymous')
783+
const Panel = memo(() => <p>{useContext(NameContext)}</p>)
784+
const render = (name: string) =>
785+
(
786+
<NameContext.Provider value={name}>
787+
<Panel />
788+
</NameContext.Provider>
789+
).toString()
790+
791+
expect(render('alice')).toBe('<p>alice</p>')
792+
expect(render('bob')).toBe('<p>bob</p>')
793+
})
794+
780795
it('props are updated', () => {
781796
const Body = memo(({ counter }: { counter: number }) => <span>{counter}</span>)
782797

@@ -787,20 +802,15 @@ describe('memo', () => {
787802
expect(template.toString()).toBe('<span>1</span>')
788803
})
789804

790-
it('custom propsAreEqual', () => {
791-
const Body = memo(
792-
({ counter }: { counter: number; refresh?: boolean }) => <span>{counter}</span>,
793-
(_, nextProps) => (typeof nextProps.refresh == 'undefined' ? true : !nextProps.refresh)
794-
)
795-
796-
let template = <Body counter={0} />
797-
expect(template.toString()).toBe('<span>0</span>')
805+
it('custom propsAreEqual is handed to the DOM renderer', () => {
806+
const propsAreEqual = (_: { counter: number }, nextProps: { counter: number }) =>
807+
nextProps.counter === 0
808+
const Body = memo(({ counter }: { counter: number }) => <span>{counter}</span>, propsAreEqual)
798809

799-
template = <Body counter={1} />
800-
expect(template.toString()).toBe('<span>0</span>')
810+
expect((Body as any)[DOM_MEMO]).toBe(propsAreEqual)
801811

802-
template = <Body counter={2} refresh={true} />
803-
expect(template.toString()).toBe('<span>2</span>')
812+
expect((<Body counter={0} />).toString()).toBe('<span>0</span>')
813+
expect((<Body counter={1} />).toString()).toBe('<span>1</span>')
804814
})
805815
})
806816

0 commit comments

Comments
 (0)