gpt4 book ai didi

javascript - sveltejs 中的响应式全宽 Canvas

转载 作者:行者123 更新时间:2023-12-05 00:37:27 25 4
gpt4 key购买 nike

我对 svelte 很陌生,我正在尝试使用 svelte 在全屏上渲染 Canvas 。听起来很容易做到,但我无法让它正常工作。我正在绑定(bind) widthheight clientWidth 的变量/clientHeight并使用这些变量来设置 Canvas 的尺寸。现在的问题是当onMount被称为 widthheight变量已设置,但尚未应用于 Canvas 元素。这意味着当 Canvas 第一次渲染时,它仍然具有初始尺寸,而不是父级的尺寸。只有当我第二次渲染它时,它才具有适当的尺寸。如何使 Canvas 在第一次渲染时具有正确的尺寸,或者在 Canvas 具有正确尺寸时再次渲染 Canvas ?
Here你可以找到一个“工作”版本。

<script>
import { onMount } from "svelte";

let canvas;
let ctx;
let width = 1007;
let height = 1140;

const draw = () => {
ctx.clearRect(0, 0, width, height);
ctx.beginPath();
ctx.moveTo(width/2 - 50, height/2);
ctx.arc(width/2, height/2, 50, 0, 2 * Math.PI);
ctx.fill();
}

onMount(() => {
ctx = canvas.getContext("2d");
draw();
setTimeout(draw, 5000);
});
</script>

<style>
.container {
width: 100%;
height: 100%;
}
</style>

<div
class="container"
bind:clientWidth={width}
bind:clientHeight={height}>
<canvas bind:this={canvas} {width} {height} />
</div>

最佳答案

您可以通过等待下一个“滴答”来解决这个问题

import { onMount, tick } from 'svelte';

onMount(async () => {
ctx = canvas.getContext("2d");
canvas.width = width;
canvas.height = height;
await tick()
draw();
});
什么 await tick()做的是有效地暂停执行,直到所有当前的更改都已应用于 dom
tick in the docs

关于javascript - sveltejs 中的响应式全宽 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63192792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com