最简单但完整的 Vue 响应式示例(一个简单的计数器按钮)

1、先创建项目,如果不会,请移步 从零开始 Vue.js

2、修改 App.vue 代码,如下:

复制代码
<template>
  <button @click="count++">{{ count }}</button>
</template>

<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>

<style scoped>
button {
  padding: 10px 20px;
  font-size: 16px;
  cursor: pointer;
}
</style>

这样我们就得到了一个 点击会增长数字的按钮。

代码讲解:

📦 整体结构

Vue 单文件组件(.vue 文件)由三部分组成:模板、逻辑、样式。

🎨 第一部分:模板(Template)

复制代码
<template>
  <button @click="count++">{{ count }}</button>
</template>

详细解释:

  • <button>:HTML 按钮元素

  • @click="count++":Vue 的事件监听

    • @clickv-on:click 的简写

    • 当按钮被点击时,执行 count++ 表达式

    • count++ 意思是 count = count + 1

  • {``{ count }}:Vue 的插值语法(双花括号)

    • 显示变量 count 的当前值

    • count 变化时,这里会自动更新

效果:按钮上显示数字,每次点击数字增加 1

🧠 第二部分:逻辑(Script)

复制代码
<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>

详细解释:

import { ref } from 'vue'
  • 从 Vue 框架中导入 ref 函数

  • ref 用于创建响应式数据(数据变化时,页面自动更新)

const count = ref(0)
  • 创建响应式变量 count,初始值为 0

  • ref(0) 返回一个对象,需要通过 .value 访问/修改

    • 读取:count.value

    • 修改:count.value = 5

  • 但在模板中<template>)使用 count 时,不需要写 .value,Vue 会自动解包

<script setup>
  • 这是 Vue 3 的组合式 API 语法糖

  • 让代码更简洁

  • 声明的变量/函数可以直接在模板中使用

🎭 第三部分:样式(Style)

复制代码
<style scoped>
button {
  padding: 10px 20px;
  font-size: 16px;
  cursor: pointer;
}
</style>

详细解释:

scoped 关键字
  • 样式只作用于当前组件,不会影响其他组件

  • Vue 会给当前组件的元素添加特殊属性(如 data-v-xxxx),让样式只匹配它们

CSS 属性说明
属性 作用
padding 10px 20px 内边距:上下10px,左右20px
font-size 16px 文字大小16像素
cursor pointer 鼠标悬停时变成手型(👆),表示可点击

🔄 完整工作流程

复制代码
1. 页面加载
   ↓
2. 执行 <script setup>
   - 导入 ref
   - 创建 count = 0
   ↓
3. 渲染 <template>
   - 按钮显示 "0"
   ↓
4. 用户点击按钮
   ↓
5. 触发 @click="count++"
   - 执行 count.value = count.value + 1
   - count 变成 1
   ↓
6. Vue 检测到 count 变化
   ↓
7. 自动重新渲染按钮
   - 按钮显示 "1"
   ↓
8. 重复步骤 4-7...

📊 关键概念总结

概念 作用 示例
响应式数据 数据变化自动更新页面 ref(0)
事件监听 响应用户操作 @click="..."
插值语法 在模板中显示数据 {``{ count }}
作用域样式 样式隔离 <style scoped>

🎯 运行效果

当你保存这段代码后:

  • 浏览器显示一个按钮

  • 按钮上显示数字 0

  • 每次点击按钮,数字 +1

  • 按钮有内边距、合适字体、鼠标手型效果

相关推荐
To_OC8 小时前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
IT_陈寒12 小时前
Vue这个坑我跳了两次,原来问题出在这
前端·人工智能·后端
kyriewen12 小时前
我用 50 行代码重写了 React Router 核心,终于搞懂了前端路由原理
前端·javascript·react.js
WebInfra13 小时前
Rspack 2.1 发布:React Compiler 提速 10 倍!
前端
李明卫杭州13 小时前
CSS 媒体查询详解:一文掌握响应式设计的核心技术
前端
lichenyang45314 小时前
从 H5 按钮到 OpenHarmony 能力调用:我如何理解 ASCF 的运行链路
前端
下家14 小时前
我放弃了 Vue/React,选择自研框架
前端·前端框架
Asize15 小时前
HTML5 Canvas 基础:从按帧动画到 ECharts 数据可视化
前端·javascript·canvas
默_笙15 小时前
🎄 后端给我一堆扁平数据,我 10 行代码把它变成了树
前端·javascript
Mahut15 小时前
我用 Electron + FFmpeg 做了一个本地视频处理工作站 ClipForge
前端·ffmpeg·electron