vue入门第4天:vue实现全选反选

父组件给5个子组件传值,同时子组件和父组件的相关值对应改变。参考checkbox单选和全选。
知识点:
1、子组件给父组件回传id
2、子组件监听父组件值的改变
3、父组件尽量不要给子组件传递对象和数组
代码如下, 父组件:app.vue
<template>
    <div class="testCon">
        <div>
            <onetest  v-for = "childMsg in checkCon"
                      :childCheck = "childMsg.checkSingle"
                      :childText = "childMsg.text"
                      :key ="childMsg.id"
                      :id="childMsg.id"
                      @changeState="state">
            </onetest>
        </div>
        <input type="checkbox" @change="checkAll" v-model="isCheckedAll" />全选

    </div>
</template>

<script>
    import onetest from '../../../components/testOne'

    export default {
        name: "test",
        data() {
            return {
                checkCon: [
                    {id: '1',
                checkSingle: false,
                text: '我是一'
                    },
                {
                id:'2',
                    checkSingle: false,
                    text: '我是二'
            },
            {
                id:'3',
                    checkSingle: false,
                    text: '我是三'
            },
            {
                id:'4',
                    checkSingle: false,
                    text: '我是四'
            },
            {
                id:'5',
                checkSingle: false,
                text: '我是五'
            }
        ],
                isCheckedAll:false,

        }
    }
    ,
    components:{
        onetest,
    },
    methods:{
        checkAll(val) {
            this.checkCon.forEach((elem,key)=>{
                elem.checkSingle = this.isCheckedAll
            })
         },
        state(value,id){
            this.checkCon.forEach((elem,key)=>{
                if(elem.id==id){
                    elem.checkSingle = value
                }
            })
            let childCheck = this.checkCon.every((elem,index)=>{
                if(elem.checkSingle){
                    return true;
                }
            })
            if(childCheck){
                this.isCheckedAll = true;
            }else{
                this.isCheckedAll = false;
            }
        }
    }
    }
</script>
<style scoped>
    .testCon {
        padding-left: 100px;
    }
</style>
子组件:testOne.vue
<template>
    <div>
        <input type="checkbox"
               v-model="checkChild"
               :label = "childText"
               @change = "childChange"
        />{{childText}}  {{checkChild}}
    </div>
</template>

<script>
    export default {
        name: "oneTest",
        props:['childCheck','childText',"id"],
        data(){
            return {
                checkChild : this.childCheck
            }
        },
        methods:{
            childChange(){
                this.$emit('changeState',this.checkChild,this.id)
            }
        },
        watch:{
            childCheck(n,o){
                this.checkChild = n
            }
        }
    }
</script>

<style scoped>

</style>




猜你喜欢

转载自blog.csdn.net/dududu01/article/details/80484567