То есть вы просите нас создать для вас копию "Grammarly" примерно за 10 минут?
Хорошо, вызов принят. Я создал рабочий, но грубый пример, чтобы дать вам отправную точку и, возможно, некоторые идеи, как его улучшить. Имейте в виду, что это не лучшее решение, так как я не тратил много времени и не думал об этом:
Кроме того, я бы переместите метод getFormattedData()
на сервер, чтобы вы получали отформатированные данные со свойствами underlined
вместе с val
и corrections
вместо их повторного вычисления на стороне клиента.
<v-menu
v-model="correctionsListIsVisible"
>
<v-list dense>
<v-list-item
v-for="(correction, index) in correctionsListItems"
:key="index"
@click="applyCorrection(correction)"
>
<v-list-item-content>
<v-list-item-title>
{{correction}}
</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-list>
</v-menu>
<div class="flex">
<div v-for="(object, index) in getFormattedData" class="flex">
<div
@click="toggleCorrectionsList(object)"
:class="{'underlined': object.underlined}"
id="word"
>{{ object.word }}
</div>
<div v-if="addSpace(index)"> </div>
</div>
</div>
data () {
return {
correctionsListIsVisible: false,
correctionsListItems: [],
activeObject: {},
objects: [
{
word: "This",
val: 0.1,
corrections: ["that", "Those"]
},
{
word: "kat",
val: 0.9,
corrections: ["cat", "cats", "dogs", "animals"]
},
{
word: "is",
val: 0.1,
corrections: []
},
{
word: "cute",
val: 0.2,
corrections: []
},
]
}
},
computed: {
getFormattedData() {
let result = []
for (const item of this.objects) {
let object = {}
if (item.val < 0.5) {
object.word = item.word
object.underlined = false
object.corrections = []
}
else if (item.val >= 0.5) {
object.word = item.word
object.underlined = true
object.corrections = item.corrections
}
result.push(object)
}
return result
}
},
methods: {
addSpace (index) {
return index !== (this.getFormattedData.length - 1)
},
toggleCorrectionsList (object) {
if (object.underlined) {
this.correctionsListItems = object.corrections
this.activeObject = object
this.correctionsListIsVisible = true
}
else {
this.activeObject = {}
}
},
applyCorrection (correction) {
this.activeObject.word = correction
this.activeObject.underlined = false
}
}