vue教程:为什么组件中 data 必须是函数

说明

  1. vue中组件是用来 复用 的,为了防止 data 复用,将其定义为函数。

  2. vue组件中的data数据都应该是 相互隔离,互不影响的。组件每复用一次,data数据就应该被复制一次,之后,当某一处复用的地方组件内data数据被改变时,其他复用地方组件的data数据不受影响,就需要通过data函数返回一个对象作为组件的状态。

  3. 将组件中的 data 写成一个函数,数据以函数返回值形式定义,这样每复用一次组件,就会返回一份新的data,拥有自己的作用域,类似于给每个组件实例创建一个私有的数据空间,让各个组件实例维护各自的数据。

  4. 将组件的 date 写成 {}对象形式,这些实例用的是同一个构造函数,由于JavaScript的特性所导致,所有的组件实例共用了一个data,就会造成 一个变了全都会变 的结果。

摘自:
https://blog.csdn.net/qq_42072086/article/details/108060494

例子

<div id="app">
    3. 使用组件,类似自定义一个标签
    <com-student></com-student>
    <com-student></com-student>
    <com-student></com-student>
</div>

<script>

    // 1. 使用 {} 对象的方式创建
    let student = {
        template : `<div>
                        <div class="s1">姓名:{{name}}</div>
                        <div>年龄:<input type="text" v-model="age"></div>
                        <div>身高:{{height}}</div>
                        <input type="button" @click="addAge" value="年龄加1">
                    </div>`,
        // 组件中,data 必须是一个函数,该函数有一个返回值,类型是 {} 对象,每次创建一个新对象,互相之间不干扰
        data: function(){
            return {
                name:"李雷",
                age:20,
                height:1.82
            }
        },
        methods:{
            addAge(){
                this.age = this.age + 1
            }
        }
    }

    // vue实例
    var app = new Vue({
        el: '#app', //el是element缩写
        components:{ // 注册局部组件,只能在当前 vue实例中使用
            // key是组件名,供使用的
            // value是组件对象
            "com-student":student
        }
    })

</script>

如下图,点击 按钮,年龄互相之间不干扰:


原文出处:/show_1IX3FtYnSP14.html