Каким образом можно реализовать vk-подобную маршрутизацию?
То есть site.ru/id*** = компонент Profile, site.ru/group*** = компонент Group
new Router({
// ...
routes: [
{
path: '/(id):id',
name: 'Profile',
component: Profile,
},
{
path: '/(group):groupId',
name: 'Group',
component: Group,
},
],
});
а главная страница меняется в зависимости от того, авторизован ли пользователь. То есть, если авторизован, то site.ru = Dashboard, а если нет, то Landing.
// Home.vue
<Dashboard v-if="isAuth" />
<Landing v-else />
В хуке App.vue выглядит не очень уместно, хочется вынести эту логику в другое место.
Почему я не могу блокировать загрузку приложения до выполнения нужного мне действия (запрос на апи, возврат ответа и наполнение стора)?
store.dispatch('получитьДанные').then(() => {
new Vue({
el: '#app',
store,
router,
...
<div v-if="данные в хранилище есть">
основной контент приложения
</div>
<div v-else>
данные загружаются, надо подождать
</div>
SET_USER(state, payload = {}) {
Object.assign(state, payload)
}
props: {
siteWide: {
type: Boolean,
default: false,
}
},
computed: {
siteWidePath() {
return this.siteWide ? ';path=/' : '';
}
}
const api = {
async getData() {
return {name: 'Foo', email: 'foo@bar.com'};
}
}
new Vue({
el:'#app',
template: `<div v-if="current">
<input v-model="current.name" />
<input v-model="current.email" />
<button :disabled="!isChanged">submit</button>
</div>`,
data() {
return {
original: null,
current: null,
}
},
async created() {
const data = await api.getData();
this.original = JSON.stringify(data);
this.current = data;
},
computed: {
isChanged() {
return JSON.stringify(this.current) !== this.original;
}
}
});
<input type="text" v-model="name" @input="name_changed = true">
и будет счастие проблема в том, что видимо когда по первому запросу поле name заполняется, соответственно поле name_changed становится равно true и кнопка сохранения получается изначально доступна
watch:{ name(val, old){ this.name_changed = true; } }
this.$watch('name', () => this.name_changed = true);