Насколько хороши варианты:
1. интервалом синхронить стейт корзины.
2. Синхронить стейт при событии onunload
3. Писать обработчик кликов, который будет регулировать частоту запросов (очень не хочется)
У всех этих вариантов есть общий недостаток. Предположим, кот пользователя внезапно решил поиграть с кабелем питания компьютера и выдернул его. Ну, как-то так получилось. Или пользователь телефон выронил, при падении слетела крышка, аккумулятор вывалился. Или ещё что-то в том же духе. Короче, отрубилось всё. А перед этим пользователь как раз добавил товар в корзину / изменил количество / удалил товар из корзины. И никакой синхронизации.
Надо как-то сразу сохранять состояние корзины, после любого действия пользователя, немедленно. Пишите его в localstorage. Под это дело есть плагины для vuex -
например. При загрузке приложения синхронизируйте.
Как синхронизировать в процессе работы - я бы предпочёл третий вариант. Только конечно не клики надо обрабатывать, а состояние корзины в хранилище. Делаете watch, в обработчике - запрос на синхронизацию с сервером, обёрнутый в debounce (лень писать - можете легко нагуглить готовый вариант).
Т.е., будет что-то вроде
methods: {
syncCart: debounce(function() {
...
}),
},
watch: {
'$store.state.cart': {
immediate: true,
deep: true,
handler: 'syncCart',
},
},