Складываете данные блоков в массив, каждому элементу массива добавляете свойство, которое будет отвечать за показ контента:
data: () => ({
items: [
{ show: true, ... },
{ show: true, ... },
...
],
}),
<template v-for="(n, i) in items">
<button @click="n.show = !n.show">{{ n.show ? 'hide' : 'open' }}</button>
<div class="list" v-show="n.show">
...
</div>
<hr v-if="i !== items.length - 1">
</template>
https://jsfiddle.net/ra5byco9/
UPD. Вынесено из комментариев:
С v-for я знаю как, а без него никак?
Дело не в v-for, а в том, что состояние каждого скрываемого-показываемого элемента должно управляться отдельным свойством. Можно его, свойство, сделать частью компонента, отвечающего за демонстрацию пары кнопка-контент. Дальше можете
создавать столько экземпляров, сколько потребуется.