javascript - Svelte on:click 功能更新数据,但不更新 UI
问题描述
我是 Svelte 的新手,所以我怀疑这是一个非常根本的缺乏理解的问题。
有人可以解释为什么 on:click 会更新 UI,但如果我尝试使用 changeJob(items),则 UI 不会更新?console.log 表明数组中的所有作业都已更改,但 UI 并未反映这一点。
<script>
import ListItem from './ListItem.svelte';
let items = [
{ name: 'John', age: 23, job: 'plumber'},
{ name: 'Jane', age: 45, job: 'hair stylist'},
{ name: 'Juan', age: 18, job: 'student'},
];
const changeJob = (arr) => {
console.log(arr[0].job);
arr[0].job = 'clown';
console.log(arr[0].job);
}
</script>
<button on:click={() => items[0].job = 'clown'}>Clownify</button>
<ul>
{#each items as item }
<ListItem {...item}/>
{/each}
</ul>
代码片段:REPL
解决方案
当你有这样的代码时......
items[0].job = 'clown'
...Svelte 明白它需要更新任何依赖于的东西items
,因为赋值是对它识别为内部顶级变量的东西的属性<script>
。
但是当你这样做时...
const changeJob = (arr) => {
arr[0].job = 'clown';
}
...您不是分配给顶级变量的属性,而是分配给arr
函数内部局部变量的属性。它对 Svelte 来说实际上是不透明的。
如果您只是摆脱局部变量,它将起作用,如下所示:
const changeJob = () => {
items[0].job = 'clown';
}
推荐阅读
- python - flask/jinja2-如何引用“src”url_for中的变量
- css - 如何使用 VS Code Regex 搜索类的 CSS 属性
- kubernetes - Grafana 图像渲染服务 - 如何通过身份验证详细信息
- excel - Excel:索引匹配多列
- mongodb - 在 mongodb atlas 中查询以验证集合中是否存在多个特定文档
- python-3.x - 导入模块时出现 NameError
- python-3.x - 不使用 lambda 对元组列表进行排序
- prometheus - 如何将两个除以prometheus查询来计算百分比
- sql - 排序sql查询(非标准)
- python - 检查数据帧值中的条件首次出现