Skip to content

Commit 76ea54b

Browse files
author
arnoson
committed
feat: expose refs and refsAll on element
use `myHtmlElement.$refs` and `myHtmlElement.$refsAll` to access the element's refs closes #2
1 parent 01d90a9 commit 76ea54b

File tree

3 files changed

+41
-2
lines changed

3 files changed

+41
-2
lines changed

src/mountComponent.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { getComponent } from './registerComponent'
2-
import { SimpleRefs, SimpleRefsAll } from './types'
2+
import { SimpleElement, SimpleRefs, SimpleRefsAll } from './types'
33
import { walkComponent } from './walkComponent'
44

55
const getRefsAll = (el: HTMLElement): SimpleRefsAll => {
@@ -33,7 +33,10 @@ export const mountComponent = (el: HTMLElement, isChild = false) => {
3333

3434
const component = getComponent(el)
3535
if (component) {
36-
;(el as any).$component = component({ el, refs, refsAll }) || {}
36+
const simpleEl = el as SimpleElement<ReturnType<typeof component>>
37+
simpleEl.$component = component({ el, refs, refsAll }) || {}
38+
simpleEl.$refs = refs
39+
simpleEl.$refsAll = refsAll
3740
}
3841
}
3942

src/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ export type SimpleInstance<C extends SimpleComponent> = ReturnType<C>
1010

1111
export type SimpleElement<C extends SimpleComponent, T = HTMLElement> = T & {
1212
$component: SimpleInstance<C>
13+
$refs: SimpleRefs,
14+
$refsAll: SimpleRefsAll
1315
}
1416

1517
export interface SimpleComponentPayload<T> {

tests/index.test.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,40 @@ it('interferes prop types from default values', () => {
161161
expect(readProps(el!)).toMatchSnapshot()
162162
})
163163

164+
it(`exposes the component's refs`, () => {
165+
const component = registerComponent('test', () => {})
166+
167+
document.body.innerHTML = `
168+
<div data-simple-component="test" id="my-id">
169+
<div id="ref" data-ref="ref"></div>
170+
</div>
171+
`
172+
const refs = { ref: document.getElementById('ref') }
173+
mountComponents(document.body)
174+
const el = document.getElementById('my-id') as SimpleElement<typeof component>
175+
expect(el.$refs).toEqual(refs)
176+
})
177+
178+
it(`exposes the component's refsAll`, () => {
179+
const component = registerComponent('test', () => {})
180+
181+
document.body.innerHTML = `
182+
<div data-simple-component="test" id="my-id">
183+
<div id="ref1" data-ref="myRef"></div>
184+
<div id="ref2" data-ref="myRef"></div>
185+
</div>
186+
`
187+
188+
const myRef = [
189+
document.getElementById('ref1'),
190+
document.getElementById('ref2'),
191+
]
192+
193+
mountComponents(document.body)
194+
const el = document.getElementById('my-id') as SimpleElement<typeof component>
195+
expect(el.$refsAll).toEqual({ myRef })
196+
})
197+
164198
it(`exposes the component function's return value`, () => {
165199
const exposed = { test: () => {} }
166200
const component = registerComponent('test', () => exposed)

0 commit comments

Comments
 (0)