zoukankan      html  css  js  c++  java
  • Vue.$set的使用场景

    有这样一个需求,用户可以增加多个输入框可以编辑:

     
     

    实现的思路很简单,点击增加的时候,往一个数组里面push一条数据即可:

    <template>
        <div>
            <div v-for="(item,k) in  prodForm.seqNos" :key="k">
                <input type="text" v-model="item.seqNo" />
            </div>
    
            <button @click="add">增加</button>
    
        </div>
    </template>
    
    <script>
        export default {
            name: "addInput",
            mounted(){
                this.prodForm = this.basicInfo //初始化
                this.prodForm.seqNos = [] //因basicInfo没有seqNos,因此重新添加
                console.log(this.prodForm)
            },
            data(){
    
                return {
                    prodForm:{
                        id:'',
                        seqNos:[],
    
                    },
                    basicInfo:{
                        id:1
                    }
                }
            },
            methods:{
                add(){
                    this.prodForm.seqNos.push({seqNo:''})
                }
            },
    
        }
    </script>
    
    <style scoped>
    .btn{
        100px;
        margin:10px;
    }
    </style>
    

    在mounted有一个初始化赋值操作,而basicInfo里面并没有seqNos这个数组,当赋值完成后,我需要重新添加回来,这样就有问题了,你点击增加的按钮无法生效,为啥呢?
    根据官方文档定义:
    如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。
    也就是说,默认vue会遍历data里面的所有属性,并使用Object.defineProperty把这些属性全部转为 getter/setter。
    我们通过打印prodForm变量,发现seqNos这个数组并未增加getter和setter,也就是这个数组并没被监听起来:

     
     

    怎么办呢?$set就派上用场了:

    Vue.$set(object, key, value)
    

    我们将代码改造一下:

    <template>
        <div>
            <div v-for="(item,k) in  prodForm.seqNos" :key="k">
                <input type="text" v-model="item.seqNo" />
            </div>
    
            <button @click="add">增加</button>
    
        </div>
    </template>
    
    <script>
        export default {
            name: "addInput",
            mounted(){
                this.prodForm = this.basicInfo //初始化
                //this.prodForm.seqNos = [] //因basicInfo没有seqNos,因此重新添加
    
                this.$set(this.prodForm,'seqNos',[])
                console.log(this.prodForm)
            },
            data(){
    
                return {
                    prodForm:{
                        id:'',
                        seqNos:[],
    
                    },
                    basicInfo:{
                        id:1
                    }
                }
            },
            methods:{
                add(){
                    this.prodForm.seqNos.push({seqNo:''})
                }
            },
    
        }
    </script>
    
    <style scoped>
    .btn{
        100px;
        margin:10px;
    }
    </style>
    

    这时再打印prodForm变量,发现seqNos数组已经添加了getter和setter,按钮也生效了:

     
     

    本文来自博客园,作者:喆星高照,转载请注明原文链接:https://www.cnblogs.com/houxianzhou/p/13534613.html

  • 相关阅读:
    Facelets应用程序的生命周期
    JavaServer Faces生命周期概述
    spring security使用自定义登录界面后,不能返回到之前的请求界面的问题
    记一次使用mybatis进行like 模糊查询遇到的问题
    用Filter作用户授权的例子
    p132代码解析
    xml
    java EE第一周博客
    spring security的简单应用
    Java包装类,以及Integer与int之间的比较
  • 原文地址:https://www.cnblogs.com/houxianzhou/p/13534613.html
Copyright © 2011-2022 走看看