Code前端首页关于Code前端联系我们

选框架,上下箭头选Vue 选语言,选JavaScript(新手优先)

terry 2周前 (10-01) 阅读数 47 #Vue
文章标签 Vue JavaScript

想学Vue3却不知道从哪开始?别慌!这篇问答式文章把Vue3入门的关键问题一个个拆解,从概念到实操,帮你一步步搭建知识框架,不管是刚接触前端的新手,还是想从Vue2过渡的开发者,看完心里都能有清晰的学习路径~

Vue3和Vue2有啥核心区别?先搞懂升级点再学更高效

Vue3不是简单的“版本号升级”,核心设计和开发体验都有变化,先理清差异能少走弯路:

  • 代码组织逻辑变了:Vue2用“选项式API”,把data methods computed拆成不同配置项;Vue3主推“组合式API”,能把同一功能的逻辑(比如获取数据、处理事件、监听变化)集中写在setup里,像给代码“按功能分组”,大型组件维护时不用来回翻配置项。
  • 响应式原理更高效:Vue2靠Object.defineProperty实现响应式,但对对象新增属性、数组长度修改支持不好;Vue3换成Proxy,能直接监听对象/数组的所有操作,还能减少不必要的性能消耗(比如不需要递归遍历对象所有属性)。
  • 编译过程更聪明:Vue3对模板编译做了优化,静态提升”——把不变化的元素(像固定的标题、图标)提前缓存,更新时跳过;还有“patchFlags”给动态元素打标记,只更新需要变的部分,页面渲染速度更快。
  • 语法糖更顺手:Vue3推出setup语法糖(加<script setup>),不用写export defaultsetup()函数,还能通过defineProps defineEmits直接处理组件通信,代码量少了一大截。

零基础学Vue3,必须先掌握哪些基础概念?

先把“地基”打牢,后续学复杂功能才不会晕,这几个核心概念是入门关键:

  • 组件化思想:Vue里一切都是组件,比如页面头部是Header组件、按钮是Button组件,组件能复用(一个按钮组件在多个页面用)、能嵌套(页面组件里包含列表组件),写组件时用“单文件组件”格式:一个.vue文件里放<template>(写结构)、<script>(写逻辑)、<style>(写样式)。
  • 响应式数据:Vue3用refreactive让数据“变了自动更页面”。ref适合存数字、字符串这些“基本类型”,比如const count = ref(0)reactive适合存对象/数组,比如const user = reactive({ name: '张三' }),修改时,ref要加.value(JS里),reactive直接改属性(比如user.name = '李四')。
  • 模板语法:Vue模板里的“特殊语法”得吃透:
    • 插值:{{ 变量 }}能把数据渲染到页面;
    • 指令:v-bind:xxx(简写)绑定属性,v-on:xxx(简写)绑定事件,v-if控制元素显隐,v-for循环渲染列表;
    • 修饰符:比如@click.stop阻止事件冒泡,v-model.lazy让输入框失焦后再更新数据。
  • 生命周期钩子:组件从“创建”到“销毁”有一系列阶段,Vue3里用组合式API的钩子函数,比如onMounted(组件渲染完执行)、onUpdated(数据更新后执行),记住钩子要从vue里导入,比如import { onMounted } from 'vue',再在setup里调用。

学Vue3一定要先学TypeScript吗?技术栈怎么选更务实?

很多人纠结“Vue3和TS绑定”,其实不是必须,但得看学习节奏和项目场景:

  • Vue3对TS更友好,但不是强制:Vue3的源码用TS重写,defineProps能直接写类型约束(比如defineProps<{ title: string }>()),refreactive也能自动推导类型,但如果是纯新手,先学透JavaScript基础(变量、函数、数组、对象、异步操作),再碰Vue3更稳——不然同时学“语法+类型”容易 overwhelm( overwhelm: overwhelm 是“压垮”的意思,这里指同时学太多容易崩溃 )。
  • 学习路径建议:新手阶段用JavaScript写Vue3项目,先把组件通信、路由、状态管理这些逻辑搞通;等对Vue3熟练了,再学TS(重点学类型定义、接口、泛型),此时看TS版的项目代码会更顺。
  • 项目场景决定技术栈:做个人小项目、简单官网,JavaScript足够;如果是团队协作的中大型项目(比如后台管理系统),TS能减少类型错误,让代码更规范,这时学TS是加分项。

想快速做个小项目练手,Vue3实战步骤该咋走?

光看理论没用,动手做个“TodoList”“简易博客”这类小项目,才能把知识串起来,分享一套新手友好的实战流程:

环境搭建:用Vite创建项目

Vue3推荐用Vite当脚手架(比Webpack启动快N倍),打开命令行,依次输入:

npm create vite@latest  # 回车后输入项目名(比如my-vue3-app)cd my-vue3-app   # 进入项目文件夹
npm install      # 安装依赖
npm run dev      # 启动项目,浏览器打开http://127.0.0.1:5173/ 就能看到初始页面

项目结构解析:先看懂src目录

  • assets:放图片、样式这类静态资源;
  • components:存可复用的组件(比如Button.vue Card.vue);
  • router:配置路由(页面跳转规则);
  • store:用Pinia做状态管理(代替Vue2的Vuex);
  • views:存页面级组件(比如HomeView.vue AboutView.vue);
  • App.vue:根组件,负责组装页面;
  • main.js:项目入口,创建Vue应用并挂载。

写第一个组件:用setup语法糖

打开components文件夹,新建MyButton.vue

<template>
  <button @click="handleClick">{{ btnText }}</button>
</template>
<script setup>
import { ref } from 'vue'
// 定义响应式数据
const btnText = ref('点击我')
// 定义事件函数
const handleClick = () => {
  btnText.value = '已点击'
}
</script>
<style scoped>
button {
  padding: 8px 16px;
  background: #42b983;
  color: white;
  border: none;
}
</style>

然后在App.vue里引入这个组件,就能在页面看到按钮,点击后文字变化~

组件通信:父传子、子传父

  • 父传子:用defineProps,比如父组件Parent.vue给子组件传标题:

    <!-- 父组件 -->
    <template>
      <Child :title="parentTitle" />
    </template>
    <script setup>
    import Child from './Child.vue'
    const parentTitle = ref('我是父组件传的标题')
    </script>
    <!-- 子组件Child.vue -->
    <template>
      <h2>{{ title }}</h2>
    </template>
    <script setup>
    const props = defineProps(['title']) // 或用类型约束 defineProps<{ title: string }>()
    </script>
  • 子传父:用defineEmits,子组件触发事件,父组件监听:

    <!-- 子组件 -->
    <template>
      <button @click="sendMsg">传消息给父组件</button>
    </template>
    <script setup>
    const emit = defineEmits(['send'])
    const sendMsg = () => {
      emit('send', '子组件的消息')
    }
    </script>
    <!-- 父组件 -->
    <template>
      <Child @send="handleSend" />
    </template>
    <script setup>
    import Child from './Child.vue'
    const handleSend = (msg) => {
      console.log(msg) // 打印“子组件的消息”
    }
    </script>

路由配置:用Vue Router 4

先装路由:npm install vue-router@4,然后在router文件夹新建index.js

import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'
import AboutView from '../views/AboutView.vue'
const router = createRouter({
  history: createWebHistory(),
  routes: [
    { path: '/', name: 'home', component: HomeView },
    { path: '/about', name: 'about', component: AboutView }
  ]
})
export default router

再在main.js里引入并使用路由:

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
createApp(App).use(router).mount('#app')

最后在App.vue里加路由出口和导航:

<template>
  <div>
    <router-link to="/">首页</router-link> | 
    <router-link to="/about">lt;/router-link>
    <router-view></router-view> <!-- 路由组件渲染的地方 -->
  </div>
</template>

状态管理:用Pinia替代Vuex

装Pinia:npm install pinia,在store文件夹新建index.js

import { createPinia } from 'pinia'
const store = createPinia()
export default store

然后定义一个“计数器”Store,新建counter.js

import { defineStore } from 'pinia'
export const useCounterStore = defineStore('counter', {
  state: () => ({ count: 0 }),
  actions: {
    increment() {
      this.count++
    }
  }
})

在组件里使用Store:

<template>
  <div>
    <p>计数:{{ count }}</p>
    <button @click="increment">+1</button>
  </div>
</template>
<script setup>
import { useCounterStore } from '../store/counter'
const store = useCounterStore()
// 解构响应式数据(需要用storeToRefs保持响应式)
import { storeToRefs } from 'pinia'
const { count } = storeToRefs(store)
const { increment } = store
</script>

学Vue3遇到报错咋排查?常见坑点和解决思路

新手写代码必遇报错,掌握排查逻辑比死记解法更重要:

  • “ref没加.value导致数据不更新”
    场景:在setup的JS逻辑里改ref定义的变量,忘了加.value
    解决:ref在JS里是“包装对象”,改值必须用xxx.value = 新值;但模板里不用加,Vue会自动解包。

  • “v-for和v-if一起用导致渲染异常”
    场景:想循环列表同时隐藏某些项,直接在同一元素用v-forv-if
    问题:Vue3里v-if优先级比v-for高,会导致循环变量找不到。
    解决:把v-if放到外层元素(比如用<template>包起来),或用计算属性先过滤数据再循环。

  • “响应式数据突然‘失效’”
    场景:给reactive定义的对象直接赋值(比如user = { name: '新名字' }),导致失去响应式。
    原因:reactive只能代理“初始对象”,直接替换整个对象会切断响应式连接。
    解决:用ref包对象(改值用user.value = 新对象),或用Object.assign修改属性(比如Object.assign(user, { name: '新名字' }))。

  • “路由/Store导入报错”
    场景:用useRouteruseStore时,导入路径错了。
    解决:路由要从vue-router导入(import { useRouter } from 'vue-router'),Pinia的useStore要从自己定义的Store文件导入(比如import { useCounterStore } from '../store/counter')。

学完基础后,怎么深入进阶?这些方向值得关注

Vue3入门后,想往“高手”走,得拓展生态和实战场景:

  • 生态工具链

    • Nuxt3:基于Vue3的服务端渲染(SSR)框架,适合做SEO友好的官网、博客;
    • VueUse:前端常用工具集合(比如剪贴板、本地存储、动画 hooks),一行代码实现复杂功能;
    • Naive UI/Element Plus:基于Vue3的UI组件库,快速搭页面。
  • 性能优化

    • <Suspense>实现异步组件加载(比如页面分块加载,减少首屏时间);
    • defineAsyncComponent做组件懒加载(打包时拆分代码,访问时再加载);
    • <Teleport>把组件渲染到任意DOM节点(比如弹窗渲染到body下,避免样式冲突)。
  • 自定义能力
    自定义指令(比如v-focus让输入框自动聚焦)、Vue插件(封装复用逻辑,像全局Toast组件),理解Vue的底层渲染逻辑(比如虚拟DOM、渲染器原理)。

  • 前后端结合
    学Axios或Vue Router的导航守卫,实现接口请求、权限控制;再结合Node.js(Express/NestJS)或Java(Spring Boot)写后端接口,做完整的前后端分离项目。

最后提醒:Vue官方文档是“终极权威”,遇到模糊的知识点,直接翻文档最靠谱,学习过程中多写 Demo、多改别人的开源项目(比如GitHub搜“vue3 demo”),遇到问题先看控制台报错、查社区(比如Stack Overflow、掘金),慢慢就会从“懵圈”到“顺手”~

(全文约1800字,覆盖Vue3入门到进阶的核心问题,实操步骤和避坑思路都给到位啦,跟着走就能逐步上手~)

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门