This repository was archived by the owner on Oct 29, 2024. It is now read-only.
File tree Expand file tree Collapse file tree 7 files changed +95
-41
lines changed Expand file tree Collapse file tree 7 files changed +95
-41
lines changed Original file line number Diff line number Diff line change @@ -57,10 +57,10 @@ setComponentTemplate(
57
57
{{else}}
58
58
<p>Component is not in a CJK locale</p>
59
59
{{/if}}
60
-
61
60
<OtherComponent @count={{this.count}} /> <br/>
62
61
<button {{on "click" this.increment}}>Increment</button>
63
62
<TemplateOnlyComponent @name="For Glimmer"/>
63
+
64
64
`
65
65
) ,
66
66
MyComponent
Original file line number Diff line number Diff line change 1
1
import { renderComponent } from '@glimmer/core' ;
2
- import RehydratingComponent from './src/RehydratingComponent' ;
3
-
4
- document . addEventListener (
5
- 'DOMContentLoaded' ,
6
- ( ) => {
7
- const element = document . querySelector ( '.static-component' ) ;
8
- renderComponent ( RehydratingComponent , {
9
- element : element ! ,
10
- rehydrate : true ,
11
- } ) ;
2
+ import RehydratableCounter from './src/RehydratableCounter' ;
3
+
4
+ rehydrate ( {
5
+ get RehydratableCounter ( ) {
6
+ // Can load components async
7
+ return Promise . resolve ( RehydratableCounter ) ;
12
8
} ,
13
- { once : true }
14
- ) ;
9
+ } ) ;
10
+
11
+ function rehydrate ( componentMapping ) : void {
12
+ const hasHydrated = new WeakSet ( ) ;
13
+ const observer = new IntersectionObserver (
14
+ ( entries ) => {
15
+ entries . forEach ( async ( entry ) => {
16
+ if ( entry . isIntersecting && ! hasHydrated . has ( entry . target ) ) {
17
+ await renderComponent ( await componentMapping [ entry . target . dataset . hydrate ] , {
18
+ element : entry . target . parentElement ,
19
+ args : JSON . parse ( entry . target . querySelector ( 'script' ) . textContent ) ,
20
+ rehydrate : true ,
21
+ } ) ;
22
+ hasHydrated . add ( entry . target ) ;
23
+ }
24
+ } ) ;
25
+ } ,
26
+ {
27
+ root : null ,
28
+ }
29
+ ) ;
30
+
31
+ const rehydratables = Array . from ( document . querySelectorAll ( '[data-hydrate]' ) ) ;
32
+
33
+ for ( const el of rehydratables ) {
34
+ observer . observe ( el ) ;
35
+ }
36
+ }
Original file line number Diff line number Diff line change @@ -11,6 +11,7 @@ export default async function handler(
11
11
clientsideBundleLocation : string
12
12
) : Promise < void > {
13
13
const ssrOutput = await renderToString ( StaticComponent , {
14
+ args : { foo : { bar : 'bar' } } ,
14
15
rehydrate : true ,
15
16
} ) ;
16
17
@@ -22,7 +23,7 @@ export default async function handler(
22
23
</head>
23
24
<body>
24
25
<div id="app">${ ssrOutput } </div>
25
- <script src="${ clientsideBundleLocation } "></script>
26
+ <script async src="${ clientsideBundleLocation } "></script>
26
27
</body>
27
28
</html>
28
29
` ) ;
Original file line number Diff line number Diff line change
1
+ import Component from '@glimmer/component' ;
2
+ import { tracked } from '@glimmer/tracking' ;
3
+ import { createTemplate , setComponentTemplate } from '@glimmer/core' ;
4
+ import { on , action } from '@glimmer/modifier' ;
5
+ import RehydratableRegion from './RehydratableRegion' ;
6
+
7
+ class RehydratableCounter extends Component {
8
+ @tracked count = 1 ;
9
+
10
+ @action increment ( ) : void {
11
+ this . count ++ ;
12
+ }
13
+ }
14
+
15
+ setComponentTemplate (
16
+ createTemplate (
17
+ { on, RehydratableRegion } ,
18
+ `<RehydratableRegion @name="RehydratableCounter" @data={{this.args}}>
19
+ <h1>{{@message}}</h1>
20
+ <p>{{@foo.bar}}</p>
21
+ <p>You have clicked the button {{this.count}} times.</p>
22
+ <button {{on "click" this.increment}}>Click</button>
23
+ </RehydratableRegion>
24
+ `
25
+ ) ,
26
+ RehydratableCounter
27
+ ) ;
28
+
29
+ export default RehydratableCounter ;
Original file line number Diff line number Diff line change
1
+ import { createTemplate , setComponentTemplate , templateOnlyComponent } from '@glimmer/core' ;
2
+
3
+ function toJSON ( args ) : string {
4
+ return JSON . stringify ( args ) ;
5
+ }
6
+
7
+ export default setComponentTemplate (
8
+ createTemplate (
9
+ { toJSON } ,
10
+ `<div data-hydrate="{{@name}}" ...attributes>
11
+ <script type="application/hydrate">{{toJSON @data}}</script>
12
+ {{yield}}
13
+ </div>
14
+ `
15
+ ) ,
16
+ templateOnlyComponent ( )
17
+ ) ;
Load Diff This file was deleted.
Original file line number Diff line number Diff line change 1
1
import { createTemplate , setComponentTemplate , templateOnlyComponent } from '@glimmer/core' ;
2
- import RehydratingComponent from './RehydratingComponent ' ;
2
+ import RehydratableCounter from './RehydratableCounter ' ;
3
3
4
4
const StaticComponent = setComponentTemplate (
5
5
createTemplate (
6
- { RehydratingComponent } ,
6
+ { RehydratableCounter } ,
7
7
`<div class="static-component">
8
8
<h1>Hello I am a static component. I don't change after page load.</h1>
9
- <RehydratingComponent/>
9
+ <div><RehydratableCounter @message="Hello World" @foo={{@foo}} /></div>
10
+ <div><RehydratableCounter @message="Bye" /></div>
11
+ <div><RehydratableCounter @message="Ciao" /></div>
12
+ <div><RehydratableCounter @message="Adios" /></div>
13
+ <div><RehydratableCounter @message="Hey1" /></div>
14
+ <div><RehydratableCounter @message="Hey2" /></div>
15
+ <div><RehydratableCounter @message="Hey3" /></div>
16
+ <div><RehydratableCounter @message="Hey4" /></div>
17
+ <div><RehydratableCounter @message="Hey5" /></div>
18
+ <div><RehydratableCounter @message="Hey6" /></div>
10
19
</div>
11
20
`
12
21
) ,
You can’t perform that action at this time.
0 commit comments