Vue3 + Vite:从入门到实战——核心指令全解析

Vue3 + Vite:从入门到实战------核心指令全解析

Vue3+Vite 从入门到实战:脚手架搭建与核心指令全解析

在 Vue 开发中,高效的开发环境和灵活的指令系统是提升开发效率的关键。本文将从 Vue 工程化开发环境搭建入手,详细讲解 Vue3+Vite 脚手架的使用,再深入剖析 Vue 核心指令的用法,并结合实战案例帮助大家快速上手,无论是前端新手还是有一定经验的开发者,都能从中收获实用的知识。

一、Vue 开发方式对比:传统 vs 工程化

1. 传统开发方式

传统开发方式直接通过 <script src="vue.js"></script> 引入 Vue 源码,类似 jQuery 的使用方式,项目结构简单,只有 HTML、CSS、JS 几个核心文件。这种方式的优点是上手快、门槛低,适合快速验证简单需求,但缺点也十分明显:功能单一,无法实现模块化开发;开发体验差,缺乏热更新、语法提示等便捷功能,难以应对复杂项目的开发需求。

2. 工程化开发方式

工程化开发是 Vue 官方推荐的方式,也是企业实际开发中采用的主流方案。它基于 Vite 或 Webpack 等构建工具,项目结构更规范,包含 node_modules(第三方依赖)、src(源代码)、public(公共资源)等目录,还有 package.json(项目管理文件)、vite.config.js(构建配置文件)等核心文件。

工程化开发的优势在于:

  • 功能全面:支持模块化、组件化开发,可集成路由、状态管理等工具;

  • 开发体验好:提供热更新、语法检查、代码提示等功能,大幅提升开发效率。

当然,它也有一定的学习成本,目录结构相对复杂,需要理解构建工具的基本原理,但一旦掌握,将极大地提升开发效率和项目可维护性。

二、Vue3+Vite 工程化环境搭建

要使用工程化方式开发 Vue 项目,首先需要搭建对应的开发环境,步骤如下:

1. 安装核心工具

(1)安装 Node.js

Vue 工程化开发依赖 Node.js 环境,推荐安装 18.3 或更高版本。

  • 官网下载:https://nodejs.org/en/

  • 安装流程:双击安装程序,按提示完成安装,最后通过命令行输入 node -vnpm -v 验证安装是否成功。

(2)npm 换源

默认的 npm 官方源下载速度较慢,建议切换为国内淘宝源,提升依赖下载速度:

Bash 复制代码
# 查看当前 npm 源
npm config get registry
# 切换为淘宝源
npm config set registry https://registry.npmmirror.com
# 再次查看源是否切换成功
npm config get registry
(3)安装包管理工具

除了 npm,还可以安装 yarn 或 pnpm(性能优于 npm),用于更高效地管理项目依赖:

Bash 复制代码
# Windows 系统
npm install yarn -g
npm install pnpm -g

# Mac 系统
sudo npm install yarn -g
sudo npm install pnpm -g

# 验证安装成功
yarn -v
pnpm -v

2. 创建 Vue 工程化项目

使用 Vue 官方脚手架工具 create-vue 快速创建项目,步骤如下:

  1. 选择项目存放目录(如桌面、D 盘等),打开命令行进入该目录;

  2. 执行创建命令:npm create vue@latest,按提示输入项目名称、是否安装 TypeScript、ESLint 等(新手可暂时选择"No",后续按需添加);

  3. 进入项目根目录:cd 项目名称

  4. 安装项目依赖:npm i(或 yarn installpnpm install);

  5. 启动项目:npm run dev,会自动开启本地服务器;

  6. 浏览器访问 http://localhost:5173,若看到 Vue 欢迎页面,说明项目创建并启动成功。

3. 认识脚手架目录结构

创建成功后,项目目录结构如下(核心文件说明):

  • node_modules:存放第三方依赖包,无需手动修改;

  • public:公共资源目录,如网页图标 favicon.ico

  • src:源代码目录,所有业务代码都在这里编写,包含:

    • assets:静态资源(图片、字体等);

    • components:公共组件;

    • App.vue:Vue 根组件,是所有组件的入口;

    • main.js:项目打包入口,用于创建 Vue 应用并挂载到页面;

  • package.json:项目管理文件,记录项目名称、依赖、脚本命令等;

  • vite.config.js:Vite 构建配置文件;

  • index.html:项目入口网页,Vue 应用最终会挂载到该页面的 #app 元素上。

核心文件关系App.vue(Vue 入口)→ main.js(打包入口)→ index.html(浏览器入口),其中 main.js 是连接 Vue 代码和网页的桥梁,核心代码如下:

JavaScript 复制代码
import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')

三、Vue 单文件组件(SFC)

Vue 推荐使用 .vue 后缀的单文件组件(SFC)开发项目,一个 .vue 文件包含三个核心部分,结构清晰且作用域独立:

Plain 复制代码
<script setup></script>
<template>
  <!-- HTML 结构 -->
</template>
<style scoped></style>

各部分说明

  1. <script setup>:编写 JS 逻辑,setup 是 Vue3 推荐的简写形式,无需手动导出组件,变量和函数可直接在模板中使用;

  2. <template>:编写 HTML 结构,支持 Vue 模板语法(如插值、指令等);

  3. <style scoped>:编写 CSS 样式,scoped 属性可保证样式只作用于当前组件,避免样式冲突。

单文件组件的优势

  • 结构清晰:HTML、CSS、JS 集中在一个文件中,便于维护;

  • 作用域独立:避免变量名、样式选择器冲突;

  • 支持模块化:可通过 import 导入其他组件或依赖,实现组件复用。

四、Vue 核心指令详解

指令是 Vue 提供的带有 v- 前缀的特殊标签属性,用于增强标签功能,简化 DOM 操作。Vue3 中的常用指令可分为 6 大类,下面结合代码示例详细讲解:

1. 内容渲染指令(v-text、v-html)

作用:将数据渲染到 DOM 元素的文本内容中。

  • v-text:类似 innerText,不解析 HTML 标签,会覆盖元素原有内容;

  • v-html:类似 innerHTML,会解析 HTML 标签,同样覆盖元素原有内容。

代码示例:

Plain 复制代码
<script setup>
import { ref } from 'vue'
const str = ref('<span style="color:red;">Hello Vue3+Vite</span>')
</script>
<template>
  <div>
    <!-- 不解析标签,显示原始字符串 -->
    <p v-text="str"></p>
    <!-- 解析标签,显示红色文本 -->
    <p v-html="str"></p>
  </div>
</template>

2. 属性绑定指令(v-bind)

作用:将 Vue 表达式的结果与标签属性动态绑定,语法可简写为 :

代码示例:

Plain 复制代码
<script setup>
import { ref } from 'vue'
const url = ref('http://www.baidu.com')
</script>
<template>
  <!-- 完整写法 -->
  <a v-bind:href="url">百度一下(完整写法)</a>
  <!-- 简写(推荐) -->
  <a :href="url">百度一下(简写)</a>
  <!-- 图片地址绑定 -->
  <img :src="imgUrl" alt="示例图片" />
</template>

3. 事件绑定指令(v-on)

作用:给元素绑定 DOM 事件,语法可简写为 @,支持内联语句、无参函数、有参函数三种写法。

代码示例:

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

// 无参函数
const increase = () => {
  count.value++
}

// 有参函数
const add = (n) => {
  count.value += n
}
</script>
<template>
  <p>当前计数:{{ count }}</p>
  <!-- 内联语句 -->
  <button @click="count++">+1(内联)</button>
  <!-- 无参函数 -->
  <button @click="increase">+1(无参)</button>
  <!-- 有参函数 -->
  <button @click="add(3)">+3</button>
</template>

4. 条件渲染指令(v-show、v-if、v-else、v-else-if)

作用:控制元素的显示与隐藏,核心区别在于实现原理和适用场景。

指令 原理 适用场景
v-show 切换 CSS 的 display 属性 频繁切换显示隐藏的场景
v-if 动态创建或移除 DOM 元素 不频繁切换的场景
v-else 辅助 v-if 实现双分支 必须紧跟 v-if 之后
v-else-if 辅助 v-if 实现多分支 必须紧跟 v-if 或 v-else-if 之后
代码示例:
Plain 复制代码
<script setup>
import { ref } from 'vue'
const visible = ref(true) // 控制显示隐藏
const isLogin = ref(true) // 模拟登录状态
const score = ref(85) // 模拟成绩
</script>
<template>
  <!-- v-show 控制显示隐藏 -->
  <div v-show="visible" style="width: 100px; height: 100px; background: red;"></div>
  
  <!-- 双分支条件渲染 -->
  <div v-if="isLogin">欢迎回来!</div>
  <div v-else>请登录~</div>
  
  <!-- 多分支条件渲染 -->
  <div v-if="score >= 90">优秀</div>
  <div v-else-if="score >= 70">良好</div>
  <div v-else>及格</div>
</template>

5. 列表渲染指令(v-for)

作用:基于数组、对象或数字循环生成列表,语法为 v-for="(item, index) in 目标数据"

支持的目标数据
  • 数组:item 为数组元素,index 为索引(可选);

  • 对象:v-for="(value, key, index) in 对象"value 为属性值,key 为属性名;

  • 数字:v-for="(item, index) in 5",循环 5 次,item 从 1 开始。

代码示例:

Plain 复制代码
<script setup>
import { ref } from 'vue'
// 数组
const goodsList = ref([
  { id: 1, name: '篮球', price: 299 },
  { id: 2, name: '足球', price: 99 },
  { id: 3, name: '排球', price: 199 }
])
// 对象
const user = ref({ name: '小明', age: 18, gender: '男' })
</script>
<template>
  <!-- 循环数组 -->
  <div v-for="(item, index) in goodsList" :key="item.id">
    <p>商品:{{ item.name }},价格:{{ item.price }},索引:{{ index }}</p>
  </div>
  
  <!-- 循环对象 -->
  <div v-for="(value, key) in user" :key="key">
    <p>{{ key }}:{{ value }}</p>
  </div>
  
  <!-- 循环数字 -->
  <div v-for="item in 3" :key="item">
    <p>第 {{ item }} 条数据</p>
  </div>
</template>
关键注意点:key 属性
  • 作用:给列表项添加唯一标识,帮助 Vue 高效复用 DOM 元素,提升列表更新性能;

  • 要求:key 的值必须是唯一的(数字或字符串),推荐使用数据的唯一 ID(如 item.id),不推荐使用 index(索引会随数据变化而变化,失去优化意义)。

6. 双向绑定指令(v-model)

作用:实现表单元素(input、select、checkbox 等)与响应式数据的双向绑定------数据变化时视图自动更新,视图变化时数据也自动同步。

代码示例(登录表单):

Plain 复制代码
<script setup>
import { reactive } from 'vue'
// 响应式表单对象
const loginForm = reactive({
  username: '',
  password: ''
})

// 登录逻辑
const login = () => {
  console.log('登录信息:', loginForm)
  // 这里可添加接口请求等逻辑
}

// 重置表单
const reset = () => {
  loginForm.username = ''
  loginForm.password = ''
}
</script>
<template>
  <div class="login-box">
    账户:<input type="text" v-model="loginForm.username" /><br /><br />
    密码:<input type="password" v-model="loginForm.password" /><br /><br />
    <button @click="login">登录</button>
    <button @click="reset">重置</button>
  </div>
</template>

五、实战案例:代办任务列表(Todos)

结合上述指令,我们实现一个经典的代办任务列表,包含"添加任务、删除任务、统计任务数量、清空所有任务"功能。

完整代码

Plain 复制代码
<script setup>
import { ref } from 'vue'
// 代办任务列表(id 用时间戳保证唯一)
const todoList = ref([
  { id: Date.now() - 2000, name: '吃饭饭', finished: false },
  { id: Date.now() - 1000, name: '睡觉觉', finished: true },
  { id: Date.now(), name: '打豆豆', finished: false }
])
// 新增任务输入框绑定
const newTodo = ref('')

// 添加任务
const addTodo = () => {
  const taskName = newTodo.value.trim()
  if (!taskName) {
    alert('任务名称不能为空!')
    return
  }
  todoList.value.push({
    id: Date.now(),
    name: taskName,
    finished: false
  })
  newTodo.value = '' // 清空输入框
}

// 删除任务
const deleteTodo = (index) => {
  if (window.confirm('确定要删除该任务吗?')) {
    todoList.value.splice(index, 1)
  }
}

// 清空所有任务
const clearAll = () => {
  if (window.confirm('确定要清空所有任务吗?')) {
    todoList.value = []
  }
}
</script>
<template>
  <section class="todoapp">
    <header class="header">
      <h1>todos</h1>
      <input
        class="new-todo"
        placeholder="What needs to be done?"
        v-model="newTodo"
        @keydown.enter="addTodo"
        autofocus
      />
    </header>
    <section class="main" v-if="todoList.length">
      <ul class="todo-list">
        <li v-for="(item, index) in todoList" :key="item.id">
          <div class="view">
            <label>{{ item.name }}</label>
            <button class="destroy" @click="deleteTodo(index)"></button>
          </div>
        </li>
      </ul>
    </section>
    <footer class="footer" v-if="todoList.length">
      <span class="todo-count"><strong>{{ todoList.length }}</strong> item all</span>
      <button class="clear-completed" @click="clearAll">Clear all</button>
    </footer>
  </template>
  <style scoped>
  /* 此处可引入官方 TodoMVC 样式,或自定义样式 */
  .todoapp {
    width: 500px;
    margin: 50px auto;
    font-family: Arial, sans-serif;
  }
  .new-todo {
    width: 100%;
    padding: 10px;
    font-size: 16px;
    border: 1px solid #ccc;
    border-radius: 4px;
  }
  .todo-list {
    list-style: none;
    padding: 0;
  }
  .todo-list li {
    padding: 10px;
    border-bottom: 1px solid #eee;
    display: flex;
    justify-content: space-between;
    align-items: center;
  }
  .destroy {
    background: transparent;
    border: none;
    color: #ff4444;
    cursor: pointer;
  }
  .footer {
    padding: 10px;
    text-align: center;
    color: #666;
  }
  </style>
</template>

功能说明

  1. 添加任务:在输入框中输入任务名称,按回车键即可添加到列表;

  2. 删除任务:点击任务右侧的删除按钮,确认后删除该任务;

  3. 统计数量:底部显示当前任务总数;

  4. 清空任务:点击"Clear all"按钮,确认后清空所有任务。

六、总结

本文从 Vue 开发方式对比入手,详细讲解了 Vue3+Vite 工程化环境的搭建流程,深入剖析了 6 大类核心指令的用法,并通过实战案例将指令应用到实际开发中。

核心要点回顾:

  1. 工程化开发是 Vue 项目的主流方案,借助 Vite 可获得更好的开发体验;

  2. 脚手架工具 create-vue 能快速创建规范的项目结构,核心文件 main.jsApp.vueindex.html 各司其职;

  3. Vue 指令是简化 DOM 操作的关键,v-bindv-onv-forv-model 是日常开发中使用频率最高的指令,需熟练掌握;

  4. 单文件组件(SFC)的 scoped 属性和 v-forkey 属性,能有效避免冲突、提升性能。

后续还可以学习 Vue 的组件通信、路由、状态管理等高级内容,进一步提升 Vue 开发能力。希望本文能帮助大家快速入门 Vue3+Vite 开发,在实际项目中灵活运用所学知识!

相关推荐
静小谢2 小时前
vue3实现语言切换vue-i18n
前端·javascript·vue.js
东东5162 小时前
资产管理信息系统ssm+vue
前端·javascript·vue.js
利刃大大2 小时前
【Vue】声明式导航与传参 && 编程式导航与传参 && 嵌套与守卫
javascript·vue.js·ecmascript
东东5164 小时前
基于ssm的网上房屋中介管理系统vue
前端·javascript·vue.js
harrain5 小时前
什么!vue3.4开始,v-model不能用在prop上
前端·javascript·vue.js
经年未远14 小时前
vue3中实现耳机和扬声器切换方案
javascript·学习·vue
刘一说14 小时前
Vue 组件不必要的重新渲染问题解析:为什么子组件总在“无故”刷新?
前端·javascript·vue.js
fanruitian15 小时前
uniapp 创建项目
javascript·vue.js·uni-app
刘一说15 小时前
Vue 导航守卫未生效问题解析:为什么路由守卫不执行或逻辑失效?
前端·javascript·vue.js