Реализация функции развернуть / свернуть, чтобы показать больше деталей, является довольно распространенной проблемой. Вот несколько способов сделать это:
- Добавить логическое свойство для каждого объекта в коллекции. Это то, к чему сводятся оба ваших подхода. Я не ожидал бы, что сервер будет вовлечен, это полностью связано с пользовательским интерфейсом.
- Сохраните значения показа / скрытия в отдельном массиве / объекте. Просто большой массив или объект логических значений. Это ужасно, но это избегает искажения исходных данных. В вашем случае исходные данные находятся в объекте, поэтому вы также должны использовать объект для логических значений, ключ которого совпадает с ключами исходного объекта.
- Еще один способ избежать изменения исходных данных - это обернуть каждый из нихобъект. например,
{
Page1: { show: false, page: { FeatureName: ... } }
. Недостатком этой структуры является то, что шаблон должен быть написан для обработки дополнительного вложения. - Создайте компонент для хранения соответствующего состояния для каждого элемента. Обычно это лучшее решение, но проблема в том, что состояние «показать / скрыть» является внутренним для компонента, поэтому изменить его извне нелегко. Это делает реализацию чего-то вроде «Показать все» болью. До тех пор, пока вам не нужен доступ к этому состоянию извне, это изящное решение. Пример в конце.
Все это предполагает, что каждый из блоков расширения должен действовать независимо. Если вы хотите, чтобы они были связаны так, что только один из них может быть открыт одновременно, все становится намного проще, поскольку вы можете просто сохранить идентификатор текущего развернутого элемента как свойство data
.
Теперь, как и было обещаноПример использования компонента для хранения соответствующего состояния для каждого элемента:
const expander = {
props: ['item'],
data () {
return {
expanded: false
}
},
template: `
<div>
<h4>{{ item.title }}</h4>
<button @click="expanded = !expanded">Toggle</button>
<p v-if="expanded">{{ item.description }}</p>
</div>
`
}
new Vue({
el: '#app',
components: {
expander
},
data () {
return {
"Section": {
"Page1": {
"title": "Title 1",
"description": "Blah blah blah blah"
},
"Page2": {
"title": "Title 2",
"description": "More more more more"
}
}
}
}
})
<script src="https://unpkg.com/vue@2.6.10/dist/vue.js"></script>
<div id="app">
<expander
v-for="(item, propertyName) in Section"
:key="propertyName"
:item="item"
></expander>
</div>