我最近开始研究Svelte,并想创建一个名为SelectorTable的组件,它允许我通过单击表中的行来 Select 它们.选定的行应以不同的 colored颜色 突出显示.

我试着用了class directive年的版本.

<script lang="ts">
    type ObjectKey = keyof any; 
    export let data: any[] = [];
    export let key = 'id' as ObjectKey;
    let selected: Set<ObjectKey> = new Set<ObjectKey>();


    function toggle(id: ObjectKey) {
        if (selected.has(id)) {
            selected.delete(id);
        } else {
            selected.add(id)
        }
        console.log(selected)
        console.log(selected.has(id))
    }
</script>

<table>
    <thead>
        <tr>
            {#each Object.keys(data[0]) as heading}
            <th>{heading}</th>
            {/each}
        </tr>
    </thead>
    <tbody>
        {#each Object.values(data) as row}
            <tr class:tr-selected={selected.has(row[key])} on:click={() => {toggle(row[key])}}>
                {#each Object.values(row) as cell}
                <td>{cell}</td>
                {/each}
            </tr>
        {/each}
    </tbody>
</table>

<style>
    table, th, td {
        border: 1px solid;
        border-collapse: collapse;
        margin-bottom: 10px;
    }
    tr:hover {
        background-color: red;
        cursor: pointer;
    }

    .tr-selected { 
        background-color: greenyellow;
    }
</style>

on:click功能toggle工作并且正确地添加或移除所选键.我遇到的问题是,即使是selected.has(row[key]) == true,所选行的背景 colored颜色 也不会改变.以下是使用键1两次单击行时的控制台输出.

> Set(1) {1} ------- SelectorTable.svelte:14 
> true ------------- SelectorTable.svelte:15
> Set(0) {size: 0} - SelectorTable.svelte:14
> false ------------ SelectorTable.svelte:15

首先将密钥添加到选定的集合中,然后再次将其移除.

那么,如果输出selected.has(row[key])为真,为什么CLASS指令不起作用,行的 colored颜色 不变呢?

推荐答案

react 性是基于赋值的,因此,如果您使用的是通过函数修改的Set之类的值,则只需在更改后添加一个虚拟赋值,即可在使用该集合的任何位置触发更新:

function toggle(id: ObjectKey) {
    if (selected.has(id)) {
        selected.delete(id);
    } else {
        selected.add(id)
    }

    selected = selected; // <--
}

Javascript相关问答推荐

为什么我的第二个OnClick Isloading值在TEK查询Mutations 查询中不起作用?

通过实现regex逻辑自定义数据表搜索

react 路由加载程序行为

窗口.getComputedStyle()在MutationObserver中不起作用

在页面上滚动 timeshift 动垂直滚动条

Exceljs:我们在file.xlsx(...)&#中发现了一个问题'"" 39人;

用JavaScript复制C#CRC 32生成器

Google maps API通过API返回ZERO_RESULTS,以获得方向请求,但适用于Google maps

jQuery s data()[storage object]在vanilla JavaScript中?'

无法从NextJS组件传递函数作为参数'

cypress中e2e测试上的Click()事件在Switch Element Plus组件上使用时不起作用

我正在建立一个基于文本的游戏在react ,我是从JS转换.我怎样才能使变量变呢?

禁用.js文件扩展名并从目录导入隐式根index.js时,找不到NodeJS导入模块

如何在Svelte中从一个codec函数中调用error()?

删除加载页面时不存在的元素(JavaScript)

expo 联系人:如果联系人的状态被拒绝,则请求访问联系人的权限

使用父标签中的Find函数查找元素

无法检索与Puppeteer的蒸汽游戏的Bundle 包价格

按特定顺序将4个数组组合在一起,按ID分组

在对象的嵌套数组中添加两个属性