如何将Svelte Reactivity与DOM getElementById一起使用?

艾哈迈德

我有一个可滚动的div元素

    <script>
        let scrollBoxObj;
        $: scrollBoxObj = document.getElementById("chat-box");
        
        $: if (!(scrollBoxObj === undefined) && scrollBoxObj.scrollTop < scrollBoxObj.scrollHeight) {
            scrollBoxObj.scrollTop = scrollBoxObj.scrollHeight;
        }
    </script>
    <div id="scrollBox" class="h-screen w-auto chat-box border border-orange rounded">
        <div id="chat-box" style="margin: 0" class="chat-box">
            {#each chatBox as { user, content, type}}
                <MessageBox {user} message={content} {type} />
            {/each}
        </div>
    </div>

    <style>
        .chat-box {
            overflow-y: auto;
        }
    </style>

添加新消息时,我试图自动向下滚动。但它不是反应性的。或我不明白反应性如何有效地发挥作用。我也尝试在onMount中分配scrollBoxObj,但是仍然是相同的结果不起作用。

斯蒂芬·范拉斯

在Svelte中,$: x = y当等式(-y部分)左侧发生变化时,反应性就会增强。

在您的代码中

$: scrollBoxObj = document.getElementById("chat-box");

在左侧,我们有一个字符串(“ chat-box”),它是一个常量,将永远不会改变,还有一个文档也将永远不会改变,这意味着反应性将不会如您所愿。

在使用Svelte document.getElementById(或任何其他选择器方法)时,被认为是不好的做法,因为您直接与DOM进行交互,而DOM应该是状态的反映。简而言之:不要这样做。

Svelte提供了一种简单的方法,只需添加以下内容即可将DOM节点(如div绑定到变量bind:this={variable}

在您的情况下,它将变为:

<script>
 let scrollbox
</script>

<div bind:this={scrollbox}>
 ...
</div>

反应的声明(中,如果里面的变化,这是滚动框你的情况块)将执行一旦有事情:

$: if (scrollBoxObj && scrollBoxObj.scrollTop < scrollBoxObj.scrollHeight) {
  scrollBoxObj.scrollTop = scrollBoxObj.scrollHeight;
}

请再次注意,这只会在滚动框更改时触发,绑定滚动框后就不会触发(例如,当用户滚动时,它不会执行任何操作),因为您应该使用on:scroll事件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何与[if]一起使用[getElementById]?

来自分类Dev

我如何将 simple_html_dom 与 phantomjs 一起使用

来自分类Dev

如何将Svelte存储与树状嵌套对象一起使用?

来自分类Dev

将jQuery与Shadow dom一起使用

来自分类Dev

将jQuery与Shadow dom一起使用

来自分类Dev

如何使swipejs与响应DOM一起使用?

来自分类Dev

如何将CURL和PHP简单HTML DOM解析器与对象一起使用

来自分类Dev

如何将CURL和PHP简单HTML DOM解析器与对象一起使用

来自分类Dev

将“ getElementById”分组在一起?

来自分类Dev

将变量与getElementById一起使用。尝试为吉他创建和弦图

来自分类Dev

如何将地图与休眠注释一起使用

来自分类Dev

如何将MySQL REPLACE与变量一起使用?

来自分类Dev

如何将NSOperationQueue与NSURLSession一起使用?

来自分类Dev

如何将Cayley与Postgres后端一起使用?

来自分类Dev

如何将ContextFlyout与ListView一起使用?

来自分类Dev

如何将ActiveModelSerializer与group_by一起使用?

来自分类Dev

如何将requestAnimationFrame与TypeScript对象一起使用?

来自分类Dev

如何将Silex授权与OpenID一起使用?

来自分类Dev

如何将Sinon与Typescript一起使用?

来自分类Dev

如何将Viewholder与ExpandableListView一起使用?

来自分类Dev

如何将IN与块而不是对象一起使用?

来自分类Dev

如何将PostgreSQL与JSONB数据一起使用

来自分类Dev

如何将QVector与多个对象一起使用

来自分类Dev

如何将CSS calc()与继承一起使用?

来自分类Dev

如何将XCTAssertNil与可选结构一起使用?

来自分类Dev

如何将AdControl与多个AdUnitId一起使用?

来自分类Dev

如何将DataContractJsonSerializer与auth令牌一起使用

来自分类Dev

如何将Jest与React Native一起使用

来自分类Dev

如何将componentsSeparatedByString与多个对象一起使用

Related 相关文章

  1. 1

    如何与[if]一起使用[getElementById]?

  2. 2

    我如何将 simple_html_dom 与 phantomjs 一起使用

  3. 3

    如何将Svelte存储与树状嵌套对象一起使用?

  4. 4

    将jQuery与Shadow dom一起使用

  5. 5

    将jQuery与Shadow dom一起使用

  6. 6

    如何使swipejs与响应DOM一起使用?

  7. 7

    如何将CURL和PHP简单HTML DOM解析器与对象一起使用

  8. 8

    如何将CURL和PHP简单HTML DOM解析器与对象一起使用

  9. 9

    将“ getElementById”分组在一起?

  10. 10

    将变量与getElementById一起使用。尝试为吉他创建和弦图

  11. 11

    如何将地图与休眠注释一起使用

  12. 12

    如何将MySQL REPLACE与变量一起使用?

  13. 13

    如何将NSOperationQueue与NSURLSession一起使用?

  14. 14

    如何将Cayley与Postgres后端一起使用?

  15. 15

    如何将ContextFlyout与ListView一起使用?

  16. 16

    如何将ActiveModelSerializer与group_by一起使用?

  17. 17

    如何将requestAnimationFrame与TypeScript对象一起使用?

  18. 18

    如何将Silex授权与OpenID一起使用?

  19. 19

    如何将Sinon与Typescript一起使用?

  20. 20

    如何将Viewholder与ExpandableListView一起使用?

  21. 21

    如何将IN与块而不是对象一起使用?

  22. 22

    如何将PostgreSQL与JSONB数据一起使用

  23. 23

    如何将QVector与多个对象一起使用

  24. 24

    如何将CSS calc()与继承一起使用?

  25. 25

    如何将XCTAssertNil与可选结构一起使用?

  26. 26

    如何将AdControl与多个AdUnitId一起使用?

  27. 27

    如何将DataContractJsonSerializer与auth令牌一起使用

  28. 28

    如何将Jest与React Native一起使用

  29. 29

    如何将componentsSeparatedByString与多个对象一起使用

热门标签

归档