如何关注Svelte中新增的输入?

Ant*_*tov 4 javascript svelte

我使用#each为tasks数组的每个成员显示输入。当我单击“添加任务”按钮时,新元素将插入到数组中,因此新的输入将出现在#each循环中。

单击“添加任务”按钮后,如何聚焦已添加的输入?

<script>
  let tasks = [];

  function addTask() {
    tasks = [...tasks, { title: "" }];
  }
</script>

{#each tasks as task}
  <input type="text" bind:value={task.title} />
{/each}

<button on:click={addTask}>Add task</button>
Run Code Online (Sandbox Code Playgroud)

CD.*_*D.. 7

Rich Harris有更好的解决方案


您可以使用use:action

动作是在创建元素时调用的函数。

例如:

<script>
  let tasks = [];

  function addTask() {
    tasks = [...tasks, { title: "" }];
  }

  function init(el){
    el.focus()
  }
</script>

{#each tasks as task}
  <input type="text" bind:value={task.title} use:init />
{/each}

<button on:click={addTask}>Add task</button>
Run Code Online (Sandbox Code Playgroud)

  • @AntonZotov 毫不奇怪,里奇·哈里斯有一个更好的解决方案 (2认同)
  • 你的也不错。我使用它是因为我在使用自动对焦时遇到了一些问题。我没有调查它,但它可能与此 chrome bug 有关:当 URL 包含 Chrome 79 中的片段时,自动对焦不起作用:https://bugs.chromium.org/p/chromium/issues/detail?id=1046357 (2认同)
  • 据我所知,对于 a11y 来说,这个解决方案并不比 Rich Harris 解决方案更好。它只是绕过了 Svelte 警告。这是在愚弄 Svelte;但这不应该欺骗我们! (2认同)

Ric*_*ris 6

您可以使用以下autofocus属性:

<script>
  let tasks = [];

  function addTask() {
    tasks = [...tasks, { title: "" }];
  }
</script>

{#each tasks as task}
  <input type="text" bind:value={task.title} autofocus />
{/each}

<button on:click={addTask}>Add task</button>
Run Code Online (Sandbox Code Playgroud)

请注意,您将收到一个可访问性警告。这是因为可访问性指南实际上建议您不要这样做:

盲人或视力低下的人在未经允许的情况下移动焦点可能会迷失方向。此外,自动对焦对运动控制障碍的人可能会造成问题,因为它可能会给他们带来额外的工作,使他们无法从自动对焦区域中导航到页面/视图上的其他位置。

由您确定此建议是否与您的情况相关!

  • 使用“&lt;input bind:this={myInput}&gt;”获取对要聚焦的输入的引用,然后在提交表单后调用“myInput.focus()” (2认同)

Ale*_*hev 6

您可以使用bind:thistick

例如:

<script>
  import { tick } from 'svelte';

  let tasks = [];

  async function addTask() {
    let newTask = { title: "" };
    tasks = [...tasks, newTask];

    await tick();
    newTask.input.focus();
  }
</script>

{#each tasks as task}
  <input type="text" bind:value={task.title} bind:this={task.input} />
{/each}

<button on:click={addTask}>Add task</button>
Run Code Online (Sandbox Code Playgroud)

解释我的方法的优点

tasks如果数组最初不为空会发生什么?then 方法autofocus和方法use:action的缺点是,当列表最初显示时,焦点位于最后一个字段。这可能并不理想。

我的方法仅在单击“添加”按钮时控制焦点。

  • Tick 是我的应用程序所需的,因为该元素之前隐藏在“{#if}”后面,所以它还不存在。 (4认同)