hydration-strat-custom.html 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. <script src="../../dist/vue.global.js"></script>
  2. <div><span id="custom-trigger">click here to hydrate</span></div>
  3. <div id="app"><button>0</button></div>
  4. <script>
  5. window.isHydrated = false
  6. const { createSSRApp, defineAsyncComponent, h, ref, onMounted } = Vue
  7. const Comp = {
  8. setup() {
  9. const count = ref(0)
  10. onMounted(() => {
  11. console.log('hydrated')
  12. window.isHydrated = true
  13. })
  14. return () => {
  15. return h('button', { onClick: () => count.value++ }, count.value)
  16. }
  17. },
  18. }
  19. const AsyncComp = defineAsyncComponent({
  20. loader: () => Promise.resolve(Comp),
  21. hydrate: (hydrate, el) => {
  22. const triggerEl = document.getElementById('custom-trigger')
  23. triggerEl.addEventListener('click', hydrate, { once: true })
  24. return () => {
  25. window.teardownCalled = true
  26. triggerEl.removeEventListener('click', hydrate)
  27. }
  28. },
  29. })
  30. const show = (window.show = ref(true))
  31. createSSRApp({
  32. setup() {
  33. onMounted(() => {
  34. window.isRootMounted = true
  35. })
  36. return () => (show.value ? h(AsyncComp) : 'off')
  37. },
  38. }).mount('#app')
  39. </script>