2-2 vue data一定是函数

data一定是函数

  • <strong>data必须是函数</strong>
    • 使用组件时,大多数可以传入到 Vue 构造器中的选项都可以在 Vue.extend() 或Vue.component()中注册组件时使用,但组件中data是个例外, <strong>data 必须是函数</strong>。

1.验证data必须是函数

  • 下面代码会出现的问题:
 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title></title>
 </head>
 <body>
     <div id="app"></div>

     <template id="myTemplate">
         <div>{{message}}</div>
     </template>
 <script src="js/vue.js"></script>
 <script>
     Vue.component('my-component', {
         template: '#myTemplate',
         data:{
             message:'你好,中国!'
         }
     })

     new Vue({
         el:'#app'
     })
 </script>
 </body>
 </html>
  • 代码运行结果:


    vueb1.png
  • 正确的写法:
Vue.component('my-component', {
     template: '#myTemplate',
     data: function () {
         return {
             message: '你好,中国'
         }
     }
 })

2.data必须在函数中返回

  • 注意:如果data选项指向某个对象,这意味着所有的组件实例共用一个data。
    我们应当使用一个函数作为 data 选项,让这个函数返回一个新对象。
  • 注意: 在外面定义对象, 然后在data()中返回这个对象, 那么所有组件用的对象都是同一个对象

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
       <div id="app">
          <simple-counter></simple-counter>
          <simple-counter></simple-counter>
          <simple-counter></simple-counter>
       </div>
    
       <template id="myComponent">
            <button @click="counter += 1">
               {{counter}}
            </button>
       </template>
    <script src="js/vue.js"></script>
    <script>
    
        var data = { counter: 0 }
    
        Vue.component('simple-counter', {
            template: '#myComponent',
            /*
             data 是一个函数,因此 Vue 不会警告,
             但是我们为每一个组件返回了同一个对象引用
            */
            data: function () {
                return data
            }
        })
    
        new Vue({
            el: "#app"
        })
    </script>
    </body>
    </html>
    
    • 运行结果,这三个组件共享了同一个 data , 因此增加一个 counter 会影响所有组件!
vueb2.png
- 解决办法:为每个组件返回新的 data 对象来解决这个问题!

```
  data: function () {
        return {
            counter: 0
        }
    }
```
vueb3.png


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 10,468评论 0 29
  • 下载安装搭建环境 可以选npm安装,或者简单下载一个开发版的vue.js文件 浏览器打开加载有vue的文档时,控制...
    冥冥2017阅读 11,269评论 0 42
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 6,678评论 0 6
  • 1.安装 可以简单地在页面引入Vue.js作为独立版本,Vue即被注册为全局变量,可以在页面使用了。 如果希望搭建...
    Awey阅读 13,797评论 4 129
  • 此文基于官方文档,里面部分例子有改动,加上了一些自己的理解 什么是组件? 组件(Component)是 Vue.j...
    陆志均阅读 9,248评论 5 14