svelte - 如何在使用函数确定状态的变量更改时重新渲染组件?
问题描述
我有一个组件将选择维护为一个数组,还有一个子组件通过查看它是否包含在该数组中来确定其状态。当我更改数组时,子组件不会重新渲染。我该如何解决?
REPL:https ://svelte.dev/repl/f2074ef75dee444faaee005b8b7cf9b9
App.svelte
<script>
import Nested from "./Nested.svelte";
let selection = [];
function isSelected(n) {
return selection.indexOf(n) > -1;
}
function click(e) {
const n = e.detail.number;
if (isSelected(n)) {
selection = selection.filter(x => x != n);
} else {
selection = [...selection, n];
}
console.log("Selection is", selection);
}
</script>
{#each [1, 2, 3] as number}
<Nested
{number}
selected={isSelected(number)}
on:click={click} />
{/each}
嵌套的.svelte
<script>
export let selected, number;
import { createEventDispatcher } from "svelte";
const dispatch = createEventDispatcher();
function click() {
dispatch("click", {
number
});
}
</script>
<style>
.selected {
color: red;
}
</style>
<div class:selected={selected} on:click={click}>
{number}
</div>
解决方案
问题是这个
selected={isSelected(number)}
在这个表达式中:
isSelected(number)
Svelte 将针对表达式中任何变量的每次更改进行更新。即:要么isSelected
或number
。
在您的情况下,您想对 的更改做出反应selection
,因此它不会这样做。
您可以内联条件,以便selection
在表达式中直接提及变量:
selected={selection.indexOf(number) > -1}
或者你可以这样做:
selected={selection, isSelected(number)}
对于值解析为最后一项的表达式,逗号语法x, y
只是有点晦涩的 JS 语法(尝试'a', 'b', 'c'
在控制台中查看我的意思)......但在这种情况下,它允许提示 Svelte 它应该注意selection
变量在这里。
推荐阅读
- c++ - 了解可变参数模板
- javascript - React Typescript地图循环接口错误
- python - 使用来自另一个数据帧的时间索引插入 pandas 帧
- ios - 如何在 Xcode 11 故事板中查看祖先和后代的约束?
- android - 深色主题更改时,Android 10 通知颜色不会更改
- python - 将无穷大代入表达式时,Sympy 返回 NaN 值
- intellij-idea - 保存时执行运行/调试配置
- python-3.x - 弄清楚如何取 N 并让 reshape 自动分配给 np.array(size(N)).reshape(N, N)
- r - 从 tibble 拉取列表以获得整洁的数据
- c++ - 字段变量问题中使用的 C++ 继承和冒号语法