Svelte выполняет функцию при изменении любой группы переменных
В приложении Svelte RealWord есть что-то вроде этого:
https://github.com/sveltejs/realworld/blob/master/src/routes/_components/ArticleList/index.svelte
let query;
let articles;
let articlesCount;
$: {
const endpoint = tab === 'feed' ? 'articles/feed' : 'articles';
const page_size = tab === 'feed' ? 5 : 10;
...
query = `${endpoint}?${params}`;
}
$: query && getData();
async function getData() {
({ articles, articlesCount } = await api.get(query...));
}
Это вызывает REST API при изменении размера страницы, конечной точки или других параметров запроса.
У меня похожая ситуация для листинга сущностей и делаю:
$: activePage && sort && pageSize && getData();
Это все работает очень хорошо (хотя && - странная конструкция, чтобы сказать, что я хочу выполнить getData()
когда activePage
, sort
или же pageSize
изменения.
При таком подходе проблема возникает, когда вы хотите также включить переменную, которая оценивается как ложь.
Пример, добавить searchQuery
текст:
let searchQuery = "";
$: searchQuery && activePage && sort && pageSize && getData();
Теперь реактивность не работает, так как searchQuery
оценивает false
,
Мы можем это сделать:
$: activePage && sort && pageSize && getData();
$: searchQuery, getData();
Для просмотра отдельных групп, но с этим getData() вызывается 2 раза.
Кто-нибудь знает лучший подход к этому?
2 ответа
Вы можете использовать ,
а также &&
синтаксис с любым количеством переменных и условий
$: searchQuery, activePage && sort && pageSize && getData();
$: searchQuery, activePage, sort, pageSize, getData();
оба являются допустимыми, и со вторым у вас не будет проблем, если одна из переменных будет ложной, а первая позволит вам убедиться, что некоторые переменные не ложные.
Чтобы прояснить ситуацию, вы можете передать наблюдаемые переменные функции в качестве аргументов:
$: onChange(searchQuery, activePage, sort, pageSize);
function onChange(...args) {
getData();
}
Таким образом, вам не нужно беспокоиться, если какая-то переменная ложна.