Skip to content

Commit d0640d9

Browse files
TimothyKrelljavivelasco
authored andcommitted
Prevent remounting tunnel component on each render (#6)
1 parent 5d636e3 commit d0640d9

File tree

2 files changed

+31
-14
lines changed

2 files changed

+31
-14
lines changed

src/TunnelPlaceholder.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import PropTypes from 'prop-types'
2-
import React, { createElement, Component, Fragment } from 'react'
2+
import React, { Component, Fragment } from 'react'
33

44
class TunnelPlaceholder extends Component {
55
static propTypes = {
@@ -36,12 +36,12 @@ class TunnelPlaceholder extends Component {
3636
if (renderChildren) {
3737
if (Array.isArray(tunnelProps) || multiple) {
3838
return !tunnelProps
39-
? createElement(renderChildren, { items: [] })
40-
: createElement(renderChildren, {
39+
? renderChildren({ items: [] })
40+
: renderChildren({
4141
items: Array.isArray(tunnelProps) ? tunnelProps : [tunnelProps],
4242
})
4343
} else {
44-
return createElement(renderChildren, tunnelProps || {})
44+
return renderChildren(tunnelProps || {})
4545
}
4646
}
4747

tests/Tunnel.test.js

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,24 @@ configure({ adapter: new Adapter() })
99
const TUNNEL_ID = 'GroompyTunnel'
1010
const props = { message: 'Aihop!' }
1111

12-
const Msg = ({ message }) => (
13-
<div className="msg">{message || 'defaultMessage'}</div>
14-
)
15-
Msg.propTypes = { message: PropTypes.string }
12+
class Msg extends React.Component {
13+
componentWillMount() {
14+
this.props.willMount && this.props.willMount()
15+
}
16+
render() {
17+
const { message } = this.props
18+
return <div className="msg">{message || 'defaultMessage'}</div>
19+
}
20+
}
21+
Msg.propTypes = { message: PropTypes.string, willMount: PropTypes.func }
1622

1723
describe('Tunnel', () => {
1824
it('should render a tunnel passing props', () => {
1925
const wrapper = mount(
2026
<TunnelProvider>
2127
<div>
2228
<TunnelPlaceholder id={TUNNEL_ID}>
23-
{({ message }) => <span>{message}</span>}
29+
{({ message }) => <Msg message={message} />}
2430
</TunnelPlaceholder>
2531
<Tunnel id={TUNNEL_ID} {...props} />
2632
</div>
@@ -35,7 +41,7 @@ describe('Tunnel', () => {
3541
<div>
3642
<TunnelPlaceholder id={TUNNEL_ID} />
3743
<Tunnel id={TUNNEL_ID}>
38-
<span>{props.message}</span>
44+
<Msg message={props.message} />
3945
</Tunnel>
4046
</div>
4147
</TunnelProvider>,
@@ -83,7 +89,7 @@ describe('Tunnel', () => {
8389
const wrapper = mount(
8490
<TunnelProvider>
8591
<TunnelPlaceholder id={TUNNEL_ID}>
86-
{({ message }) => <span>{message || 'Empty'}</span>}
92+
{({ message }) => <Msg message={message || 'Empty'} />}
8793
</TunnelPlaceholder>
8894
</TunnelProvider>,
8995
)
@@ -102,12 +108,14 @@ describe('Tunnel', () => {
102108

103109
describe('update lifecycle', () => {
104110
const Component = (
105-
{ msg, visible }, //eslint-disable-line
111+
{ msg, visible, willMount }, //eslint-disable-line
106112
) => (
107113
<TunnelProvider>
108114
<div>
109115
<TunnelPlaceholder id={TUNNEL_ID}>
110-
{({ message }) => <span>{message || 'Empty'}</span>}
116+
{({ message }) => (
117+
<Msg message={message || 'Empty'} willMount={willMount} />
118+
)}
111119
</TunnelPlaceholder>
112120
{visible && <Tunnel id={TUNNEL_ID} message={msg} />}
113121
</div>
@@ -136,9 +144,18 @@ describe('Tunnel', () => {
136144
wrapper.setProps({ visible: false })
137145
assertTunnelPlaceholderContent(wrapper, 'Empty')
138146
})
147+
148+
it('should keep children mounted on re-render', () => {
149+
let mountSpy = jest.fn()
150+
const wrapper = mount(
151+
<Component msg={msg1} visible willMount={mountSpy} />,
152+
)
153+
wrapper.setProps({ msg: msg2 })
154+
expect(mountSpy).toHaveBeenCalledTimes(1)
155+
})
139156
})
140157

141158
function assertTunnelPlaceholderContent(wrapper, expectedContent) {
142-
expect(wrapper.find(TunnelPlaceholder).text()).toEqual(expectedContent)
159+
expect(wrapper.find(Msg).text()).toEqual(expectedContent)
143160
}
144161
})

0 commit comments

Comments
 (0)