为了账号安全,请及时绑定邮箱和手机立即绑定

Vue3入门教程:从零开始搭建你的第一个Vue3应用

标签:
Vue.js
概述

本文详细介绍了Vue3的新特性和优势,并提供了从环境搭建到基础语法、路由使用、状态管理等多方面的详细指导。

Vue3简介
Vue3的新特性介绍

Vue 3 是 Vue.js 的最新版本,它带来了一系列改进和优化。以下是 Vue 3 的一些重要新特性:

  1. Composition API:这个特性允许开发者以一种更灵活的方式组织逻辑。它提供了一个新的 API 来管理响应式状态、生命周期钩子和依赖注入。
  2. 更好的性能:Vue 3 在渲染性能和内存使用方面有了显著改进。它使用了更轻量的虚拟 DOM 实现,并且在渲染时使用了更优化的算法。
  3. TypeScript 支持:Vue 3 更好地支持了 TypeScript,为开发者提供了更好的类型检查和静态类型支持。
  4. 更小的包体积:Vue 3 的核心库体积比 Vue 2 小了不少,这有助于提升应用的加载速度。
  5. Teleport:这个新组件允许开发者将元素渲染到 DOM 中的任意位置,这对于页面布局和异步加载非常有用。
  6. 自定义渲染器:Vue 3 提供了更灵活的渲染接口,允许开发者编写自己的渲染器,这使得 Vue 能够支持各种不同的平台。
Vue3的优势与应用场景

Vue 3 的优势包括更好的性能、更灵活的开发体验、更小的包体积以及更好的 TypeScript 支持。由于这些改进,Vue 3 在很多应用场景中都表现得非常出色:

  1. Web 应用:Vue 3 适用于任何类型的 Web 应用,无论是单页面应用(SPA)还是多页面应用(MPA)。
  2. 移动端应用:由于其良好的性能和较小的包体积,Vue 3 也非常适合开发移动 Web 应用。
  3. 桌面应用:通过使用 Electron 或其他桌面框架,Vue 3 可以用于开发桌面客户端应用。
  4. 游戏开发:虽然 Vue 主要用于 Web 开发,但 Vue 3 的 Composition API 和自定义渲染器使其成为一个不错的选择,用于与游戏引擎(如 Phaser)结合。
环境搭建
安装Node.js

首先,你需要安装 Node.js。你可以从 Node.js 官方网站下载并安装最新版本的 Node.js。确保在安装过程中勾选“Add to PATH”选项,这将自动帮你配置环境变量。

安装完成后,可以在命令行中运行以下命令来验证 Node.js 是否安装成功:

node -v
npm -v

如果看到版本号,说明安装成功。

安装Vue CLI

Vue CLI 是一个命令行工具,它可以帮助你快速搭建 Vue 项目。首先,你需要安装 Vue CLI。打开命令行,运行以下命令:

npm install -g @vue/cli

安装完成后,再次在命令行中运行以下命令来验证 Vue CLI 是否安装成功:

vue --version

如果看到版本号,说明安装成功。

使用Vue CLI创建Vue3项目

安装完 Vue CLI 后,你可以使用它来创建一个新的 Vue 3 项目。首先,创建一个新文件夹来存放你的项目,并进入该文件夹:

mkdir my-vue3-app
cd my-vue3-app

接下来,运行以下命令来创建一个新的 Vue 项目:

vue create my-vue3-app

在创建过程中,你会被问到是否使用 Vue 3 进行创建。选择 Vue 3,并按照提示完成创建过程。

创建完成后,进入项目文件夹并启动开发服务器:

cd my-vue3-app
npm run serve

现在,你的 Vue 3 项目已经成功创建,并且开发服务器已经启动。你可以在浏览器中访问 http://localhost:8080 来查看你的应用。

Vue3基础语法
模板语法

Vue 的模板语法基于 HTML,允许你声明式地将应用的数据绑定到 DOM。模板语法由以下几个部分组成:

  1. 插值:插值是通过双大括号 {{}} 结合的数据绑定来实现的。例如:

    <div>{{ message }}</div>

    在 Vue 实例中定义 message 变量:

    new Vue({
     el: '#app',
     data: {
       message: 'Hello, Vue 3!'
     }
    });
  2. 指令:指令是带有前缀 v- 的特殊属性。它们会根据绑定值来更新 DOM。常用的指令包括 v-ifv-forv-bind 等。

    <div v-if="login">
     你已登录
    </div>

    在 Vue 实例中定义 login 变量:

    new Vue({
     el: '#app',
     data: {
       login: true
     }
    });
  3. 事件处理:事件处理指令以 v-on: 开头,用于绑定事件处理器。例如:

    <button v-on:click="increment">点击我</button>

    在 Vue 实例中定义事件处理器:

    new Vue({
     el: '#app',
     data: {
       count: 0
     },
     methods: {
       increment() {
         this.count++;
       }
     }
    });
  4. 表单绑定:表单绑定指令用于处理输入和表单控件。常用的指令包括 v-model。例如:

    <input v-model="message">

    在 Vue 实例中定义 message 变量:

    new Vue({
     el: '#app',
     data: {
       message: ''
     }
    });
计算属性与方法

计算属性是基于组件内部的数据进行计算的结果,并且在依赖的数据发生变化时会自动更新。计算属性相比普通方法,可以更好地优化性能。

定义一个计算属性:

new Vue({
  el: '#app',
  data: {
    firstName: 'Vue',
    lastName: '3'
  },
  computed: {
    fullName() {
      return `${this.firstName} ${this.lastName}`;
    }
  }
});

在模板中使用计算属性:

<div id="app">
  <p>{{ fullName }}</p>
</div>

计算属性在依赖的数据更新时会自动重新计算。

方法则是普通的 JavaScript 函数,用于执行一些特定的操作。例如:

new Vue({
  el: '#app',
  data: {
    message: 'Hello'
  },
  methods: {
    reverseMessage() {
      return this.message.split('').reverse().join('');
    }
  }
});

在模板中调用方法:

<div id="app">
  <p>{{ reverseMessage() }}</p>
</div>
组件化开发

Vue 通过组件化开发来实现代码的复用和模块化。一个组件可以包含模板、脚本和样式,实现自定义的界面元素或功能模块。

定义一个简单的组件:

Vue.component('my-component', {
  template: '<div>A simple component</div>'
});

在模板中使用组件:

<div id="app">
  <my-component></my-component>
</div>

创建 Vue 实例:

new Vue({
  el: '#app'
});

可以为组件传递属性:

<my-component msg="Hello"></my-component>

在组件的模板中使用属性:

Vue.component('my-component', {
  props: ['msg'],
  template: '<div>{{ msg }}</div>'
});
事件处理

事件处理指令以 v-on: 开头,用于绑定事件处理器。例如:

<button v-on:click="increment">点击我</button>

在 Vue 实例中定义事件处理器:

new Vue({
  el: '#app',
  data: {
    count: 0
  },
  methods: {
    increment() {
      this.count++;
    }
  }
});

也可以使用简写语法:

<button @click="increment">点击我</button>
表单绑定

表单绑定指令用于处理输入和表单控件。常用的指令包括 v-model。例如:

<input v-model="message">

在 Vue 实例中定义 message 变量:

new Vue({
  el: '#app',
  data: {
    message: ''
  }
});

v-model 会自动处理输入框的双向绑定。

Vue3路由使用
安装Vue Router

首先,你需要安装 Vue Router。在你的 Vue 项目中运行以下命令:

npm install vue-router@next
路由配置与使用

在项目中创建一个 router.js 文件,用于配置路由:

import { createRouter, createWebHistory } from 'vue-router';
import Home from './views/Home.vue';
import About from './views/About.vue';

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    component: About
  }
];

const router = createRouter({
  history: createWebHistory(),
  routes
});

export default router;

main.js 中引入并使用路由:

import { createApp } from 'vue';
import App from './App.vue';
import router from './router';

const app = createApp(App);
app.use(router);
app.mount('#app');

路由的基本配置包括路径、名称和要渲染的组件。

路由模式与参数传递

你可以通过路径参数向组件传递参数。例如,在路由配置中:

{
  path: '/user/:id',
  name: 'User',
  component: User
}

在模板中使用动态路径参数:

<router-link :to="{ name: 'User', params: { id: 123 }}">用户详情</router-link>

在组件中访问路径参数:

import { defineComponent } from 'vue';

export default defineComponent({
  props: ['id'],
  setup(props) {
    console.log(props.id);
  }
});
路由守卫

路由守卫用于在路由切换时执行一些逻辑,例如访问权限控制。常见的路由守卫包括 beforeEachbeforeEnterbeforeRouteLeave

router.js 中配置路由守卫:

router.beforeEach((to, from, next) => {
  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!isAuthenticated) {
      next('/login');
    } else {
      next();
    }
  } else {
    next();
  }
});

这将确保所有需要身份验证的路由在访问时会检查用户是否已登录。

Vue3状态管理
Vuex简介

Vuex 是一个用于 Vue 应用的状态管理模式。它提供了一个集中式的存储,能够帮助你维护应用的状态并管理状态的变化。

安装与配置Vuex

首先,安装 Vuex:

npm install vuex@next

在项目中创建一个 store.js 文件,用于配置 Vuex:

import { createStore } from 'vuex';

export default createStore({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++;
    }
  },
  actions: {
    increment({ commit }) {
      commit('increment');
    }
  },
  getters: {
    count: state => state.count
  }
});

main.js 中引入并使用 Vuex:

import { createApp } from 'vue';
import App from './App.vue';
import store from './store';

const app = createApp(App);
app.use(store);
app.mount('#app');
状态管理与数据流

在 Vuex 中,状态是通过 state 对象来管理的。你可以通过 mutations 来改变状态,而通过 actions 来异步更新状态。

在组件中获取状态:

import { mapState } from 'vuex';

export default {
  computed: {
    ...mapState(['count'])
  }
};
Getter与Mutation

Getter 用于从状态中派生出一些值,类似于计算属性。在 store.js 中定义 Getter:

getters: {
  doubledCount: state => state.count * 2
}

在组件中获取 Getter:

import { mapGetters } from 'vuex';

export default {
  computed: {
    ...mapGetters(['doubledCount'])
  }
};

Mutation 是变更状态的唯一方式,并且需要在 mutations 对象中定义:

mutations: {
  increment(state) {
    state.count++;
  }
}

在组件中触发 Mutation:

import { mapMutations } from 'vuex';

export default {
  methods: {
    ...mapMutations(['increment'])
  }
};
实战案例:构建一个简单的Vue3应用
功能需求分析

构建一个简单的待办事项应用。应用应该具有以下功能:

  1. 显示待办事项列表
  2. 添加新的待办事项
  3. 删除待办事项
  4. 标记待办事项为已完成
  5. 显示完成的待办事项数量
页面设计与实现

首先,我们需要创建一个 Vue 组件来实现这个应用。在 src/components 目录下创建一个 TodoList.vue 组件。

定义数据模型

TodoList.vue 中定义数据模型:

<template>
  <div>
    <h1>待办事项</h1>
    <input v-model="newTodo" @keyup.enter="addTodo" placeholder="添加新的待办事项">
    <ul>
      <li v-for="todo in todos" :key="todo.id">
        <input type="checkbox" v-model="todo.completed">
        {{ todo.text }}
        <button @click="removeTodo(todo)">删除</button>
      </li>
    </ul>
    <p>已完成:{{ completedCount }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      newTodo: '',
      todos: [
        { id: 1, text: '学习 Vue 3', completed: false },
        { id: 2, text: '完成项目', completed: false }
      ]
    };
  },
  methods: {
    addTodo() {
      if (this.newTodo.trim()) {
        this.todos.push({
          id: this.todos.length + 1,
          text: this.newTodo,
          completed: false
        });
        this.newTodo = '';
      }
    },
    removeTodo(todo) {
      this.todos.splice(this.todos.indexOf(todo), 1);
    }
  },
  computed: {
    completedCount() {
      return this.todos.filter(todo => todo.completed).length;
    }
  }
};
</script>

添加路由配置

router.js 中配置路由:

import { createRouter, createWebHistory } from 'vue-router';
import TodoList from '../components/TodoList.vue';

const routes = [
  { path: '/', name: 'TodoList', component: TodoList }
];

const router = createRouter({
  history: createWebHistory(),
  routes
});

export default router;

在根组件中使用路由

App.vue 中使用路由:

<template>
  <router-view></router-view>
</template>

<script>
export default {
  name: 'App'
};
</script>
功能调试与优化

添加删除功能

TodoList.vue 中添加删除功能:

<template>
  <div>
    <h1>待办事项</h1>
    <input v-model="newTodo" @keyup.enter="addTodo" placeholder="添加新的待办事项">
    <ul>
      <li v-for="todo in todos" :key="todo.id">
        <input type="checkbox" v-model="todo.completed">
        <span>{{ todo.text }}</span>
        <button @click="removeTodo(todo)">删除</button>
      </li>
    </ul>
    <p>已完成:{{ completedCount }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      newTodo: '',
      todos: [
        { id: 1, text: '学习 Vue 3', completed: false },
        { id: 2, text: '完成项目', completed: false }
      ]
    };
  },
  methods: {
    addTodo() {
      if (this.newTodo.trim()) {
        this.todos.push({
          id: this.todos.length + 1,
          text: this.newTodo,
          completed: false
        });
        this.newTodo = '';
      }
    },
    removeTodo(todo) {
      this.todos.splice(this.todos.indexOf(todo), 1);
    }
  },
  computed: {
    completedCount() {
      return this.todos.filter(todo => todo.completed).length;
    }
  }
};
</script>

优化代码结构

考虑将数据和逻辑进一步分离。可以将数据存储在 Vuex 中,将组件逻辑简化为只处理 UI 更新:


import { createStore } from 'vuex';

export default createStore({
  state: {
    newTodo: '',
    todos: [
      { id: 1, text: '学习 Vue 3', completed: false },
      { id: 2, text: '完成项目', completed: false }
    ]
  },
  mutations: {
    addTodo(state, todo) {
      state.todos.push(todo);
    },
    removeTodo(state, todo) {
      state.todos.splice(state.todos.indexOf(todo), 1);
    }
  },
  actions: {
    addTodo({ commit }, todo) {
      commit('addTodo', todo);
    },
    removeTodo({ commit }, todo) {
      commit('removeTodo', todo);
    }
  },
  getters: {
    completedCount: state => {
      return state.todos.filter(todo => todo.completed).length;
    }
  }
});
``

在 `TodoList.vue` 中使用 Vuex:

```html
<template>
  <div>
    <h1>待办事项</h1>
    <input v-model="newTodo" @keyup.enter="addTodo" placeholder="添加新的待办事项">
    <ul>
      <li v-for="todo in todos" :key="todo.id">
        <input type="checkbox" v-model="todo.completed">
        <span>{{ todo.text }}</span>
        <button @click="removeTodo(todo)">删除</button>
      </li>
    </ul>
    <p>已完成:{{ completedCount }}</p>
  </div>
</template>

<script>
import { mapState, mapMutations, mapGetters } from 'vuex';

export default {
  computed: {
    ...mapState(['newTodo', 'todos']),
    ...mapGetters(['completedCount'])
  },
  methods: {
    ...mapMutations(['addTodo', 'removeTodo'])
  }
};
</script>
``

通过以上步骤,一个简单的待办事项应用已经完成。你可以继续在应用中添加更多的功能,例如过滤已完成的任务等。
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消