router-view
. Где он? Должен быть. Надо добавить..header
?) должна быть доступна везде - её можно вынести в компонент App (в котором следует разместить router-view
).router-link
вы в качестве id используете индекс? Вместо<router-link :to="{ name: 'detail', params: {id: index} }">
<router-link :to="{ name: 'detail', params: { id: post.id } }">
$route.params.id
, в котором выполнять запрос на получение данных поста. Выглядеть это может как-то так:data: () => ({
post: null,
}),
watch: {
'$route.params.id': {
immediate: true,
handler(id) {
axios.get(`https://jsonplaceholder.typicode.com/posts/${id}`).then(r => this.post = r.data);
},
},
},
@scroll="onScroll"
methods: {
onScroll(e) {
if (e.target.offsetHeight + e.target.scrollTop >= e.target.scrollHeight) {
// ...
}
},
e.target.scrollHeight - расстояниеДоНижнейГраницы
).this.map.closePopup()
.А если открыты несколько попапов разных маркеров? <...> как можно открыть необходимый попап маркера (без нажатия на сам маркер конечно)
<button @click="onClick(product)">click me</button>
methods: {
onClick(item) {
console.log(item.title);
},
},
this.message = this.rules.map(n => n(this.input)).find(n => n !== true);
zoom(change) {
this.map.setZoom(this.map.getZoom() + change);
},
<div @click="zoom(+1)">zoom in</div>
<div @click="zoom(-1)">zoom out</div>
@click="$emit('remove')"
.@remove="removeFromBasket(item)"
. computed: {
declarantKind() {
return this.dsec.reduce((acc, n) => (
acc[n.dsec_nnn] = n.dsec_declarant_kind,
acc
), {});
},
},
watch: {
declarantKind(newVal, oldVal) {
const [ key ] = Object
.entries(newVal)
.find(([ k, v ]) => oldVal.hasOwnProperty(k) && oldVal[k] !== v) || [];
if (key) {
const item = this.dsec.find(n => n.dsec_nnn === key);
console.log('объект:', item);
console.log(`было: ${oldVal[key]}`);
console.log(`стало: ${newVal[key]}`);
}
},
},
data: () => ({
selected: null,
items: [
{ title: 'hello, world!!', value: '' },
{ title: 'fuck the world', value: '' },
{ title: 'fuck everything', value: '' },
],
}),
<div v-for="n in items">
<label>
<input type="radio" :value="n.title" v-model="selected">
{{ n.title }}
</label>
<input type="text" v-model="n.value" :disabled="selected !== n.title">
</div>
.fade-leave-active {
transition: opacity 1s;
}
.fade-leave-to {
opacity: 0;
}
mounted() {
this.show = false;
},
this.articles
- это не массив, у массивов метод push есть. Изначально да - массив, но когда вы в created
вызываете getArticles
, производится перезапись свойства. Неплохо было бы разобраться, что на самом деле возвращает запрос на получение статей - уж не объект ли?Да, не массив, а объект. Я просто и так и так пробовал. Смог добавить таким способом.
this.articles = Object.assign(this.articles, response.data.payload);
Но значение добавилось не так как нужно.
Object.assign
модифицирует первый аргумент, а не создаёт новый объект.v-for
(как и методы - forEach
, map
, ...) не будет его обрабатывать. Доставайте из объекта массив значений и уже его элементы добавляйте в articles
:this.articles.push(...Object.values(response.data.payload));
getArticles
можно просто заменить один массив другим:this.articles = Object.values(response.data.payload);
articles
на пустой объект, а в getArticles
по получении данных просто выполняйте присваивание: this.articles = response.data.payload
. А там, где пытаетесь concat
выполнить, создавайте новый объект, в который будут копироваться свойства существующего и результат запроса:this.articles = { ...this.articles, ...response.data.payload };
// или
this.articles = Object.assign({}, this.articles, response.data.payload);
marker.on('popupopen', function(e) {
new Vue({ el: e.popup._contentNode });
});
this.timeout = setTimeout(...
beforeRouteLeave(to, from, next) {
clearTimeout(this.timeout);
next();
},
Документация прочитана, наверно не настолько внимательно, чтобы понять
check-in-changed
и check-out-changed
.