У меня есть сетчатая структура с указателем, исходящим от родителя. Теперь с помощью некоторой операции указатель обновляется, но изменение не отражается в дочернем компоненте, а также не обновляется DOM.
Parent:
<script>
import Boxes from "./Boxes.svelte";
let boxes = [
["", "", "", "", "", "", "", ""],
["", "", "", "", "", "", "", ""],
["", "", "", "", "", "", "", ""],
["", "", "", "", "", "", "", ""],
["", "", "", "", "", "", "", ""],
["", "", "", "", "", "", "", ""],
["", "", "", "", "", "", "", ""],
["", "", "", "", "", "", "", ""]
];
let activeBox = {
x: 0,
y: 0
};
function handleKeydown(keyEvent) {
let i = activeBox.x;
let j = activeBox.y;
const width = boxes[i].length,
height = boxes.length,
left = 37,
up = 38,
right = 39,
down = 40,
tab = 9,
backspace = 8;
// Loop around single row with right and left arrows
if (keyEvent.keyCode == right) {
activeBox.x = activeBox.x + 1;
if(activeBox.x === boxes[i].length) activeBox.x = 0;
return;
}
$: console.log("^^^ activeBox &&", activeBox);
</script>
<style>
main {
display: flex;
align-items: center;
justify-content: center;
}
@media (min-width: 640px) {
main {
max-width: none;
}
}
</style>
<svelte:window on:keydown="{handleKeydown}" />
<main>
<Boxes boxes={boxes} activeBox={activeBox} />
</main>
Дочерний компонент использует переменная activeBox для отображения выбранного блока. Но, похоже, это не сработает, поскольку, хотя первый рендер работает отлично, окно не обновляется вместе с ним.
Child:
<script>
export let boxes;
export let activeBox;
$: console.log("^^^ active Box updated");
function getSelectedClass(i, j) {
if (activeBox.x === j && activeBox.y === i) {
return "selected";
}
return "";
}
</script>
<style>
.grid-container {
display: grid;
grid-template-columns: auto auto auto auto auto auto auto auto;
background-color: #2196f3;
padding: 0px;
}
.grid-item {
background-color: rgba(255, 255, 255, 0.8);
border: 1px solid rgba(0, 0, 0, 0.8);
width: 40px;
height: 40px;
padding: 20px;
font-size: 30px;
text-align: center;
}
.selected {
border: 1px solid red;
}
</style>
<main>
<div class="grid-container">
{#each boxes as row, i}
{#each row as column, j}
<div class=" grid-item {getSelectedClass(i, j)}">{boxes[i][j]}</div>
{/each}
{/each}
</div>
</main>
Я действительно мог бы использовать некоторые идеи как Я до сих пор не понял концепцию Svelte. Любая помощь будет высоко ценится.