当前位置: 首页 > news >正文

Vue.js Data定义方式对比 data() { return {...} } 与 data: {} 的区别

Vue.js Data定义方式对比

data() { return {…} } 与 data: {} 的区别

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vue.js Data定义方式对比</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script><style>* {box-sizing: border-box;margin: 0;padding: 0;}body {font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;line-height: 1.6;color: #333;background-color: #f8f9fa;padding: 20px;}.container {max-width: 1000px;margin: 0 auto;}header {text-align: center;margin-bottom: 40px;padding: 20px;background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%);color: white;border-radius: 10px;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);}h1 {margin-bottom: 10px;}.subtitle {font-weight: normal;opacity: 0.9;}.content {display: flex;gap: 30px;flex-wrap: wrap;}.card {flex: 1;min-width: 300px;background: white;border-radius: 10px;padding: 25px;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);}.card-title {color: #2575fc;margin-bottom: 20px;padding-bottom: 10px;border-bottom: 2px solid #eaeaea;}.code-block {background: #2d2d2d;color: #f8f8f2;padding: 15px;border-radius: 5px;overflow-x: auto;margin: 15px 0;font-family: 'Fira Code', monospace;}.interactive-demo {margin-top: 30px;padding: 20px;background: #f1f8ff;border-radius: 8px;border-left: 4px solid #2575fc;}.demo-title {color: #2575fc;margin-bottom: 15px;}button {background: #2575fc;color: white;border: none;padding: 10px 15px;border-radius: 5px;cursor: pointer;margin: 5px;transition: background 0.3s;}button:hover {background: #1c64e0;}.counter-display {font-size: 1.2rem;margin: 15px 0;padding: 10px;background: #e8f4ff;border-radius: 5px;text-align: center;}.explanation {margin-top: 30px;padding: 20px;background: #fff4e6;border-radius: 8px;border-left: 4px solid #ffa94d;}.explanation h3 {color: #ff7730;margin-bottom: 15px;}.highlight {background: #fff8e1;padding: 2px 5px;border-radius: 3px;font-weight: bold;}footer {text-align: center;margin-top: 40px;color: #6c757d;}@media (max-width: 768px) {.content {flex-direction: column;}}</style>
</head>
<body><div id="app" class="container"><header><h1>Vue.js Data定义方式对比</h1><p class="subtitle">data() { return {...} } 与 data: {} 的区别</p></header><div class="content"><div class="card"><h2 class="card-title">函数形式: data() { return {...} }</h2><div class="code-block">// 在Vue组件中<br>export default {<br>&nbsp;&nbsp;data() {<br>&nbsp;&nbsp;&nbsp;&nbsp;return {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count: 0,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message: 'Hello Vue!'<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>}</div><ul><li>每个组件实例都有自己的数据副本</li><li>避免多个组件实例之间共享数据</li><li>Vue组件<strong>必须</strong>使用这种方式</li><li>每次创建新实例时都会调用该函数</li></ul></div><div class="card"><h2 class="card-title">对象形式: data: {}</h2><div class="code-block">// 在Vue根实例中<br>new Vue({<br>&nbsp;&nbsp;el: '#app',<br>&nbsp;&nbsp;data: {<br>&nbsp;&nbsp;&nbsp;&nbsp;count: 0,<br>&nbsp;&nbsp;&nbsp;&nbsp;message: 'Hello Vue!'<br>&nbsp;&nbsp;}<br>})</div><ul><li>数据直接在实例间共享</li><li>只适用于<strong>根实例</strong></li><li>在组件中使用会导致数据共享问题</li><li>Vue会警告不要使用这种方式</li></ul></div></div><div class="interactive-demo"><h3 class="demo-title">交互演示</h3><p>下面的两个计数器组件使用不同的data定义方式:</p><div style="display: flex; gap: 20px; margin-top: 20px; flex-wrap: wrap;"><div style="flex: 1; min-width: 250px; padding: 15px; background: white; border-radius: 8px;"><h4>使用data()函数 (正确方式)</h4><counter-function></counter-function><counter-function></counter-function><p style="margin-top: 10px; font-size: 0.9em; color: #28a745;">每个组件实例有独立的数据</p></div><div style="flex: 1; min-width: 250px; padding: 15px; background: white; border-radius: 8px;"><h4>使用data对象 (错误方式)</h4><counter-object></counter-object><counter-object></counter-object><p style="margin-top: 10px; font-size: 0.9em; color: #dc3545;">所有组件实例共享相同数据</p></div></div></div><div class="explanation"><h3>为什么在组件中必须使用函数形式?</h3><p>当使用<strong class="highlight">data: {}</strong>对象形式时,所有组件实例<strong>共享同一个数据对象</strong>。这意味着修改一个实例的数据会影响所有其他实例。</p><p>而使用<strong class="highlight">data() { return {...} }</strong>函数形式时,每次创建组件实例都会调用这个函数,返回一个<strong>全新的数据对象副本</strong>,从而确保每个实例都有自己的独立数据。</p><p>这就是为什么Vue强制在组件中使用函数形式定义data,而在根实例中可以使用对象形式(因为根实例是单例的)。</p></div></div><script>// 使用data函数形式的组件(正确方式)Vue.component('counter-function', {template: `<div class="counter-display"><p>计数: {{ count }}</p><button @click="count++">增加</button><button @click="count--">减少</button></div>`,data() {return {count: 0}}});// 使用data对象形式的组件(错误方式)const sharedData = { count: 0 };Vue.component('counter-object', {template: `<div class="counter-display"><p>计数: {{ count }}</p><button @click="count++">增加</button><button @click="count--">减少</button></div>`,data: sharedData  // 错误:所有实例共享同一个对象});new Vue({el: '#app'});</script>
</body>
</html>

文章转载自:

http://Erfv9XDg.qnxzx.cn
http://hRUJDxqj.qnxzx.cn
http://ZepW3gLP.qnxzx.cn
http://NjiiCHm8.qnxzx.cn
http://EQKcBZOz.qnxzx.cn
http://Zvs4VjwN.qnxzx.cn
http://LdSzyDAy.qnxzx.cn
http://NdXiHUkf.qnxzx.cn
http://wplOBTKV.qnxzx.cn
http://bXBHbCG1.qnxzx.cn
http://fM2hOC13.qnxzx.cn
http://7r0v7Fyu.qnxzx.cn
http://PPH4PbsZ.qnxzx.cn
http://Y73q14WZ.qnxzx.cn
http://Ev7f0eIf.qnxzx.cn
http://nazBaQLV.qnxzx.cn
http://NzWd6lE4.qnxzx.cn
http://lU1Py3ix.qnxzx.cn
http://rXmbCCrB.qnxzx.cn
http://kifIWdDT.qnxzx.cn
http://U5tQ4q6i.qnxzx.cn
http://5RhYf4ZN.qnxzx.cn
http://5XrnBab3.qnxzx.cn
http://UDYrZjTZ.qnxzx.cn
http://xe8Tykxf.qnxzx.cn
http://qZIF9U9W.qnxzx.cn
http://hPsGKT6u.qnxzx.cn
http://2u4GUTQc.qnxzx.cn
http://QoBKKgBX.qnxzx.cn
http://Rdnu6QxN.qnxzx.cn
http://www.dtcms.com/a/379189.html

相关文章:

  • P11961原根判断(1)
  • 特征空间的转换方法 IPM/LSS/Transformer
  • 【Vue3】05-Options API和Composition API的区别
  • 锁框架-面试
  • 电商 API 爬虫高阶技巧:多线程 / 异步请求结合,突破接口频率限制
  • vue两个组件互相引入时候会报错
  • 《芯片封装后未测试品粘连及边缘残胶的多维度工艺与材料失效分析》
  • MySQL基础全面解析
  • 探索容器技术:从LXC到Podman的演进
  • IntelliJ IDEA 启动项目时配置端口指南
  • java 实现rtsp 直播流下载
  • Python高级编程实战:装饰器、迭代器与生成器的深度应用
  • 高级SQL技术综合指南(MySQL)
  • 【51单片机】【protues仿真】基于51单片机电子琴系统
  • 解决idea2021maven依赖导入后还是找不到包,爆红无法导入
  • Netty学习
  • VGGNet:为什么16层简单堆叠能成为CNN经典?
  • 知识图谱RAG
  • 与controller层的接口入参注解@Valid有关的实体类判断空的注解
  • 基于AT89C52单片机的智能蓝牙台灯设计
  • Javaweb前端内容的思维导图
  • PyTorch深度学习实战【10】之神经网络的损失函数
  • 3.前置知识学习
  • Whois查询域名信息
  • 机器学习vs人类学习:人类学习如何借鉴机器学习方法?
  • ES6 面试题及详细答案 80题 (41-54)-- 异步编程(Promise/Generator/async)
  • Bug记录:Lombok @Builder 注解的两大陷阱及解决方案
  • ARM汇编 beep及bsp工程管理
  • 深入理解 Vue3 Router:三种路由模式的工作原理与实战应用
  • 2025 ICPC Gran Premio de Mexico 3ra Fecha