【问题标题】:Select Cells On A Table By Dragging with svelte通过使用 svelte 拖动选择表格上的单元格
【发布时间】:2022-01-12 03:38:08
【问题描述】:

我已经尝试了 2 天来将表格集成到苗条中,我可以通过 mouseDown 和拖动进行选择。
我是 js 和苗条的新手,并做了一些课程。 但目前我不可能让这个工作。

这就是我尝试在 svelte 中构建的内容: TableSelect

希望任何人都可以帮助我。
非常感谢,克里斯

【问题讨论】:

  • 我认为这只是监听表格单元格上的mousedown 事件并适当地打开或关闭单元格状态的问题。在 Svelte 中,您可以使用 on:mousedownclass: 属性相当容易地做到这一点。到目前为止你有什么?

标签: javascript select svelte tablecell


【解决方案1】:

结果比我的评论中建议的要复杂一些。

这个想法是在整个窗口(通过<svelte:window>)上监听mousedownmouseup 事件以打开/关闭isDrag 状态,监听表格单元格上的mouseenter 事件,然后切换仅当 isDrag 开启时,单元格才会开启/关闭。

此外,您还必须在单元格上监听 mousedown 事件,以防在单元格内开始拖动。

可以通过class:selected 属性直观地显示单个单元格的开/关状态。

<script>
    let columns = new Array(5)         // number of columns
    let rows = new Array(3)            // number of rows
    let state = new Array(rows.length*columns.length).fill(false)
    let isDrag = false
    
    const beginDrag = () => {
        isDrag = true
    }
    
    const endDrag = () => {
        isDrag = false
    }
    
    const toggle = (r, c) => {
        state[r*columns.length+c] = !state[r*columns.length+c]
    }
    
    const mouseHandler = (r, c) => (e) => {
        if (isDrag || e.type === 'mousedown') {
            toggle(r, c)
        }
    }
</script>

<style>
    td {
        width: 80px;
        height: 80px;
        background-color: pink;
    }
    .selected {
        background-color: blue;
    }
</style>

<svelte:window on:mousedown={beginDrag} on:mouseup={endDrag} />
<table>
    {#each rows as _row, r}
        <tr>
            {#each columns as _column, c}
                <td on:mousedown={mouseHandler(r, c)} on:mouseenter={mouseHandler(r, c)} class:selected="{state[r*columns.length+c]}"></td>
            {/each}
        </tr>
    {/each}
</table>

Demo REPL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2018-09-30
    • 2013-07-17
    • 2018-07-05
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多