vue.js - 防止 Vuetify 复选框检查自身?
问题描述
我希望在文本字段中写入后 v-checkbox 保持不变。
怎么了:
每当我在框外单击或在下面的文本字段中键入时,复选框都会自行检查。
预期:
该复选框保持未选中状态,直到用户选中它。
代码:
export default {
props: ['answer'],
data() {
return {
newAnswer: 'Your answer here...',
multiChoiceAnswers: {
answers: ['test1', 'test2'],
selected: [],
}
}
},
created() {
if (this.answer.answers.length > 1) {
this.multiChoiceAnswers.answers = this.answer.answers
this.multiChoiceAnswers.selected = this.answer.selected
} else {
console.log('Answer Template Generated')
}
},
methods: {
selectedAnswer(clickEvent, index) {
console.log(clickEvent, index)
//Checking wether or not the answer is a value or null
//in order to push or remove it from the selected answers
if (clickEvent === this.multiChoiceAnswers.answers[index]) {
this.multiChoiceAnswers.selected.push(clickEvent)
} else {
const selectedPosition = this.multiChoiceAnswers.selected.indexOf(this.multiChoiceAnswers.answers[index])
this.multiChoiceAnswers.selected.splice(selectedPosition, selectedPosition + 1)
}
this.$emit('newAnswer', this.multiChoiceAnswers)
},
changedAnswer(changedAnswer, index) {
console.log(changedAnswer)
//Getting previous selected answer position to replace later
const selectedPosition = this.multiChoiceAnswers.selected.indexOf(this.multiChoiceAnswers.answers[index])
//Changing the current value of answer[index] to input value in answers
this.multiChoiceAnswers.answers.splice(index, index + 1, changedAnswer)
//Changing the current value of answer[index] to input value in selected
this.multiChoiceAnswers.selected.splice(selectedPosition, selectedPosition + 1, changedAnswer)
this.$emit('newAnswer', this.multiChoiceAnswers)
},
这是模板代码:
<v-container>
<div :key="(answer, index)" v-for="(answer, index) in multiChoiceAnswers.answers">
<v-layout align-center>
<v-checkbox hide-details class="shrink mr-2" @click.prevent @change="selectedAnswer($event, index)" :value="answer"></v-checkbox>
<v-text-field class="checkbox-input" @input="changedAnswer($event, index)" :placeholder="answer"></v-text-field>
<v-btn @click="removeAnswer(index)">Remove</v-btn>
</v-layout>
</div>
</v-container>
解决方案
好像我发这篇文章时一定是累了或喝醉了;)
这是我为修复此解决方案所做的全新修订代码:
<template>
<div>
<v-container>
<div :key="(answer, index)" v-for="(answer, index) in multiChoiceAnswers.answers">
<v-layout align-center>
<v-checkbox hide-details class="shrink mr-2" v-model="answer.selected"></v-checkbox>
<v-text-field class="checkbox-input" v-model="answer.answerText" :placeholder="answer.answerText"></v-text-field>
<v-btn @click="removeAnswer(index)">Remove</v-btn>
</v-layout>
</div>
</v-container>
<v-btn @click="newAnswerOption">Add Answer</v-btn>
</div>
<script>
export default {
props: ['answer'],
data() {
return {
newAnswer: { answerText: 'Your answer here...', selected: false },
multiChoiceAnswers: {
answers: [
{ answerText: 'test1', selected: false },
{ answerText: 'test2', selected: false }
],
},
}
},
created() {
if (this.answer.answers.length > 1) {
this.multiChoiceAnswers.answers = this.answer.answers
} else {
console.log('Answer Template Generated')
}
},
methods: {
newAnswerOption() {
this.multiChoiceAnswers.answers.push(this.newAnswer)
this.$emit('newAnswer', this.multiChoiceAnswers)
},
removeAnswer(index) {
//Removing the answer
this.multiChoiceAnswers.answers.splice(index, 1)
this.$emit('newAnswer', this.multiChoiceAnswers)
}
}
}
</script>
发生了什么变化?
我删除了之前所有损坏且必然复杂的代码。
我用对象的答案创建了一个新的数据数组。现在每个对象都有 answerText(字符串)和 selected(布尔值)。
该复选框现在已连接以更改 answers.selected 与 v-model
输入现在已连接以使用 v-model 更改 answers.answerText
推荐阅读
- google-cloud-platform - 谷歌云问题中的 API 语音到文本凭据
- dotnetnuke - DNN 6 升级网络路径有问题
- reactjs - 不在导航器中的联系人 (Google Chrome 80)
- firebase - await 不适用于 firebase querySnapshot,下一行已执行
- mysql - MySQL 根据 2 个表的结果查找和更新
- git - 为什么我的远程主分支中的更改没有被拉入我的本地主分支?
- c# - 如何在实现DI的地方调用另一个项目的方法
- user-interface - 如何在颤动中制作类别和子类别按钮
- c# - 如何在 C# 中为棋盘游戏制作撤消功能?
- java - Android Studio:在 X 行中找不到可执行代码