SvelteJs: глубокое наблюдение за вычисляемыми свойствами

На данный момент мы можем сделать следующее, используя вычисленные свойства.

isTypeRange: ({ field }) => {
        return field && field.type === "Range";
      }

Можем ли мы сделать что-нибудь подобное?

fieldLength: ({field.values.length}) => {
  return field.values.length;
}

Переход по этой ссылке https://github.com/sveltejs/svelte/issues/11 в конечном итоге привел меня к https://github.com/sveltejs/svelte-extras/. Но это снова объясняет глубокое наблюдение.

Обновлять: P.S. Я знаю, что {field.values.length} недействителен javascript, я просто пытаюсь показать, чего я хочу достичь. Это означает наблюдение за вложенными свойствами, аналогичными тому, как это делает Ember.

fieldLength: Ember.computed('field.values.[]', {
get(){}, set(){}
})

2
824
1

Ответ:

Короткий ответ - нет - в Svelte изменения отслеживаются на верхнем уровне (компонента или хранить), поскольку отдельный мониторинг вложенных свойств потребует гораздо большего количества кода и внутренней бухгалтерии. Таким образом, fieldLength будет пересчитываться при каждом изменении field (где «изменение» может означать либо новый объект, либо мутацию существующего, если вы не используете параметр неизменный). Однако ничего, что зависит от на fieldLength не будет обновляться, если только длина не изменилась.

Более длинный ответ заключается в том, что ({field.values.length}) => ... - это недопустимый JavaScript, но есть действительный (хотя и выглядит сбивающим с толку) способ выразить ту же идею:

fieldLength: ({field:{values:{length}}}) => length

Это возможный, чтобы будущие версии Svelte могли отслеживать вложенные свойства и пересчитывать значения только при их изменении - в таком случае он мог бы выяснить, какие вложенные свойства были зависимостями, используя этот синтаксис деструктуризации. Но независимо от наших будущих намерений, этот подход будет работать сегодня, хотя и с периодическим ненужным пересчетом.