Сначала вам нужно понять, что на самом деле делает ваш код, вы слушаете нажатие на tbody, и при нажатии на него вы устанавливаете флаг isClicked как true / false, и все ваши элементы v-if (ed) при одиночном флаге, т.е. isClicked. Таким образом, всякий раз, когда флаг изменяется, каждый v-if также будет реагировать, поэтому показывается каждое описание, которое определенно нежелательно.
Слушать прослушивание tbody неправильно, вы должны слушать нажатие на каждом tr-s, чтобы вы могли фактически знать, на какой tr нажимают. Теперь при щелчке любого tr сохраните идентификатор этого tr и отобразите описание соответствующего элемента.
Что ж, в вашем коде есть небольшая работа, чтобы заставить его работать так, как вы хотели.
Вот модифицированный код.
<tbody v-for="item in items" :key="item.id">
<tr @click="isClicked = item.id">
<td>
{{item.name}}
</td>
<td>
{{item.surname}}
</td>
<td>
{{item.explanation}}
</td>
<td>
<span @click="isDelete(item)">X</span>
</td>
</tr>
<tr v-if="isClicked === item.id">
{{item.desc}}
</tr>
</tbody>
Надеюсь, это поможет.