Vue: 动态给属性赋值

介绍

有时候我们会需要动态赋值给vue中已经定义的变量,比如,在批量加载字典数据的时候,就可以使用了.

正好,vue提供了类似的方法.

API

这个方法来自vue的api,下面是来自官方文档的引用:

Vue 实例的数据对象。Vue 将会递归将 data 的属性转换为 getter/setter,从而让 data 的属性能够响应数据变化。对象必须是纯粹的对象 (含有零个或多个的 key/value 对):浏览器 API 创建的原生对象,原型上的属性会被忽略。大概来说,data 应该只能是数据 – 不推荐观察拥有状态行为的对象。

一旦观察过,不需要再次在数据对象上添加响应式属性。因此推荐在创建实例之前,就声明所有的根级响应式属性。

实例创建之后,可以通过 vm.$data 访问原始数据对象。Vue 实例也代理了 data 对象上所有的属性,因此访问 vm.a 等价于访问 vm.$data.a。

以 _ 或 $ 开头的属性 不会 被 Vue 实例代理,因为它们可能和 Vue 内置的属性、API 方法冲突。你可以使用例如 vm.$data._property 的方式访问这些属性。

当一个组件被定义,data 必须声明为返回一个初始数据对象的函数,因为组件可能被用来创建多个实例。如果 data 仍然是一个纯粹的对象,则所有的实例将共享引用同一个数据对象!通过提供 data 函数,每次创建一个新实例后,我们能够调用 data 函数,从而返回初始数据的一个全新副本数据对象。

如果需要,可以通过将 vm.$data 传入 JSON.parse(JSON.stringify(…)) 得到深拷贝的原始数据对象。

详细可以参考: https://cn.vuejs.org/v2/api/#data

其中提到了,vue的实例是一个浅拷贝的对象.任何修改都会在同一个data上体现,如果需要深拷贝的对象,只能通过JSON.parse(JSON.stringify(vm.$data))来获得深拷贝的对象.

vuejs logo
image-2795

示例

<!DOCTYPE html>
<html lang="en">

<head>
    <title>Vue</title>
    <meta charset="UTF-8"/>
    <script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <style>
    </style>
</head>
<body>
<div id="app">
    <div>age:{{age}}</div>
    <div>name:{{name}}</div>
    <div><input type="button" value="切换age的值" @click="btnClick()"/></div>
    <div><input type="button" value="切换name的值" @click="btnNameClick()"/></div>
    <div><input type="button" value="重新加载页面" @click="reload()"/></div>
    <div>参考来源: <a href="https://cn.vuejs.org/v2/api/#data" target="_blank">https://cn.vuejs.org/v2/api/#data</a></div>
</div>

<script>
    const vue = new Vue({
        el:"#app",
        data:{
            age:'18',
            name:'李四'
        },
        methods:{
            // 统一设置.
            // 
            // field: 属性名.
            // value: 属性值.
            changeValue(field,value){
                this.$data[field]=value;
            },
            btnClick(){
                this.changeValue('age','20')
            },
            btnNameClick(){
                this.changeValue('name','张三');
            },
            reload(){
                window.location.reload();
            }
        },
        created:function(){

        }
    })


</script>
</body>

</html>

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据