更改道具后,如何在Svelte中强制重新渲染?

时间:2019-10-26 03:30:42

标签: javascript svelte

我有一个总计组件,需要总计多维数组中多个数组的相同索引,类似于对电子表格中的各列进行总计。我有一个不同的组件,它使我可以更改数组中的值,也可以总计电子表格中的行。在更改数组后,总计组件重新呈现和/或更新总计列时遇到了麻烦。我以为我可能需要在总计组件中做一个反应式声明,但这似乎不起作用。

这里是REPL.

的链接

这是代码:

 #include<stdio.h>
 #include<string.h>

 int main(){
     int num;
     int state;
     int a,b,data[num];
     char str[];

     printf("Enter amount data: ");
     //cin>>num;
     scanf("%d",num);
     for(a=0;a<num;a++){
         printf("Enter state: ");
         //cin>>state;
         printf("%d",state);

         if(state==3){
             *str[0]="A";
         } else if(state==10){
             *str[1]="B";
         } 
     }
     printf("Elemets are: ");
     for(b=0;b<num;b++){
         puts(*str[b])
     }
}
Totals.svelte

<script>
    export let jobs

      //this creates a new array which is two indexes long for each of the columns
      //then fills each array with the sum of column
      //HOW DO I GET THIS TO UPDATE EACH TIME A JOB HOURS ENTRY IS CHANGED?
    $: totals = new Array(2).fill(null).map((v, i) => {
    let total = 0;
    jobs.jobHours.forEach((v) => {
      total += Number(v[i]);
    });
    return total;
  });

    //this sums the total hours row to give the grand total
    //HOW DO I GET THIS TO UPDATE EACH TIME THE TOTALS VARIABLE IS CHANGED?
  $: grandTotal = totals.reduce((acc, v) => (acc += v));        

</script>

<style>
  container {
    display: grid;
    grid-template-columns: 2fr 1fr 1fr 1fr;        

  }
  div {
    width: 100%;
    height: 100%;    
    width: 150px;
  }
</style>

<container>
  <div>Total Hours</div>
  {#each totals as total}
  <div>
    {total}
  </div>
  {/each}
  <div>{grandTotal}</div>
</container>
App.svelte

<script>
    import JobEntries from './JobEntries.svelte';
    import Totals from './Totals.svelte';

    const jobs = {
        jobNames: ['Job1', 'Job2', 'Job3'], 
        jobHours: Array.from(Array(3), () => Array.from(Array(2), ()=>1))
    };
</script>

<JobEntries {jobs}/>
<Totals {jobs} />

1 个答案:

答案 0 :(得分:1)

将prop绑定到父组件中,允许子组件更改prop。

App.svelte

<script>
    import JobEntries from './JobEntries.svelte';
    import Totals from './Totals.svelte';
    let jobs = {
        jobNames: ['Job1', 'Job2', 'Job3'], 
        jobHours: Array.from(Array(3), () => Array.from(Array(2), ()=>1))
    };
</script>

<JobEntries bind:jobs/>
<Totals {jobs} />

JobEntries.svelte

<script>
    export let jobs 
    let cell = Array.from(Array(3), () => Array.from(Array(3)));

</script>

<style>
  container {
    display: grid;
    grid-template-columns: 2fr 1fr 1fr 1fr;

  }
  input, div {
    width: 100%;
    height: 100%;
    min-width: 150px;
  }
</style>

<container>
    <div>
        Name
    </div>  
    <div>
        Time 1
    </div>
    <div>
        Time 2
    </div>
    <div>
        Total
    </div>
  {#each jobs.jobNames as name, i}
        <input
            type="text"                
            bind:this={cell[i][0]}
            bind:value={name}            />
        {#each jobs.jobHours[i] as hour, j}
            <input
                type="number"                
                bind:this={cell[i][j+1]}
                bind:value={hour}
            />
        {/each}
    <div>
        {jobs.jobHours[i].reduce((acc,v)=>acc+=v)}
    </div>
  {/each}
</container>