Svelte:数组突变和重新分配不会触发 #each 块中的重新渲染
Svelte: Array mutation and re-assignment not triggering re-render in #each block
我不知道为什么不更新。我对 Svelte 比较陌生,但我知道使用 thing = thing 方法强制更新对象数组。
不过,我不确定为什么这不会重新呈现?我首先将它作为一个矩阵,我想也许有一些嵌套破坏了它,但现在这实际上只是一个平面数组。它在点击时更新矩阵,但不会触发重新渲染。
<script>
import Nested from './Nested.svelte';
let matrix = new Array(9).fill(null)
let turn = 0
let handleChange = (index) => {
if (matrix[index] != null) return
let newColor = turn % 2 == 0 ? 'red' : 'blue'
matrix[index]= newColor
turn++
matrix = matrix
}
</script>
{#each matrix as team, index}
<Nested team={team} index={index} click={handleChange}/>
{#if (index==2 || index==5)}
<br />
{/if}
{/each}
嵌套组件:
<script>
export let index;
export let click;
export let team;
let color = 'white';
if (team) color = team;
</script>
<style>
div {
width: 100px;
height: 100px;
border: 1px solid black;
display: inline-block;
margin: 0;
}
</style>
<div style="background-color: {color}" on:click={(e)=>click(index)}>
{color}
</div>
使用 Svelte 时,需要牢记的重要一点是 script
块中的代码仅在创建组件时执行。
在您的情况下,这意味着 if (team) color = team;
行仅运行 一次 (在实例化时),之后再也不会运行。
如果你想重新执行某些东西,你必须使用 $:
声明它是响应式的
对你来说会变成
$: if (team) color = team
每当使用的任何变量(团队和颜色)发生变化时,都会重新执行此操作。
请注意,您也可以简单地将变量标记为反应式(Svelte 为您注入 let)
export let index;
export let click;
export let team;
$: color = team ?? 'white'
我不知道为什么不更新。我对 Svelte 比较陌生,但我知道使用 thing = thing 方法强制更新对象数组。
不过,我不确定为什么这不会重新呈现?我首先将它作为一个矩阵,我想也许有一些嵌套破坏了它,但现在这实际上只是一个平面数组。它在点击时更新矩阵,但不会触发重新渲染。
<script>
import Nested from './Nested.svelte';
let matrix = new Array(9).fill(null)
let turn = 0
let handleChange = (index) => {
if (matrix[index] != null) return
let newColor = turn % 2 == 0 ? 'red' : 'blue'
matrix[index]= newColor
turn++
matrix = matrix
}
</script>
{#each matrix as team, index}
<Nested team={team} index={index} click={handleChange}/>
{#if (index==2 || index==5)}
<br />
{/if}
{/each}
嵌套组件:
<script>
export let index;
export let click;
export let team;
let color = 'white';
if (team) color = team;
</script>
<style>
div {
width: 100px;
height: 100px;
border: 1px solid black;
display: inline-block;
margin: 0;
}
</style>
<div style="background-color: {color}" on:click={(e)=>click(index)}>
{color}
</div>
使用 Svelte 时,需要牢记的重要一点是 script
块中的代码仅在创建组件时执行。
在您的情况下,这意味着 if (team) color = team;
行仅运行 一次 (在实例化时),之后再也不会运行。
如果你想重新执行某些东西,你必须使用 $:
对你来说会变成
$: if (team) color = team
每当使用的任何变量(团队和颜色)发生变化时,都会重新执行此操作。
请注意,您也可以简单地将变量标记为反应式(Svelte 为您注入 let)
export let index;
export let click;
export let team;
$: color = team ?? 'white'