Svelte, только перерисовать элемент в списке, а не весь список - PullRequest
0 голосов
/ 16 апреля 2020

Оба с svelte-apollo (https://github.com/timhall/svelte-apollo/issues/19) и @urql-svelte (https://github.com/FormidableLabs/urql/issues/704) У меня весь список перерисовывается вместо одного элемента -рендеринг.

Этапы воспроизведения:

  • go для REPL: https://codesandbox.io/s/urql-svelte-list-rerendering-uwsvn

  • нажмите кнопку

  • каждую кнопку повторно отрендерить; поэтому весь список перерисовывается сам

  • Я ожидаю, что он перерисовывает только ту кнопку, на которую нажал

Если я прочел здесь: https://svelte.dev/tutorial/svelte-options, я понимаю, что используя:

immutable = {true} - вы никогда не используете изменяемые данные, поэтому компилятор может выполнять простые проверки ссылочного равенства, чтобы определить, изменились ли значения

immutable = {false} - по умолчанию. Svelte будет более консервативен в отношении того, изменились ли изменяемые объекты

Если вы видите пример, они изменяют массив todos, как мы делаем с urql:

let todos = [
  { id: 1, done: true, text: 'wash the car' },
  { id: 2, done: false, text: 'take the dog for a walk' },
  { id: 3, done: false, text: 'mow the lawn' }
];

function toggle(toggled) {
  todos = todos.map(todo => {
    if (todo === toggled) {
      // return a new object
      return {
        id: todo.id,
        text: todo.text,
        done: !todo.done
      };
    }

    // return the same object
    return todo;
  });
}

Почему это не работает с моим примером REPL todos?

Является ли todos новым массивом в конце?

...