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

Vue3难学吗?零基础能不能直接上手?完整入门指南看这篇就够了

terry 1小时前 阅读数 24 #Vue
文章标签 Vue3入门指南

很多前端新手刚接触框架,都会在Vue2和Vue3之间纠结,最常问的就是上面这两个问题,其实不用太纠结,Vue3是基于Vue2的核心设计思路重构的,学习曲线反而因为API的优化更平滑,零基础完全可以直接从Vue3开始,甚至还能少走不少学完Vue2再转Vue3要改习惯的弯路,接下来就用问答的方式,把Vue3入门的核心内容给大家理清楚,包括为什么选Vue3、环境怎么搭、核心语法怎么用、怎么上手做小项目,还有入门后可以怎么提升。

Vue3比Vue2好在哪里?新手直接学会不会吃亏?

首先说会不会吃亏——不会,现在Vue官方已经把Vue3作为默认推荐的版本了,不管是文档、社区资源还是新出的UI组件库,都优先支持Vue3,未来的新特性也只会更新在Vue3里,所以直接学Vue3才是紧跟潮流的选择。

那它比Vue2好在哪里呢?新手虽然暂时用不上所有新特性,但有几个点对你入门后的体验和学习进阶非常重要: 第一,性能更快,Vue3的底层用Proxy替换了Vue2的Object.defineProperty来做响应式,监听数据的范围从“对象的已存在属性”扩展到了“整个对象、数组的索引和长度变化、新增删除属性”,不用再像Vue2那样要手动用$set、$delete这些方法,而且整体渲染速度和内存占用都有20%-50%的提升,具体的优化细节后面如果用到深一点的东西再提,但对新手来说,“不用管响应式边界情况”这一点就省了很多麻烦。 第二,API更灵活,代码组织更清晰,Vue2的Options API虽然上手简单,但代码量大了之后,逻辑会分散在data、methods、computed、watch这些选项里,找一个功能的相关代码要上下翻半天;Vue3新增了Composition API,可以把同一个功能的代码逻辑(比如获取数据、处理分页、监听搜索词)都放在一起,复用性也更强,不用再靠mixin搞容易冲突的逻辑复用,这对后期做稍复杂的项目帮助很大,而且你入门的时候可以先学简单的写法,等习惯了再慢慢用Composition API。 第三,TypeScript支持更原生,虽然JavaScript足够入门,但现在大厂招聘前端基本都要求会TypeScript了,Vue3从底层就是用TypeScript写的,类型提示非常完善,用起来不会像Vue2加TS那样要写很多额外的配置和声明,入门后期如果想转TS,会轻松很多。 第四,生态更完善,像新出的Element Plus、Ant Design Vue 3.x、Vant 4.x这些主流UI组件库,都只支持Vue3了;还有Vite这个新一代的构建工具,和Vue3的配合非常丝滑,开发环境启动速度能快几十倍甚至上百倍,不用像用Webpack搭Vue2那样等半天才能看到效果,对新手调试来说体验特别好。

零基础学Vue3,需要先掌握哪些前置知识?

不用太担心,Vue3的门槛其实不高,但你得先有一点点前端基础,不然连基本的HTML、CSS、JS都看不懂,肯定没法上手,具体需要掌握的前置知识有这几个: HTML:知道常用的标签(比如div、p、span、button、input这些)怎么用,能写出简单的页面结构就行。 CSS:知道基本的选择器(类选择器、id选择器、标签选择器),能写简单的布局(比如flex布局、盒子模型),不需要会太复杂的动画或者兼容性处理,这些可以后面慢慢补。 JavaScript:这部分稍微重要一点,但也不用学得太深入,掌握ES5的基本语法(变量、函数、数组、对象),ES6的核心语法(箭头函数、let/const、模板字符串、解构赋值、数组的map/filter/find这些方法、Promise的基本用法)就行,更高级的ES6+或者ESNext语法可以在学Vue3的过程中遇到了再查。

零基础学Vue3,具体的学习顺序是什么?

很多新手一开始就去啃官方文档或者厚厚的书,结果越看越晕,其实入门Vue3不用那么复杂,按照下面的顺序一步步来,效果会好很多: 第一步,搭一个最简单的本地开发环境,先跑起来一个Hello World页面,建立信心。 第二步,学Vue3的基础语法,比如模板语法、数据绑定、事件处理、计算属性、侦听器这些。 第三步,学Vue3的组件系统,因为Vue是组件化开发的框架,组件是核心,要知道怎么定义组件、怎么传参、怎么处理父子组件的通信。 第四步,学Vue3的路由Vue Router和状态管理Pinia(注意,官方现在推荐用Pinia代替Vuex,因为Pinia更简单、更符合Vue3的Composition API风格,而且TypeScript支持更好)。 第五步,结合前面学的所有内容,做一个小项目,Todo List(待办事项清单)、个人博客首页、简易的电商商品展示页这些,不用太复杂,但要把核心知识点都用上。 第六步,入门之后,可以学一些进阶的内容,比如TypeScript、Vite的高级配置、Vue3的响应式原理、自定义指令、插槽、Teleport、Suspense这些新特性,还有单元测试、打包部署这些工程化的东西。

我们就先把前四步里最关键的内容讲清楚,让你看完就能动手写代码。

第一步:怎么搭Vue3的最简单开发环境?

新手入门的时候,不建议一开始就用CLI或者Vite搭复杂的项目,先用CDN引入的方式跑起来一个Hello World页面,熟悉一下Vue3的基本结构,这样不会被配置文件搞晕。 具体的做法很简单:

  1. 新建一个HTML文件,比如叫index.html。
  2. 在文件里引入Vue3的CDN链接,现在最新的稳定版可以直接找官方CDN或者UNPKG、jsdelivr的链接,注意要选带ESM的或者UMD的,UMD的更兼容旧浏览器,CDN引入的话用UMD的就行。
  3. 在body里写一个挂载点,比如
    ,Vue的内容都会渲染到这个div里。
  4. 写一个简单的Vue应用实例,挂载到刚才的div上,然后在模板里写Hello World,或者用数据绑定写一个动态的内容。

等你用CDN引入的方式熟悉了基本语法之后,再用Vite搭一个正式的项目,因为Vite的开发体验真的太好了,用Vite搭Vue3项目也很简单,只需要执行几个命令就行:

  1. 首先要确保你电脑上装了Node.js,而且版本要大于等于16,不然可能会报错,怎么装Node.js呢?直接去官网下载对应的安装包,一路下一步就行,装完之后打开终端(Windows用cmd或者PowerShell,Mac用终端),输入node -v和npm -v,如果能显示版本号,就说明装成功了。
  2. 然后在终端里进入你想存项目的文件夹,比如cd Desktop/vue3-project(注意路径要改成你自己的)。
  3. 执行npm create vite@latest,然后按照提示输入项目名称,选择Vue,再选择JavaScript或者TypeScript(新手选JavaScript就行),等待几秒钟,项目就创建好了。
  4. 进入项目文件夹,执行npm install安装依赖,然后执行npm run dev启动开发服务器,终端里会显示一个本地地址,比如http://localhost:5173,在浏览器里打开这个地址,就能看到Vite创建的默认Vue3页面了。

第二步:Vue3的核心基础语法有哪些?

接下来讲核心基础语法,这些都是写Vue3项目必须掌握的,不管是用CDN还是用Vite,语法都是一样的。

模板语法

Vue的模板语法是基于HTML的,你可以在HTML标签里直接写Vue的指令和插值表达式,来动态渲染页面。 插值表达式就是用双大括号{{ }}包裹的内容,它会把数据绑定到页面上,

<div id="app">
  <h1>{{ message }}</h1>
</div>
const app = Vue.createApp({
  data() {
    return {
      message: 'Hello Vue3!'
    }
  }
})
app.mount('#app')

这里的{{ message }}会被替换成data里的'Hello Vue3!',而且如果data里的message变了,页面上的内容也会自动更新,这就是Vue的响应式。

除了插值表达式,Vue还有很多常用的指令,指令都是以v-开头的,

  • v-bind:用来动态绑定HTML属性,比如class、style、src、href这些,v-bind可以简写为冒号:,
    <div id="app">
    <h1 v-bind:class="isRed ? 'red' : 'blue'">{{ message }}</h1>
    <!-- 或者简写为 -->
    <h1 :class="isRed ? 'red' : 'blue'">{{ message }}</h1>
    <img :src="imgSrc" alt="图片">
    </div>
    const app = Vue.createApp({
    data() {
      return {
        message: 'Hello Vue3!',
        isRed: true,
        imgSrc: 'https://example.com/image.jpg'
      }
    }
    })
    app.mount('#app')
  • v-on:用来绑定事件,比如点击事件、输入事件这些,v-on可以简写为@,
    <div id="app">
    <h1>{{ count }}</h1>
    <button v-on:click="increment">点击加1</button>
    <!-- 或者简写为 -->
    <button @click="increment">点击加1</button>
    <input @input="handleInput" :value="inputValue">
    </div>
    const app = Vue.createApp({
    data() {
      return {
        count: 0,
        inputValue: ''
      }
    },
    methods: {
      increment() {
        this.count++
      },
      handleInput(e) {
        this.inputValue = e.target.value
      }
    }
    })
    app.mount('#app')
  • v-model:用来做表单的双向数据绑定,其实就是v-bind:value和v-on:input的语法糖,比如上面的input可以改成:
    <input v-model="inputValue">

    这样就不用自己写handleInput方法了,input里的内容变化时,data里的inputValue会自动更新,data里的inputValue变化时,input里的内容也会自动更新。

  • v-if和v-show:用来控制元素的显示和隐藏,v-if是直接删除或添加DOM元素,v-show是通过CSS的display属性来控制元素的显示和隐藏,切换频繁的话用v-show,切换不频繁的话用v-if,
    <div id="app">
    <p v-if="isVisible">我是v-if控制的</p>
    <p v-show="isVisible">我是v-show控制的</p>
    <button @click="toggleVisible">切换显示</button>
    </div>
    const app = Vue.createApp({
    data() {
      return {
        isVisible: true
      }
    },
    methods: {
      toggleVisible() {
        this.isVisible = !this.isVisible
      }
    }
    })
    app.mount('#app')
  • v-for:用来渲染列表,比如数组或者对象,v-for需要配合key属性使用,key属性可以让Vue更高效地更新DOM,key最好是唯一的,比如id,
    <div id="app">
    <ul>
      <li v-for="(item, index) in todos" :key="item.id">
        {{ index + 1 }}. {{ item.text }}
      </li>
    </ul>
    </div>
    const app = Vue.createApp({
    data() {
      return {
        todos: [
          { id: 1, text: '学Vue3的模板语法' },
          { id: 2, text: '学Vue3的组件系统' },
          { id: 3, text: '做一个小项目' }
        ]
      }
    }
    })
    app.mount('#app')
计算属性和侦听器

有时候我们需要对数据进行一些处理再渲染到页面上,比如把名字拼接成全称、把数组过滤一下、把日期格式化一下,这时候可以用计算属性computed;有时候我们需要监听某个数据的变化,然后执行一些异步操作或者复杂的逻辑,比如搜索词变化的时候去请求接口,这时候可以用侦听器watch。

先讲计算属性:计算属性是基于它们的响应式依赖进行缓存的,只有当它的响应式依赖变化时,才会重新计算,否则直接返回缓存的结果,这样性能会更好,

<div id="app">
  <input v-model="firstName" placeholder="姓">
  <input v-model="lastName" placeholder="名">
  <p>全称:{{ fullName }}</p>
</div>
const app = Vue.createApp({
  data() {
    return {
      firstName: '',
      lastName: ''
    }
  },
  computed: {
    fullName() {
      return this.firstName + this.lastName
    }
  }
})
app.mount('#app')

这里的fullName就是一个计算属性,只有当firstName或者lastName变化时,它才会重新计算,否则直接返回之前的结果。

再讲侦听器:侦听器没有缓存,只要监听的数据变化,就会执行对应的回调函数,

<div id="app">
  <input v-model="searchText" placeholder="搜索">
  <p>搜索结果:{{ searchResult }}</p>
</div>
const app = Vue.createApp({
  data() {
    return {
      searchText: '',
      searchResult: ''
    }
  },
  watch: {
    searchText(newVal, oldVal) {
      // 模拟异步请求接口
      setTimeout(() => {
        this.searchResult = `搜索“${newVal}”的结果`
      }, 500)
    }
  }
})
app.mount('#app')

这里的watch监听了searchText的变化,每次searchText变化,都会延迟500毫秒再显示搜索结果,模拟真实的搜索场景。

第三步:Vue3的组件系统怎么用?

组件是Vue的核心,你可以把一个大的页面拆成很多小的组件,每个组件负责一个独立的功能,比如导航栏组件、侧边栏组件、商品卡片组件、表单组件这些,这样代码的复用性和可维护性都会大大提高。

怎么定义和使用组件?

在Vue3里,定义组件的方式有两种,一种是用全局组件,一种是用局部组件,全局组件可以在整个应用里使用,局部组件只能在父组件里使用。

先讲用CDN引入的方式定义和使用组件:

<div id="app">
  <!-- 使用局部组件 -->
  <my-button></my-button>
  <!-- 使用全局组件 -->
  <my-card></my-card>
</div>
<!-- 定义组件的模板 -->
<template id="my-button-template">
  <button @click="increment">点击次数:{{ count }}</button>
</template>
<template id="my-card-template">
  <div class="card">
    <h3>我是全局组件</h3>
  </div>
</template>
// 定义全局组件
const MyCard = {
  template: '#my-card-template'
}
const app = Vue.createApp({
  // 定义局部组件
  components: {
    'my-button': {
      template: '#my-button-template',
      data() {
        return {
          count: 0
        }
      },
      methods: {
        increment() {
          this.count++
        }
      }
    }
  }
})
// 注册全局组件
app.component('my-card', MyCard)
app.mount('#app')

再讲用Vite搭的项目里定义和使用组件,因为Vite的项目里用的是单文件组件(SFC,Single File Component),也就是.vue文件,这是Vue最常用的组件定义方式,单文件组件分为三个部分: