apiTemplateRef.spec.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import {
  2. h,
  3. nextTick,
  4. nodeOps,
  5. ref,
  6. render,
  7. useTemplateRef,
  8. } from '@vue/runtime-test'
  9. describe('useTemplateRef', () => {
  10. test('should work', () => {
  11. let tRef
  12. const key = 'refKey'
  13. const Comp = {
  14. setup() {
  15. tRef = useTemplateRef(key)
  16. },
  17. render() {
  18. return h('div', { ref: key })
  19. },
  20. }
  21. const root = nodeOps.createElement('div')
  22. render(h(Comp), root)
  23. expect(tRef!.value).toBe(root.children[0])
  24. })
  25. test('should be readonly', () => {
  26. let tRef
  27. const key = 'refKey'
  28. const Comp = {
  29. setup() {
  30. tRef = useTemplateRef(key)
  31. },
  32. render() {
  33. return h('div', { ref: key })
  34. },
  35. }
  36. const root = nodeOps.createElement('div')
  37. render(h(Comp), root)
  38. // @ts-expect-error
  39. tRef.value = 123
  40. expect(tRef!.value).toBe(root.children[0])
  41. expect('target is readonly').toHaveBeenWarned()
  42. })
  43. test('should be updated for ref of dynamic strings', async () => {
  44. let t1, t2
  45. const key = ref('t1')
  46. const Comp = {
  47. setup() {
  48. t1 = useTemplateRef<HTMLAnchorElement>('t1')
  49. t2 = useTemplateRef('t2')
  50. },
  51. render() {
  52. return h('div', { ref: key.value })
  53. },
  54. }
  55. const root = nodeOps.createElement('div')
  56. render(h(Comp), root)
  57. expect(t1!.value).toBe(root.children[0])
  58. expect(t2!.value).toBe(null)
  59. key.value = 't2'
  60. await nextTick()
  61. expect(t2!.value).toBe(root.children[0])
  62. expect(t1!.value).toBe(null)
  63. })
  64. })