Skip to content

Commit ce81608

Browse files
committed
feat: add vue-threejs demo & track mountNode resize, etc
1 parent 48b0ee7 commit ce81608

File tree

6 files changed

+85
-4
lines changed

6 files changed

+85
-4
lines changed

public/code/index.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
- hello-world.jsx
2+
- vue-threejs.js
23
- react-at.jsx
34
- vue-at.js
45
- vue-render-h.js

public/code/vue-threejs.js

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// await loadJs('https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js')
2+
await loadJs('https://unpkg.com/[email protected]/dist/vue.min.js')
3+
4+
// await loadJs('https://unpkg.com/[email protected]/build/three.min.js')
5+
await loadJs('https://unpkg.com/[email protected]/build/three.min.js')
6+
7+
// await loadJs('https://unpkg.com/[email protected]/lib/VueThreejs.umd.min.js')
8+
await loadJs('https://unpkg.com/[email protected]/lib/VueThreejs.umd.js')
9+
10+
appendCss(`
11+
#mountNode { overflow:hidden; background-color:black }
12+
`)
13+
14+
Vue.use(VueThreejs)
15+
16+
// Creating a scene - Three.js Documentation
17+
// https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene
18+
let App = {
19+
template: `
20+
<div class="container">
21+
<renderer :size="bg.size">
22+
<scene>
23+
<camera :position="{ z: 5 }"></camera>
24+
<mesh name="Cube" :rotation="ui.rotation">
25+
<geometry type="Box" :args="[1, 1, 1]"></geometry>
26+
<material type="MeshBasic" :color="0x00ff00"></material>
27+
</mesh>
28+
<animation :fn="animate"></animation>
29+
</scene>
30+
</renderer>
31+
</div>
32+
`,
33+
data() {
34+
return {
35+
bg: {
36+
sysKey: 0,
37+
// size: { w: window.innerWidth, h: window.innerHeight },
38+
size: { w: mountNode.clientWidth, h: mountNode.clientHeight },
39+
},
40+
ui: {
41+
rotation: { x: 0, y: 0, z: 0 },
42+
}
43+
}
44+
},
45+
created() {
46+
this.handleResize = _.debounce(this.handleResize, 2000)
47+
},
48+
mounted() {
49+
mountNode.addEventListener('resize', this.handleResize)
50+
},
51+
beforeDestroy() {
52+
mountNode.removeEventListener('resize', this.handleResize)
53+
},
54+
methods: {
55+
animate() {
56+
this.ui.rotation.x += 0.01
57+
this.ui.rotation.y += 0.01
58+
},
59+
handleResize() {
60+
triggerPreview()
61+
}
62+
}
63+
}

public/code/vue-threejs.js.png

10 KB
Loading

public/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
work correctly both with client-side routing and a non-root public URL.
2020
Learn how to configure a non-root public URL by running `npm run build`.
2121
-->
22-
<title>React App</title>
22+
<title>&lrm;</title>
2323
</head>
2424
<body>
2525
<noscript>You need to enable JavaScript to run this app.</noscript>

src/playground/Playground.tsx

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,8 @@ export let Playground: React.FC = () => {
131131
setCompiling(true);
132132
try {
133133
let res = wrapCode(code);
134-
if (file && file.endsWith('.jsx')) {
135-
res = await babelTransform(res);
136-
}
134+
let hasJsx = file && ['.jsx', '.tsx'].some(ext => file.endsWith(ext));
135+
if (hasJsx) res = await babelTransform(res);
137136
setPreview(res);
138137
} catch (err) {
139138
displayError(err);
@@ -158,6 +157,10 @@ export let Playground: React.FC = () => {
158157
doPreview,
159158
[codeBinding.value]
160159
);
160+
window.triggerPreview = () => {
161+
// doPreview(codeBinding.value);
162+
doPreview(codeBinding.value + `\n\n/* ${new Date()} */`);
163+
};
161164

162165
// useTrigger(
163166
// {
@@ -170,6 +173,18 @@ export let Playground: React.FC = () => {
170173
// keeping sync'd with styled.ts (medium=768px)
171174
let isGreaterThanMedium = useMedia({ minWidth: '768px' });
172175

176+
let handleSizingUpdate = useCallback(() => {
177+
let event = new Event('resize');
178+
window.mountNode.dispatchEvent(event);
179+
}, []);
180+
181+
useEffect(() => {
182+
window.addEventListener('resize', handleSizingUpdate);
183+
return () => {
184+
window.removeEventListener('resize', handleSizingUpdate);
185+
};
186+
}, [handleSizingUpdate]);
187+
173188
return (
174189
<div className="page-playground">
175190
<Helmet>
@@ -185,6 +200,7 @@ export let Playground: React.FC = () => {
185200
</GentleSpin>
186201
</MainCol>
187202
<DragSizing
203+
onUpdate={handleSizingUpdate}
188204
{...(isGreaterThanMedium
189205
? {
190206
border: 'left',

src/playground/types.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
interface Window {
22
assetsNode: HTMLDivElement;
33
mountNode: HTMLDivElement;
4+
triggerPreview: (code: string) => void;
45
}

0 commit comments

Comments
 (0)