Если вы хотите сохранить position: absolute
, вы можете сделать следующее:
Обновите ListPerspective.vue :
<ul class="mx-auto">
<ListPerspectiveItem
v-for="(alert, index) in alerts"
:key="alert.id"
:index="index"
:alert="alert"
:totalElements="alerts.length"
:verticalShift="15"
@close="remove(index)"
/>
<div :style="notificationMsg"><slot></slot></div>
</ul>
Добавляя элемент списка в конце. Также добавьте вычисляемый стиль, то есть:
data() {
return { verticalShift: 15 }
},
computed: {
notificationMsg() {
return `position: absolute; top: ${(this.alerts.length + 1) * this.verticalShift}px; margin-top: 20px;`;
}
}
Вы рассчитываете общее расстояние от вершины компонента, которое необходимо для отображения вашего сообщения под уведомлениями.
К сожалению, для этого требуется, чтобы вы определили verticalShift
в своем родительском (ListPerspective) компоненте и передали его в качестве опоры ListPerspectiveItem . Если бы я был тобой, я бы создал простое хранилище с такими базовыми конфигурациями и вместо жесткого кодирования 15
в качестве значения по умолчанию в вашем ListPerspectiveItem Я бы взял его из хранилища, делать то же самое в ListPerspective компоненте, то есть:
data() {
// generally you should bind store state properties as computed properties,
// but since it's a default, constant variable you shouldn't have to watch for it's changes
return { verticalShift: this.$store.state.defaults.css.verticalShift }
}
verticalShift: {
type: Number, default: this.$store.state.defaults.css.verticalShift
}
Последнее, что осталось сделать, это обновить App.vue , добавив ваше сообщение в слот:
<ListPerspective>
Click the × button to remove a message
</ListPerspective>
* +1032 * Пример * +1034 *