Vue.js: 如果语句为真,则设置复选框为选中状态

9
我曾在我的旧handlebar视图中使用以下复选框:
<div class="form-group">
    <input type='checkbox' name='xmlOnline[]' value="stepstone" class='' {{#if (ifIn 'stepstone' job.xmlOnline)}} checked="checked" {{/if}}> Stepstone
    <input type='checkbox' name='xmlOnline[]' value="karriere" class='' {{#if (ifIn 'karriere' job.xmlOnline)}} checked="checked" {{/if}}> Karriere
</div>

如果job.xmlOnline的值为"stepstone",则应将其标记为已选中。 "karriere"也是如此。

现在我正在尝试在Vue.js中为我的POST表单实现相同的功能。对象"job"的外观如下:http://t2w-api.herokuapp.com/jobs/590c20d42b1c4300046bb1b9

因此,它可以包含"karriere"、"stepstone"、两者或"null"。

这是我在组件中目前所拥有的:

<div v-for="(xml, index) in job.xmlOnline">
    <input type="checkbox" :checked="xml == 'stepstone'"> Stepstone {{ index }}
    <input type="checkbox" :checked="xml == 'karriere'"> Karriere {{ index }}
</div>

复选框得到了选中,但我把它们复制了一份。我也不知道如何添加 v-model。

这是我的组件源码。与 "qualifications" / "responsibility" 相似的用法:https://github.com/markusdanek/t2w-vue/blob/mdanek/2-auth-system/src/components/backend/JobEdit.vue

4个回答

15
一个可能的解决方案。
<input type="checkbox" 
       :checked="job.xmlOnline && job.xmlOnline.includes('stepstone')"
       @change="onChange('stepstone', $event)"> Stepstone
<input type="checkbox" 
       :checked="job.xmlOnline && job.xmlOnline.includes('karriere')"
       @change="onChange('karriere', $event)"> Karriere

onChange方法

methods:{
  onChange(value, $event){
    if (!this.job.xmlOnline)
      this.job.xmlOnline = []

    const index = this.job.xmlOnline.findIndex(v => v == value) 
    const checked = $event.target.checked

    if (checked && index < 0)
      this.job.xmlOnline.push(value)
    if (!checked && index >= 0)
      this.job.xmlOnline.splice(index, 1)
  }
}

示例


我还忘了,job.xmlOnline也有可能什么都没有。 :/ - mrks
@mrks 当你说什么都没有时,你是指它是null,还是空数组。如果它是一个空数组,它仍然可以像答案中那样工作。至于如何发布它,这取决于你的服务器端。 - Bert
太棒了!非常感谢!:-) 在发布新的“工作”时,关于我第一条评论(如何使用v-model),还有什么最后的建议吗? - mrks
@mrks问题是你想将它们作为单独的值发布还是作为数组发布?你可以有很多种方法。如果你想要单独的值,你可以从数组中解析出它们,并将它们添加到你正在提交的请求中。如果不知道你想如何提交,这就很难回答了。 - Bert
我想将它们作为xmlOnline数组发布。因此,当两个复选框都未被选中时,job.xmlOnline将为“null”。如果选择了stepstone复选框,则xmlOnline的值将为“stepstone”,karriere的情况相反。@bert-evans - mrks
显示剩余3条评论

3
<input type="checkbox" class="form-check-input" :value="party.status" 
@change="updateStatus"
 :checked="party.status == 1 ? true: false"
 id="status" name="status"/>

在组件方法中
updateStatus(e){
            if(e.target.checked){
                store.commit('updateStatus', 1);
            } else {
                store.commit('updateStatus', 0);
            }
    },

2
你可以将它绑定到文字字面量中,如下所示:
:true-value="1" 

它将按预期工作。


1
<b-form-checkbox class="col-sm-1 small" :value="1" switch v-model="user.nameb" :state="Boolean(user.nameb)" name="checkbox-validation">
    <b-form-invalid-feedback v-show="!Boolean(user.nameb)" :state="Boolean(user.nameb)">Not Verified</b-form-invalid-feedback>
    <b-form-valid-feedback v-show="Boolean(user.nameb)" :state="Boolean(user.nameb)">Verified</b-form-valid-feedback>
</b-form-checkbox>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接