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(){}
})

person wallop    schedule 23.10.2018    source источник


Ответы (1)


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

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

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

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

person Rich Harris    schedule 23.10.2018
comment
Спасибо Рич. Да, я знаю, что это неверно, я просто пытался показать, что я имел в виду. P.S. Если вы [один из] создателей svelte, слава вам. Это удивительная легкая структура - person wallop; 23.10.2018