zoukankan      html  css  js  c++  java
  • Vue——为什么组件data是函数

    问题描述

    为什么Vue组件中的data是函数?

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div id="app">
            <conter></conter>
        </div>
    </body>
    <script src="node_modules/vue/dist/vue.js"></script>
    <script>
        Vue.component("conter",{
           template:"<button type="button" @click="num++">点我{{num}}</button>",
            data:function () {
                return{
                    num: 1
                }
            }
        });
        const app=new Vue({
            el: "#app"
        });
    </script>
    </html>

    根本原因

    Object是引用数据类型,如果不用function返回,每个组件的data都是内存的同一个地址,一个数据改变了其他也改变了;组件是可复用的,一个数据改变其他的也改变这很明显不是我们想要看到的结果,所以组件的data返回值必须是函数。当然了如果你想多个组件共享同一份data,也可以使用对象

    JavaScript只有函数构成作用域(注意理解作用域,只有函数{}构成作用域,对象的{}以及if(){}都不构成作用域),data是一个函数时,每个组件实例都有自己的作用域,每个实例相互独立,不会相互影响。

    示例

    const MyComponent = function() {};
    MyComponent.prototype.data = {
        a: 1,
        b: 2
    }
    const component1 = new MyComponent();
    const component2 = new MyComponent();
     
    component1.data.a === component2.data.a; // true
    component1.data.b = 5;
    component2.data.b //5

    如果两个实例同事引用一个对象,那么当你修改其中一个属性的时候,另外一个实例也会跟着该;

    两个实例应该有自己各自的域才对,需要通过下面的方法进行处理

    const MyComponent = function() {
        this.data = this.data();
    };
     
    MyComponent.prototype.data = function() {
        return {
            a:1,
            b:2
        }
    };
  • 相关阅读:
    分层图(了解一下,下一道比较好做)
    图论---The Captain
    数论
    NOIp复习计划
    20201116 Day4 卢卡斯定理
    20201113 Day3 斜率优化
    20201110Day2 分块
    20201030 day50 复习13:逆元、裴蜀定理
    20201030day50 模板全掌握
    20201029 day49 模拟(十八)
  • 原文地址:https://www.cnblogs.com/sheng-se/p/14110660.html
Copyright © 2011-2022 走看看