为什么这个组件不重新渲染

Why is this component not re-rendering

为什么 Step 组件在 props (aStep) 发生变化时不重新渲染?

//Game.svelte
import  Step  from './Step.svelte';

var states = [
    { name: "Red",     next: 1,  buttonText: "Goto2"},
    { name: "Yellow",  next: 2,  buttonText: "Goto3" },
    { name: "Green",   next: 3,  buttonText: "Goto4"},
    { name: "Blue",    next: 0,  buttonText: "Goto1"},
];

  
let curState =  states[0]
var stepNumber = 1;
var theStep = undefined;

function nextStep() {
        makeStep(curState, stepNumber);
        stepNumber++;  
    curState=states[curState.next];

        console.log(theStep)
}

function makeStep(state, stepNumber) {
    theStep = {
        title: "Step:" + stepNumber + " " +state.name,
        buttonText: state.buttonText,
        buttonAction: nextStep
    }
}
</script>

<input id="startBtn" name="Submit" type="submit" value="Start" on:click={nextStep}/>

{#if theStep}
    <Step aStep = {theStep}/>
{/if}

Step 组件:

<script>
    export let aStep;

    let {title, buttonText, buttonAction} = aStep

</script>

<div>
    <p class = "title">{title}</p>
    <div class ="stepBody">
        <button on:click={buttonAction}>{buttonText}</button>
    </div>
</div>

我可以看到 console.log 每次按下按钮时 theStep 都会发生变化,但 Step 组件保持不变。

有一个 Svelte REPL here

要使 Step.svelte 中的解构具有反应性,请将行更改为

 $: ({title, buttonText, buttonAction} = aStep)

或者也许更好读,将道具散布在对象上并直接导出您想要使用的密钥

[App.svelte]

{#if theStep}
    <Step {...theStep}/>
{/if}

[Step.svelte]

<script>
    export let title, buttonText, buttonAction
</script>