美文网首页web前端
Vue.$set的使用场景

Vue.$set的使用场景

作者: 姜治宇 | 来源:发表于2020-06-10 18:51 被阅读0次

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


add.png

实现的思路很简单,点击增加的时候,往一个数组里面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{
    width:100px;
    margin:10px;
}
</style>

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


666.png

怎么办呢?$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{
    width:100px;
    margin:10px;
}
</style>

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


777.png

相关文章

  • Vue.$set的使用场景

    有这样一个需求,用户可以增加多个输入框可以编辑: 实现的思路很简单,点击增加的时候,往一个数组里面push一条数据...

  • 使用Vue.$set()

    在对象中新增一个字段的时候,需要用这个方法

  • Vue.$set的使用

    官方给出:vm.$set(target,key,val)target{object | array}key{str...

  • 使用Vue.$set()给对象新增属性

    在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对...

  • ES6学习笔记--Set与Map

    Set Set 是不包含重复值的列表。常见的Set使用场景是检查某个值是否存在. Set实例需要用new Set(...

  • vue的查漏补缺1

    1、vue的set功能 使用场景: 使用方法:Vue.set() 2、vue的filter功能 全局注册时是fil...

  • 接着昨天的问题

    解决办法vue.$set(要存入的数组,存入的位置,存入的值),从而实现局部刷新。自己还很渣,加油

  • 最近才发现vue.$set

    笔记备忘 有点失策 this.$set不一定要在data根里面的响应式对象,也可以是响应式对象中的对象添加属性

  • 了解ThreadLocal

    ThreadLocal 什么是ThreadLocal 存取实质 使用场景 使用方法 set()流程 get()流程...

  • Vue-给对象新增属性(使用Vue.$set())

    在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对...

网友评论

    本文标题:Vue.$set的使用场景

    本文链接:https://www.haomeiwen.com/subject/mxnptktx.html