Skip to main content
Svelte基础
介绍
响应
属性Props
逻辑表达式
事件
绑定
Classes和样式
动作Actions
转场
Svelte高阶
响应式进阶
内容复用
动画
高级绑定
高级转场
上下文API
特殊元素
脚本模块
接下来
SvelteKit基础
介绍
路由
加载数据
Headers和cookies
Shared modules
Forms
API routes
$app/state
Errors and redirects
Advanced SvelteKit
Hooks
Page options
Link options
Advanced routing
Advanced loading
Environment variables
Conclusion

小主还可以使用特殊的 bind:this 指令来获取组件中元素的只读绑定。 本练习中的 $effect 尝试创建一个画布上下文,但 canvasundefined。首先在组件的顶层声明它:

You can use the special bind:this directive to get a readonly binding to an element in your component. The $effect in this exercise attempts to create a canvas context, but canvas is undefined. Begin by declaring it at the top level of the component...

App
<script>
	import { paint } from './gradient.js';

	let canvas;

	$effect(() => {
		// ...
	});
</script>
<script lang="ts">
	import { paint } from './gradient.js';

	let canvas;

	$effect(() => {
		// ...
	});
</script>

然后将bind:this添加到 元素:

...then add the directive to the <canvas> element:

App
<canvas bind:this={canvas} width={32} height={32}></canvas>

偷偷告诉你canvas的值在组件挂载之前都是undefined —— 也就是您无法在$effect运行之前访问它

Note that the value of canvas will remain undefined until the component has mounted — in other words you can’t access it until the $effect runs.

Edit this page on GitHub

previous next
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<script>
	import { paint } from './gradient.js';
 
	$effect(() => {
		const context = canvas.getContext('2d');
 
		let frame = requestAnimationFrame(function loop(t) {
			frame = requestAnimationFrame(loop);
			paint(context, t);
		});
 
		return () => {
			cancelAnimationFrame(frame);
		};
	});
</script>
 
<canvas width={32} height={32}></canvas>
 
<style>
	canvas {
		position: fixed;
		left: 0;
		top: 0;
		width: 100%;
		height: 100%;
		background-color: #666;
		mask: url(./svelte-logo-mask.svg) 50% 50% no-repeat;
		mask-size: 60vmin;
		-webkit-mask: url(./svelte-logo-mask.svg) 50% 50% no-repeat;
		-webkit-mask-size: 60vmin;
	}
</style>