ssrDynamicComponent.spec.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { createApp, createVNode } from 'vue'
  2. import { renderToString } from '../src'
  3. describe('ssr: dynamic component', () => {
  4. test('resolved to component', async () => {
  5. expect(
  6. await renderToString(
  7. createApp({
  8. components: {
  9. one: {
  10. template: `<div><slot/></div>`,
  11. },
  12. },
  13. template: `<component :is="'one'"><span>slot</span></component>`,
  14. }),
  15. ),
  16. ).toBe(
  17. `<div><!--[--><span>slot</span><!--]--></div><!--dynamic-component-->`,
  18. )
  19. })
  20. test('resolved to component with v-show', async () => {
  21. expect(
  22. await renderToString(
  23. createApp({
  24. components: {
  25. one: {
  26. template: `<component is="div"><slot/></component>`,
  27. },
  28. },
  29. template: `<one><one v-show="false">hi</one></one>`,
  30. }),
  31. ),
  32. ).toBe(
  33. `<div><!--[--><div style="display:none;"><!--[-->hi<!--]--></div><!--dynamic-component--><!--]--></div><!--dynamic-component-->`,
  34. )
  35. })
  36. test('resolve to element', async () => {
  37. expect(
  38. await renderToString(
  39. createApp({
  40. template: `<component :is="'p'"><span>slot</span></component>`,
  41. }),
  42. ),
  43. ).toBe(`<p><span>slot</span></p><!--dynamic-component-->`)
  44. })
  45. test('resolve to component vnode', async () => {
  46. const Child = {
  47. props: ['id'],
  48. template: `<div>{{ id }}<slot/></div>`,
  49. }
  50. expect(
  51. await renderToString(
  52. createApp({
  53. setup() {
  54. return {
  55. vnode: createVNode(Child, { id: 'test' }),
  56. }
  57. },
  58. template: `<component :is="vnode"><span>slot</span></component>`,
  59. }),
  60. ),
  61. ).toBe(
  62. `<div>test<!--[--><span>slot</span><!--]--></div><!--dynamic-component-->`,
  63. )
  64. })
  65. test('resolve to element vnode', async () => {
  66. expect(
  67. await renderToString(
  68. createApp({
  69. setup() {
  70. return {
  71. vnode: createVNode('div', { id: 'test' }),
  72. }
  73. },
  74. template: `<component :is="vnode"><span>slot</span></component>`,
  75. }),
  76. ),
  77. ).toBe(`<div id="test"><span>slot</span></div><!--dynamic-component-->`)
  78. })
  79. })