0

我正在 Svelte 中开发一个用于学习目的的小型 ToDo 应用程序(我是 Svelte 的新手)。

在我看来:

<div class="input-group p-2" id="editForm">
  <input type="text" class="form-control" id="old_todo" value={currentToDo.title} placeholder="Edit Todo">
  <div class="input-group-append">
    <button on:click="{addTodo}" class="btn btn-sm btn-success">Save</button>
  </div>
</div>

//More code

{#each todos as t, index}   
<tr>
  <td>{index + 1}</td>
  <td class="{t.completed == true ? 'completed' : ''}">{t.title}</td>
  <td class="text-center"><input type="checkbox" on:change={completeTodo(t.id)}></td>
  <td class="text-right">
    <div class="btn-group">
      <button on:click="{editTodo(t.id)}" class="btn btn-sm btn-primary">Edit</button>
      <button on:click="{deleteTodo(t.id)}" class="btn btn-sm btn-danger">Delete</button>
    </div>
  </td>
</tr>
{/each}

我认为与此处相关的脚本部分:

<script>
    import {onMount} from "svelte";

    const apiURL = "https://jsonplaceholder.typicode.com/todos?_start=1&_limit=20";

    let todos = [];

    onMount(async function() {
        const response = await fetch(apiURL);
        todos = await response.json();
        todos.reverse();
    });

    var currentToDo = {};

    function editTodo(tid) {
        let itemIdx = todos.findIndex(x => x.id == tid);
        let currentToDo = todos[itemIdx];
    }

<script>

请参阅此处的 REPL 。

问题是文本字段<input type="text" class="form-control" id="old_todo" value={currentToDo.title} placeholder="Edit Todo">显示undefined而不是当前(需要编辑)待办事项标题。

我的错误在哪里?

4

1 回答 1

1

嗯,currentToDo.title真的是undefined……

currentToDo.title || ''如果要避免此显示,您可以更改为:

<input type="text" class="form-control" id="old_todo" value={currentToDo.title || ''} placeholder="Edit Todo">

另外,为了让你编辑按钮工作......

改变这个:

<button on:click="{editTodo(t.id)}" class="btn btn-sm btn-primary">Edit</button>

对此:

<button on:click="{() => editTodo(t.id)}" class="btn btn-sm btn-primary">Edit</button>

on:click="{editTodo(t.id)}变为on:click="{() => editTodo(t.id)},否则editTodo每次渲染都会调用一次函数,但不会在实际单击按钮时调用(在 Svelte 中,您传递函数引用,而不是像普通 HTML 那样的函数onclick)。

此外,在您的editTodo功能中:

    function editTodo(tid){
        let itemIdx = todos.findIndex(x => x.id == tid);
        let currentToDo = todos[itemIdx];
    } 

您需要删除它let才能使用根范围currentToDo,而不是本地范围的变量:

    function editTodo(tid){
        let itemIdx = todos.findIndex(x => x.id == tid);
        currentToDo = todos[itemIdx];
    } 

然后您可以单击编辑按钮,标题将按预期显示在输入字段中!

于 2020-06-30T17:02:38.710 回答