Xin's blog Xin's blog
首页
  • 前端文章

    • HTML
    • CSS
    • JavaScript
    • Vue
    • 组件与插件
    • CSS扩展语言
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
  • 前端框架面试题汇总
  • 基本面试题
  • 进阶面试题
  • 其它
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 前后端联调
  • mock.js
  • 奇技淫巧
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)

Xin

英雄可不能临阵脱逃啊~
首页
  • 前端文章

    • HTML
    • CSS
    • JavaScript
    • Vue
    • 组件与插件
    • CSS扩展语言
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
  • 前端框架面试题汇总
  • 基本面试题
  • 进阶面试题
  • 其它
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 前后端联调
  • mock.js
  • 奇技淫巧
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)
  • HTML

  • CSS

  • JavaScript

  • Vue

    • 知识点

      • filters过滤器的使用
      • watch的使用
      • createElement函数创建虚拟DOM
      • mixin的使用
      • 插槽
      • vuex的基本使用
      • 路由传参
      • 组件通信之 $attrs 和 $listeners
      • 组件通信之 $parent 和 $children
      • 组件通信之 provide 和 inject
      • 使用vue的model选项实现组件通信
      • v-on监听多个方法
      • axios的基本使用
      • vue中的鼠标事件、鼠标滚轮事件、键盘事件
      • Vue为什么要求组件模板只能有一个根元素
      • Vue中data为什么必须是一个函数?
        • Vue中的scoped和scoped穿透
        • vue-router传参,在页面刷新后数据格式改变的问题
        • 相同的组件,vue会直接复用
        • Vue项目使用mock数据的几种方式
        • Vue CLi3 修改webpack配置
      • 方法

      • vue API

    • 组件与插件

    • css扩展语言

    • 学习笔记

    • 前端
    • Vue
    • 知识点
    ctrlwin
    2021-07-09

    Vue中data为什么必须是一个函数?

    # Vue中data为什么必须是一个函数?

    # 解析:

    组件相当于一个可复用的Vue实例,一个组件被创建好后,就可能被用在各个地方,而组件不管复用多少次,组件内的data数据都应该是相互隔离、互不影响的,基于这个理念,组件每复用一次,data数据就会被复制一次,当某一处复用的组件内的data数据发生改变时,其它复用的组件内的data数据不会收到影响。

    例如,有这么个组件,被复用了3次,它们各自维护各自内部的data数据,互不影响。

    <template>
      <div class="test-components">
        <h1>按钮被点击了{{ count }}次</h1>
        <button @click="count++">click</button>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          count: 0,
        };
      },
    };
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    如果,我们将上面的data改成这样的话:

    data:{
    	count:0
    }
    
    1
    2
    3

    点击其中一个组件,其它组件也相继改变了。

    # 总结:

    综上所述,组件中的data写成函数的形式的话,数据以函数返回值的形式定义,这样每复用一次组件,就会返回一份新的data,相当于给每个组件实例创建一个私有的数据空间,让组件实例维护各自的数据。而单纯写成对象形式,就使得所有组件实例共用了一份data,就会发生一个变全部都变的情况。

    参考:vue组件中的data为什么是一个函数 (opens new window)

    在GitHub上编辑 (opens new window)
    #vue
    上次更新: 2/23/2022, 5:36:03 PM

    ← Vue为什么要求组件模板只能有一个根元素 Vue中的scoped和scoped穿透→

    最近更新
    01
    createElement函数创建虚拟DOM
    05-26
    02
    clipboard 剪切板属性
    05-26
    03
    vue的权限管理
    05-16
    更多文章>
    Theme by Vdoing | Copyright © 2021-2022 Xin | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    ×