Melepasi objek sebagai prop dalam Svelte mengekalkan medan objek dalam HTML daripada berubah?
P粉550823577
P粉550823577 2024-03-27 23:43:30
0
1
350

Saya ada kod Svelte ini:

player.svelte:

<script>
    import PlayerControls from './PlayerControls.svelte';

    let audio;
</script>

<audio src={...} bind:this={audio} />
<PlayerControls {audio} />

PlayerControls.svelte:

<script>
    import PlayIcon from '../icons/PlayIcon.svelte';
    import PauseIcon from '../icons/PauseIcon.svelte';

    export let audio;

    const onClick = () => {
        if (audio?.paused) audio.play();
        else audio.pause();
    };
</script>

{#if audio?.paused}
    <PlayIcon {onClick} />
{:else}
    <PauseIcon {onClick} />
{/if}

Jika saya tekan ikon main, ikon tidak berubah tetapi audio bermula, jika saya klik sekali lagi audio berhenti dan ikon tidak berubah. Nampaknya audio.jeda hanya "perubahan" dalam skrip, bukan dalam html. Apakah masalah di sini, dan apa yang saya tidak faham tentang Svelte?

P粉550823577
P粉550823577

membalas semua(1)
P粉546179835

Penyelesaian paling mantap dalam kes yang anda berikan ialah menggunakan elemen <audio> peristiwa khusus untuk memberi amaran kepada kes untuk menyemak semula status ref. Ini membolehkan svelte menguruskan kitaran hayat pendengar anda, dan juga membenarkan elemen itu sendiri mengendalikan semua kes kelebihan bila/bagaimana keadaan main balik berubah.

sssccc



REPL

Jawapan asal

Pautan dokumentasi dalam ulasan saya merangkumi cara mudah untuk menyelesaikan masalah anda Reaktif/Kemas kini Tatasusunan dan Objek , iaitu hanya menetapkan semula audio 作为 onClick langkah terakhir dalam pengendali.

Perlu diingat bahawa ini tidak akan menjejaki perubahan dalam paused jika audio tamat dengan sendirinya.

const onClick = () => {
    if (audio?.paused) audio.play();
    else audio.pause();
    
    audio = audio;
};

REPL

Sunting

Saya pada mulanya mencadangkan menukar atribut paused terus:

const onClick = () => {
  if (audio?.paused) {
    audio.play();
    audio.paused = false;
  } else {
    audio.pause();
    audio.paused = true;
  }
};

Tetapi mengabaikan fakta bahawa audio ialah ref dan audiorefpaused ialah sifat baca sahaja.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan