Vue.js多选问题

用vue做一个多选的功能,另外用户可以也可以不选,但是至少要选择一个才能提交

.item(v-for="(item,index) in taxData.caijing"
  @click="taxDataForm.push({caijing: 'item'})") {{item}}

点击push进去数组还是报错

图片描述

图片描述

阅读 4k
6 个回答

绑定3个值

{
    a: '',
    b: '',
    c: ''
}

提交的时候判断a,b,c是否至少有一个有值,没有的话就阻止提交

额,这名字取得也挺有意思

computed: {
    disabled () {
        return (!this.a && !this.b && !this.c)
    }
},
methods: {
    handlerA (val) {
        this.a = val
    },
    handlerB (val) {
        this.b = val
    },
    handlerC (val) {
        this.c = val
    }
}

看题主的意思应该底下每个也可以多选,那就三个数组,每次点击的时候都相应的push到数组中,提交之前判断三个数组的长度,任意一个不为0即可.

加上选中或者点击的事件,楼上的说法就行

写了个小demo,具体判断你可以自己参考一下

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <script src="https://cdn.bootcss.com/vue/2.5.13/vue.min.js"></script>
  <style>
        span{display:inline-block; margin-right:10px; border:1px solid #000;}
        span.active{border:1px solid red;}
    </style>
</head>
<body>
<div id="app">
        <div v-for="(item,index) in list">
            {{item.name}}
            <div>
                <span v-for="(itemB,indexB) in item.datas" @click="check(index,indexB)" :class={'active':itemB.isCheck}>{{itemB.name}} {{itemB.isCheck}}</span>
            </div>
        </div>
        <button @click="submit">打印选择结果</button>
    </div>


<script>
    var app = new Vue({
        el:'#app',
        data(){
            return{
                list:[
                {name:'财经新闻',datas:[{name:'股票'},{name:'科技'},{name:'产业'}]},
                {name:'热点聚焦',datas:[{name:'股票'},{name:'科技'},{name:'产业'}]},
                  {name:'行业资讯',datas:[{name:'股票'},{name:'科技'},{name:'产业'}]},
                ],
                results:{}
            }
        },
        mounted(){
            this.list.map((v,i)=>{
                v.datas.map((val,index)=>{
                    this.$set(val,'isCheck',false);
                })
            });
        },
        methods:{
            check(index,indexB){
                let data = !this.list[index].datas[indexB].isCheck
                this.$set(this.list[index].datas[indexB],'isCheck',data);
                if(data){
                    if(typeof(this.results[index]) == 'undefined') this.results[index] = [];
                this.results[index].push(this.list[index].datas[indexB].name);
                }else{
                    let rIndex = this.results[index].indexOf(this.list[index].datas[indexB].name);
                    this.results[index].splice(rIndex,1)
                }
            },
            submit(){
                this.list.map((v,i)=>{
                    if(typeof(this.results[i]) == 'undefined'){
                        this.results[i] = [];
                    }
                })
                console.log(this.results)
            }
        }
    })
</script>

</body>
</html>

这个需求,最合适用 :checked + label 来做,写个简单的代码范例吧:

.item(v-for="(item,index) in taxData.caijing")
  input(type="radio", v-model="caijing", name="caijing", :id="'caijing-' + index")
  label(:for="'caijing-' + index") {{item}}
export default {
  data() {
    return {
      caijing: null,
    };
  },
}

利用 <label> 的特性就可以完成需求,<input> 可以为 radio 也可以为 checkbox

题主有时间的话,推荐看下我的文章:纯CSS实现多选组件,以及讲堂 写 CSS 也要开脑洞:万能的 :checked + label

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题