Skip to content

Day 3: 计数器实践

🚀 实践计数器应用

日期: 2025年12月3日 学习目标: 实现简单的计数器应用,巩固Day1和Day2学到的知识 估计时间: 1小时 ⏱️ 认知层次: 实践巩固 + 知识应用


📋 Day 3 学习菜单 (精简版)

🔄 快速回顾 (10分钟)

  • markdown
    📁 复习文件: [daydayup-20251202.md](./daydayup-20251202.md)
    
    ⚡ 快速回顾 (10分钟):
    - Vue自动解包机制:只对顶层ref自动解包
    - 嵌套ref需要手动加.value
    - Template中自动解包,Script中必须手动.value
    - ref()创建响应式数据,可以是任意类型
    
    💡 今天要用这些知识来实践!

💻 实践任务 - 简单计数器 (45分钟)

  • markdown
    📁 文件位置: day3/counter.html
    
    ✅ 功能需求 (够用就行):
    - 显示当前数字
    - 一个"加1"按钮
    - 一个"减1"按钮
    
    🎯 核心代码结构:
    ```html
    <div id="app">
      <h1>计数器</h1>
      <div>{{ count }}</div>
      <button @click="increment">+1</button>
      <button @click="decrement">-1</button>
    </div>
    
    <script>
      const { createApp, ref } = Vue;
      
      createApp({
        setup() {
          const count = ref(0);
          
          const increment = () => {
            count.value++;  // 注意:script中必须用.value
          };
          
          const decrement = () => {
            count.value--;  // 注意:script中必须用.value
          };
          
          return {
            count,      // Template中会自动解包
            increment,
            decrement
          };
        }
      }).mount('#app');
    </script>

    💡 提示:

    • 参考Day1的代码结构
    • 记住:Template中会自动解包
    • Script中count.value++必须写.value
    • 函数必须return才能在模板中使用

📝 简单记录 (5分钟)

  • markdown
    📝 简单记录 (50-100字即可):
    
    💭 **今天做了什么**:
    - 
    
    🎯 **一个小收获**:
    - 
    
    💡 **明天想学**:
    -

📊 Day 3 完成检查表

✅ 核心任务 (完成这3个就够了)

🎁 额外奖励 (想做就做,不做也没关系)

📋 今日学习产出

产出类型完成情况文件位置
计数器应用✅完成./day3/counter.html
实践总结⏳进行中本文件记录

🎉 Day 3 庆祝与展望

🏆 今日成就

🎯 明日预告 (Day 4)

markdown
预计内容:
- 继续深入学习Vue
- 目标: 保持学习节奏,不累不倦

💡 轻松一刻

今天学完了,给自己点个赞! 👍

  • 不需要完美,完成就好
  • 不需要理解所有,有收获就行
  • 保持轻松,享受学习过程

📈 学习追踪仪表板

Day理论学习实践编码AI协作反思质量总体满意度
1🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥
2🔥🔥🔥⏭️跳过🔥🔥🔥🔥🔥🔥🔥🔥🔥
3

🔥 = 优秀 🔥🔥 = 良好 🔥🔥🔥 = 卓越 ⏳ = 进行中 ⏭️ = 跳过


💬 当天学习记录

简单记录一下今天的学习:

📝 快速笔记

今天做了什么:
- 查阅了 Vue 3.4+ 版本关于 ref 嵌套解包的改进
- 发现了 Vue 3.4.31+ 的重要更新
- 创建了 day3 目录并实现了计数器应用
- 完成了实践任务并测试通过

遇到的小问题:
- 昨天记录的"嵌套ref需要手动加.value"规则在 Vue 3.4.31+ 有变化

解决方式:
- 查阅了 Vue 官方 CHANGELOG
- 了解了 toDisplayString 函数的改进
- 通过实践验证了 ref 的使用方法

核心收获:
- Vue 3.4.31+ 在显示时会自动解包嵌套的 ref
- 但属性访问/方法调用时仍需手动 .value
- 通过计数器应用巩固了 ref、setup、模板语法等核心概念

🔍 重要发现:Vue 3.4.31+ 的 ref 解包改进

📢 背景

昨天(Day 2)我们学习了 Vue 的 ref 嵌套和解包机制,记录的核心规则是:

  • 只对顶层 ref 自动解包
  • 嵌套的 ref 需要手动加 .value

但今天查阅资料发现,Vue 3.4.31+ 版本对此有重要改进!

🎯 Vue 3.4.31+ 的重要更新

Vue 3.4.31 版本中,有一个重要的修复:unwrap refs in toDisplayString (#7306)

核心变化:

  1. 编译器层面:仍然不会自动为嵌套 ref 添加 .value

    • 编译结果仍然是 user.value.name(不会变成 user.value.name.value
  2. 运行时层面toDisplayString 函数会在显示时自动解包嵌套的 ref

    • 这意味着在模板中显示嵌套 ref 时,可以省略 .value

📊 实际效果对比

示例代码:

javascript
const user = ref({
    name: ref('Alice'),
    age: ref(20)
});

Vue 3.4.30 及之前版本:

html
<!-- ❌ 显示 ref 对象,不是值 -->
<div>{{ user.name }}</div>  
<!-- 显示:[object Object] 或 RefImpl {...} -->

Vue 3.4.31+ 版本:

html
<!-- ✅ 运行时自动解包,显示值 -->
<div>{{ user.name }}</div>  
<!-- 显示:Alice(运行时自动解包) -->

⚠️ 重要限制

虽然显示时可以自动解包,但属性访问和方法调用仍然需要手动加 .value

javascript
const user = ref({
    name: ref('Alice'),
    profile: ref({
        bio: ref('Developer')
    })
});
html
<!-- ✅ Vue 3.4.31+:显示时自动解包 -->
<div>{{ user.name }}</div>           <!-- ✅ 显示:Alice -->
<div>{{ user.profile }}</div>         <!-- ✅ 显示:[object Object](profile是对象ref) -->
<div>{{ user.profile.bio }}</div>     <!-- ✅ 显示:Developer(运行时解包) -->

<!-- ❌ 但如果需要访问属性或方法,仍需手动.value -->
<div>{{ user.name.toUpperCase() }}</div>  <!-- ❌ 错误:name是ref,需要.value -->
<div>{{ user.name.value.toUpperCase() }}</div>  <!-- ✅ 正确 -->

📋 规则总结(Vue 3.4.31+)

场景Vue 3.4.30 及之前Vue 3.4.31+
顶层 ref 显示✅ 自动解包✅ 自动解包
嵌套 ref 显示❌ 需要手动 .value运行时自动解包
嵌套 ref 属性访问❌ 需要手动 .value❌ 仍需要手动 .value
嵌套 ref 方法调用❌ 需要手动 .value❌ 仍需要手动 .value

💡 关键理解

  1. 编译器行为:Vue 编译器仍然只检查顶层 ref,不会深度遍历嵌套的 ref
  2. 运行时行为toDisplayString 函数在显示时会递归解包嵌套的 ref
  3. 性能考虑:编译器层面的限制是为了性能优化,运行时解包仅用于显示场景

🔗 参考资源

🎓 学习心得

这个发现让我意识到:

  • 文档和版本很重要:不同版本的 Vue 行为可能有差异
  • 理解原理很重要:编译器层面和运行时层面的行为是不同的
  • 实践验证很重要:理论规则需要在实际项目中验证

建议:在实际项目中,如果使用 Vue 3.4.31+,可以尝试在显示嵌套 ref 时省略 .value,但属性访问时仍需手动添加。



🚀 记住: 学习不需要完美,完成比完美更重要!今天是第3天,轻松实践,巩固知识!

今日宣言: "1小时搞定,实践巩固,明天继续!" 🎓✨


🎯 特别提醒:

  • ⏱️ 时间控制在1小时内
  • 😊 保持轻松心态
  • ✅ 完成核心任务就好
  • 🎁 额外任务想做就做,不做也没关系

© 2025 技术博客. All rights reserved by 老周有AI