App.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <script setup lang="ts">
  2. import { ref, shallowRef } from 'vue'
  3. import VaporComp from './components/VaporComp.vue'
  4. import VaporCompA from '../transition/components/VaporCompA.vue'
  5. import VdomComp from '../transition/components/VdomComp.vue'
  6. import VaporSlot from '../transition/components/VaporSlot.vue'
  7. import { defineVaporAsyncComponent, h } from 'vue'
  8. import VdomFoo from './components/VdomFoo.vue'
  9. const msg = ref('hello')
  10. const passSlot = ref(true)
  11. const toggleVapor = ref(true)
  12. const interopComponent = shallowRef(VdomComp)
  13. function toggleInteropComponent() {
  14. interopComponent.value =
  15. interopComponent.value === VaporCompA ? VdomComp : VaporCompA
  16. }
  17. const items = ref(['a', 'b', 'c'])
  18. const enterClick = () => items.value.push('d', 'e')
  19. import SimpleVaporComp from './components/SimpleVaporComp.vue'
  20. const disabled = ref(true)
  21. const duration = typeof process !== 'undefined' && process.env.CI ? 200 : 50
  22. const AsyncVDomFoo = defineVaporAsyncComponent({
  23. loader: () => {
  24. return new Promise(r => {
  25. setTimeout(() => {
  26. r(VdomFoo as any)
  27. }, duration)
  28. })
  29. },
  30. loadingComponent: () => h('span', 'loading...'),
  31. })
  32. </script>
  33. <template>
  34. <input v-model="msg" />
  35. <button class="toggle-vdom-slot-in-vapor" @click="passSlot = !passSlot">
  36. toggle #test slot
  37. </button>
  38. <VaporComp :msg="msg">
  39. <template #default="{ foo }">
  40. <div>slot prop: {{ foo }}</div>
  41. <div>component prop: {{ msg }}</div>
  42. </template>
  43. <template #test v-if="passSlot">A test slot</template>
  44. </VaporComp>
  45. <!-- transition interop -->
  46. <div>
  47. <div class="trans-vapor">
  48. <button @click="toggleVapor = !toggleVapor">
  49. toggle vapor component
  50. </button>
  51. <div>
  52. <Transition>
  53. <VaporCompA v-if="toggleVapor" />
  54. </Transition>
  55. </div>
  56. </div>
  57. <div class="trans-vdom-vapor-out-in">
  58. <button @click="toggleInteropComponent">
  59. switch between vdom/vapor component out-in mode
  60. </button>
  61. <div>
  62. <Transition name="fade" mode="out-in">
  63. <component :is="interopComponent"></component>
  64. </Transition>
  65. </div>
  66. </div>
  67. </div>
  68. <!-- transition-group interop -->
  69. <div>
  70. <div class="trans-group-vapor">
  71. <button @click="enterClick">insert items</button>
  72. <div>
  73. <transition-group name="test">
  74. <VaporSlot v-for="item in items" :key="item">
  75. <div>{{ item }}</div>
  76. </VaporSlot>
  77. </transition-group>
  78. </div>
  79. </div>
  80. </div>
  81. <!-- teleport -->
  82. <div class="teleport">
  83. <div class="teleport-target"></div>
  84. <div class="render-vapor-comp">
  85. <button @click="disabled = !disabled">toggle</button>
  86. <Teleport to=".teleport-target" defer :disabled="disabled">
  87. <SimpleVaporComp />
  88. </Teleport>
  89. </div>
  90. </div>
  91. <!-- teleport end-->
  92. <!-- async component -->
  93. <div class="async-component-interop">
  94. <div class="with-vdom-component">
  95. <AsyncVDomFoo />
  96. </div>
  97. </div>
  98. <!-- async component end -->
  99. </template>