apiExpose.spec.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { ref, shallowRef } from '@vue/reactivity'
  2. import { createComponent } from '../src/apiCreateComponent'
  3. import { setRef } from '../src/dom/templateRef'
  4. import { makeRender } from './_utils'
  5. import {
  6. type ComponentInternalInstance,
  7. getCurrentInstance,
  8. } from '../src/component'
  9. const define = makeRender()
  10. describe('api: expose', () => {
  11. test('via setup context', () => {
  12. const { component: Child } = define({
  13. setup(_, { expose }) {
  14. expose({
  15. foo: 1,
  16. bar: ref(2),
  17. })
  18. return {
  19. bar: ref(3),
  20. baz: ref(4),
  21. }
  22. },
  23. })
  24. const childRef = ref()
  25. const { render } = define({
  26. render: () => {
  27. const n0 = createComponent(Child)
  28. setRef(n0, childRef)
  29. return n0
  30. },
  31. })
  32. render()
  33. expect(childRef.value).toBeTruthy()
  34. expect(childRef.value.foo).toBe(1)
  35. expect(childRef.value.bar).toBe(2)
  36. expect(childRef.value.baz).toBeUndefined()
  37. })
  38. test('via setup context (expose empty)', () => {
  39. let childInstance: ComponentInternalInstance | null = null
  40. const { component: Child } = define({
  41. setup(_) {
  42. childInstance = getCurrentInstance()
  43. },
  44. })
  45. const childRef = shallowRef()
  46. const { render } = define({
  47. render: () => {
  48. const n0 = createComponent(Child)
  49. setRef(n0, childRef)
  50. return n0
  51. },
  52. })
  53. render()
  54. expect(childInstance!.exposed).toBeUndefined()
  55. expect(childRef.value).toBe(childInstance!)
  56. })
  57. test('warning for ref', () => {
  58. const { render } = define({
  59. setup(_, { expose }) {
  60. expose(ref(1))
  61. },
  62. })
  63. render()
  64. expect(
  65. 'expose() should be passed a plain object, received ref',
  66. ).toHaveBeenWarned()
  67. })
  68. test('warning for array', () => {
  69. const { render } = define({
  70. setup(_, { expose }) {
  71. expose(['focus'])
  72. },
  73. })
  74. render()
  75. expect(
  76. 'expose() should be passed a plain object, received array',
  77. ).toHaveBeenWarned()
  78. })
  79. test('warning for function', () => {
  80. const { render } = define({
  81. setup(_, { expose }) {
  82. expose(() => null)
  83. },
  84. })
  85. render()
  86. expect(
  87. 'expose() should be passed a plain object, received function',
  88. ).toHaveBeenWarned()
  89. })
  90. })