Vue介绍及入门案例

本文介绍了前端开发的演进,从静态HTML到JavaScript、Ajax,再到MVVM模式的Vue框架。Vue是一款MVVM模式的渐进式框架,允许开发者像使用jQuery一样简单地开始,并提供了官方文档和入门教程。在快速入门部分,详细阐述了如何创建Vue工程,如何安装Vue,以及通过一个简单的案例展示了Vue的双向绑定和事件处理功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.前言

前端开发模式的发展。

)

静态页面

  • 最初的网页以HTML为主,是纯静态的网页。网页是只读的,信息流只能从服务的到客户端单向流通。开发人员也只关心页面的样式和内容即可。

异步刷新,操作DOM

  • 1995年,网景工程师Brendan Eich 花了10天时间设计了JavaScript语言.
    随着JavaScript的诞生,我们可以操作页面的DOM元素及样式,页面有了一些动态的效果,但是依然是以静态为主。
  • ajax盛行
    • 2005年开始,ajax逐渐被前端开发人员所重视,因为不用刷新页面就可以更新页面的数据和渲染效果。
    • 此时的开发人员不仅仅要编写HTML样式,还要懂ajax与后端交互,然后通过JS操作Dom元素来实现页面动态效果。比较流行的框架如Jquery就是典型代表。

MVVM,关注模型和视图–相当于后端的MVC,但是前端的MVVM比MVC强大**

  • 2008年,google的Chrome发布,随后就以极快的速度占领市场,超过IE成为浏览器市场的主导者。

  • 2009年,Ryan Dahl在谷歌的Chrome V8引擎基础上,打造了基于事件循环的异步IO框架:Node.js。

    • 基于时间循环的异步IO
    • 单线程运行,避免多线程的变量同步问题
    • JS可以编写后台diamante,前后台统一编程语言
  • node.js的伟大之处不在于让JS迈向了后端开发,而是构建了一个庞大的生态系统。

  • 2010年,NPM作为node.js的包管理系统首次发布,开发人员可以遵循Common.js规范来编写Node.js模块,然后发布到NPM上供其他开发人员使用。目前已经是世界最大的包模块管理系统。

  • 随后,在node的基础上,涌现出了一大批的前端框架:
    在这里插入图片描述
    MVVM模式

  • M:即Model,模型,包括数据和一些基本操作

  • V:即View,视图,页面渲染结果

  • VM:即View-Model,模型与视图间的双向操作(无需开发人员干涉)

在MVVM之前,开发人员从后端获取需要的数据模型,然后要通过DOM操作Model渲染到View中。而后当用户操作视图,我们还需要通过DOM获取View中的数据,然后同步到Model中。

而MVVM中的VM要做的事情就是把DOM操作完全封装起来,开发人员不用再关心Model和View之间是如何互相影响的:

  • 只要我们Model发生了改变,View上自然就会表现出来。
  • 当用户修改了View,Model中的数据也会跟着改变。

把开发人员从繁琐的DOM操作中解放出来,把关注点放在如何操作Model上。
在这里插入图片描述
而我们今天要学习的,就是一款MVVM模式的框架:Vue

2.认识Vue

渐进式:

  1. 我们可以像使用jQuery一样,使用vue
  2. 采用node的方式去使用vue

官网:https://cn.vuejs.org/

参考:https://cn.vuejs.org/v2/guide/
在这里插入图片描述

3.快速入门

3.1.创建工程
创建一个maven工程:在这里插入图片描述
位置信息:
在这里插入图片描述
3.2.安装vue
3.2.1.下载安装

下载地址:https://github.com/vuejs/vue

可以下载2.5.16版本https://github.com/vuejs/vue/archive/v2.5.16.zip

下载解压,得到vue.js文件。
或者也可以直接使用公共的CDN服务:

 <-- 开发环境版本,包含了用帮助的命令行警告-->
 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

或者:

<!-- 生产环境版本,优化了尺寸和速度 -->
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

3.3.vue入门案例
在vue-demo目录新建一个HTML
在这里插入图片描述
在hello.html中,我们编写一段简单的代码:在这里插入图片描述
h2中要输出一句话:xx 非常帅。效果图如下所示:在这里插入图片描述
3.3.2.vue渲染
然后我们通过Vue进行渲染:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue-2.5.17.js"></script>
</head>
<body>
 <!-- 1 必须要有父容器,所有内容只能写在这个父容器中
      父容器一定要有id属性,id的值自定义,但是一般叫 app
 -->
<div id="app">
  <!-- 此处需要获取Vue对象中的name
       {{}}两个大括号获取data中的属性的值
  -->
    <h2>{{name}}非常帅</h2>

</div>

<script>
    // 方向一:当改变data.属性内容的时候,view中自动更新
    // 方向二:当在页面改变name的时候,data中的name也会自动更新
    var vm = new Vue({
       el:"#app",    //el就是element的简写,指向父容器的id
       data:{        // data 专门用来存放数据
           name:"奇哥"
       }

    });
    
</script>

</body>
</html>

打开页面查看效果:
在这里插入图片描述
3.3.3.双向绑定
我们对刚才的案例进行简单修改:

<div id="app">
    <input type="text" v-model="num">
    <h2>
        {{name}} 非常帅,
        有{{num}}位女神为他着迷。
    </h2>
</div>
<script src="vue-2.5.17.js"></script>
<script type="text/javascript">
    // 生成一个Vue实例
    var app = new Vue({
        el:"#app", // el,即element。要渲染的的页面元素
        data:{ // 数据
            name:"奇哥",
            num:1
        }
    })
</script>
  • 我们在data添加了新的属性:num
  • 在页面中有一个input元素,通过v-model与num进行绑定。
  • 同时通过{{num}}在页面输出

在这里插入图片描述
我们可以观察到,输入框的变化引起了data中的num的变化,同时页面输出也跟着变化。

  • input与num绑定,input的value值变化,影响到了data中的num值
  • 页面{{num}}与数据num绑定,因此num值变化,引起了页面效果变化。

没有任何dom操作,这就是双向绑定的魅力。
3.3.4.事件处理
我们在页面添加一个按钮:

<input type="button" value="+" v-on:click="num++">
<input type="button" value="-" v-on:click="num--">
  • 这里用v-on指令绑定点击事件,而不是普通的onclick,然后直接操作num
  • 普通click是无法直接操作num的。

效果:
在这里插入图片描述

<think>我们正在处理一个关于Vue 3项目案例分析的请求。用户希望学习Vue 3的基础项目案例和实现方法。根据提供的引用,我们可以构建一个简单的项目案例,例如一个显示人员信息的列表,并允许进行一些交互(如计数)。 我们将创建一个简单的Vue 3项目,包含以下部分: 1. 创建一个Vue组件(例如Person.vue)来显示人员信息。 2. 在App.vue中使用这个组件,并传递人员列表数据。 3. 使用组合式API(setup语法糖)和响应式数据。 步骤: 1. 创建Person.vue组件:用于显示单个人员的信息,并包含一个计数器(参考引用[3]的计数器例子)。 2. 在App.vue中引入Person组件,并传递一个人员列表(参考引用[2])。 3. 使用响应式数据(reactive或ref)来管理状态。 注意:引用[1]和[3]提供了组件的基本结构,引用[2]提供了传递props的方法,引用[4]提到了路由,但用户当前需求是基础项目案例,我们先不考虑路由。 下面我们分别创建两个组件:App.vue和Person.vue。 首先,创建Person.vue组件: 这个组件接收一个person对象作为prop,并显示该对象的属性。同时,我们为每个人员添加一个计数器(类似引用[3]的计数器)。 然后,在App.vue中,我们定义人员列表(使用reactive),并通过v-for循环渲染多个Person组件。 此外,我们还可以添加一些样式。 具体代码实现如下:</think>### Vue 3 基础项目案例:人员信息管理系统 下面通过一个完整的项目案例(人员信息展示+交互功能)讲解 Vue 3 的核心实现方法,包含组件化开发、响应式数据、Props 传参等关键技术点。 --- #### 1. **项目结构** ```bash src/ ├── components/ │ ├── PersonCard.vue # 人员卡片组件 │ └── CounterButton.vue # 计数器组件 ├── types/ │ └── person.ts # 类型定义 ├── App.vue # 主组件 └── main.ts # 入口文件 ``` --- #### 2. **核心组件实现** ##### (1) 类型定义 (`src/types/person.ts`) ```typescript export interface Person { id: string; name: string; age: number; } ``` ##### (2) 人员卡片组件 (`src/components/PersonCard.vue`) ```vue <template> <div class="person-card"> <!-- 接收父组件传递的 person 对象 --> <h3>{{ person.name }}</h3> <p>ID: {{ person.id }}</p> <p>年龄: {{ person.age }}</p> <!-- 使用子组件并传递响应式数据 --> <CounterButton :initialCount="person.age" @count-change="handleCountChange"/> </div> </template> <script setup lang="ts"> import { defineProps, defineEmits } from 'vue'; import type { Person } from '../types/person'; import CounterButton from './CounterButton.vue'; // 定义接收的Props const props = defineProps<{ person: Person }>(); // 定义自定义事件 const emit = defineEmits(['update-age']); const handleCountChange = (newCount: number) => { // 触发事件通知父组件更新年龄 emit('update-age', props.person.id, newCount); }; </script> <style scoped> .person-card { border: 1px solid #ddd; padding: 15px; margin: 10px; border-radius: 8px; } </style> ``` ##### (3) 计数器组件 (`src/components/CounterButton.vue`) ```vue <template> <div> <button @click="decrement">-</button> <span>{{ count }}</span> <button @click="increment">+</button> </div> </template> <script setup lang="ts"> import { ref, defineProps, defineEmits, watch } from 'vue'; // 接收初始值 const props = defineProps<{ initialCount: number }>(); // 响应式数据 const count = ref(props.initialCount); // 自定义事件 const emit = defineEmits(['count-change']); // 方法 const increment = () => count.value++; const decrement = () => count.value > 0 && count.value--; // 监听变化并通知父组件 watch(count, (newVal) => { emit('count-change', newVal); }); </script> ``` ##### (4) 主组件 (`src/App.vue`) ```vue <template> <div class="app"> <h1>人员信息管理系统</h1> <div v-for="p in persons" :key="p.id"> <!-- 传递person对象并监听更新事件 --> <PersonCard :person="p" @update-age="updateAge" /> </div> </div> </template> <script setup lang="ts"> import { reactive } from 'vue'; import PersonCard from './components/PersonCard.vue'; import type { Person } from './types/person'; // 响应式数据 const persons = reactive<Person[]>([ { id: '001', name: '张三', age: 25 }, { id: '002', name: '李四', age: 30 }, { id: '003', name: '王五', age: 28 } ]); // 更新年龄的方法 const updateAge = (id: string, newAge: number) => { const target = persons.find(p => p.id === id); if (target) target.age = newAge; }; </script> ``` --- #### 3. **关键技术解析** 1. **组件通信** - 父 → 子:通过 `props` 传递数据(如 `:person="p"`) - 子 → 父:通过 `自定义事件`(如 `@update-age` + `emit`) - 类型安全:使用 TypeScript 接口定义 Props 2. **响应式数据** - 对象数据:`reactive` 创建深层响应式对象 - 基础类型:`ref` 创建响应式引用(如计数器) - 自动更新:修改数据后视图自动刷新 3. **组合式 API** - `setup` 语法糖:简化代码结构 - 逻辑复用:将计数器功能封装为独立组件 4. **样式隔离** - `<style scoped>` 确保组件样式不污染全局 --- #### 4. **项目效果** - 每个人员卡片显示独立信息 - 点击 +/- 按钮修改年龄 - 年龄数据实时同步到父组件 - 响应式布局适配不同设备 --- ### 相关问题 1. Vue 3 中 `reactive` 和 `ref` 的使用场景有何区别? 2. 如何在 Vue 3 项目中实现全局状态管理(如 Pinia)? 3. Vue 3 的 Teleport 组件如何优化模态框实现? 4. 如何用 Vue Router 实现这个项目的页面路由切换?[^4] [^1]: 组件化开发是 Vue 的核心特性,每个 `.vue` 文件包含模板、逻辑和样式 [^2]: 使用 TypeScript 接口能增强代码的可靠性和可维护性 [^3]: 组合式 API 使逻辑关注点更集中,便于复用 [^4]: Vue Router 通过路由规则映射组件实现页面切换
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值