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/. Но это снова объясняет глубокое наблюдение.
Обновление: PS Я знаю, что {field.values.length} является недействительным javascript, я просто пытаюсь показать, чего я хочу достичь. Значение наблюдения вложенных свойств аналогично тому, как тлеет
fieldLength: Ember.computed('field.values.[]', {
get(){}, set(){}
})
1 ответ
Короткий ответ - нет - в Svelte изменения отслеживаются на верхнем уровне (компонента или хранилища), так как мониторинг вложенных свойств по отдельности потребует гораздо больше кода и внутреннего учета. Так fieldLength
будет пересчитан всякий раз, когда field
изменения (где "изменение" может означать либо новый объект, либо мутацию существующего, если вы не используете неизменяемую опцию). Ничего, что зависит от fieldLength
будет обновлен, если длина не изменилась, однако.
Чем дольше ответ ({field.values.length}) => ...
является недопустимым JavaScript, но есть верный (если на первый взгляд сбивает с толку) способ выразить ту же идею:
fieldLength: ({field:{values:{length}}}) => length
Вполне возможно, что будущие версии Svelte смогут отслеживать вложенные свойства и пересчитывать значения только при их изменении - если это так, он будет выяснять, какие вложенные свойства являются зависимостями, используя этот синтаксис деструктуризации. Но независимо от наших будущих намерений, это подход, который будет работать сегодня, хотя и с излишними перерасчетами.