Vue3全家桶教程涵盖了从环境搭建到实战项目的全过程,内容包括Vue3基础、组件化开发、路由配置、TypeScript集成等。教程详细讲解了如何使用Vue CLI创建项目、定义组件、管理状态以及实现动态路由。此外,还提供了构建简易博客系统的实战案例,帮助读者更好地掌握Vue3全家桶的使用。
Vue.js 是一个用于构建用户界面的渐进式框架。Vue3是Vue.js的最新版本,提供了更高效的渲染机制、更好的TypeScript支持和重新设计的组合式API等优化和新特性。Vue3的设计使得开发者能够更灵活地组织代码,提高开发效率。
搭建Vue3开发环境需要安装Node.js、Vue CLI以及相关开发工具。以下是具体步骤:
安装Node.js:
node -v
和 npm -v
检查是否安装成功。安装Vue CLI:
npm install -g @vue/cli
vue -V
检查Vue CLI是否安装成功。创建Vue项目:
vue create my-vue-app
cd my-vue-app npm install
npm run serve
此时,Vue CLI会自动启动开发服务器,并在浏览器中打开项目。默认情况下,Vue CLI会在http://localhost:8080
上运行项目。
在Vue中,组件是逻辑和UI的封装单元。一个组件通常包括模板、数据、方法、生命周期钩子等部分。在Vue3中,组件的定义方式与Vue2基本一致,但支持了更多新特性。
定义基本组件:
在src/components
目录下创建一个HelloWorld.vue
文件,定义一个简单的组件:
<template> <div> <h1>{{ message }}</h1> </div> </template> <script> export default { name: 'HelloWorld', data() { return { message: 'Hello Vue3!' } } } </script> <style scoped> h1 { color: blue; } </style>
在主页面中使用组件:
在src/App.vue
中引入并使用HelloWorld
组件:
<template> <div id="app"> <HelloWorld /> </div> </template> <script> import HelloWorld from './components/HelloWorld.vue' export default { name: 'App', components: { HelloWorld } } </script>
在Vue中,组件之间可以通过属性(props)传递数据,通过事件(event)进行通信。
定义父组件,传递数据给子组件:
在src/components/ParentComponent.vue
中:
<template> <div> <ChildComponent :message="parentMessage" @child-event="handleChildEvent" /> </div> </template> <script> import ChildComponent from './ChildComponent.vue' export default { name: 'ParentComponent', components: { ChildComponent }, data() { return { parentMessage: 'Hello from Parent!' } }, methods: { handleChildEvent(childMessage) { console.log(childMessage) } } } </script>
在子组件中接收数据并触发事件:
在src/components/ChildComponent.vue
中:
<template> <div> <p>{{ message }}</p> <button @click="sendMessage">Send Message</button> </div> </template> <script> export default { name: 'ChildComponent', props: { message: String }, methods: { sendMessage() { this.$emit('child-event', 'Hello from Child!') } } } </script>
除了通过props和event进行通信外,还可以使用Vue的内部属性this.$parent
和this.$children
来访问父组件和子组件的实例。这种方法较少见,通常只在特定情况下使用。
Vue的响应式系统基于ES6的Proxy对象,能够自动追踪数据的变化并触发依赖更新,实现高效的数据绑定。
基本响应式数据:
在组件中使用ref
或reactive
来定义响应式数据:
<script> import { ref, reactive } from 'vue' export default { name: 'ReactiveComponent', setup() { const count = ref(0) const state = reactive({ name: 'Vue', age: 10 }) return { count, state } } } </script>
监听数据变化:
使用watch
或computed
来监听数据的变化:
<script> import { ref, watch } from 'vue' export default { name: 'WatchComponent', setup() { const count = ref(0) watch(() => count.value, (newValue, oldValue) => { console.log(`count changed from ${oldValue} to ${newValue}`) }) return { count } } } </script>
Vuex是一个用于Vue.js应用的状态管理模式,支持集中式状态管理和复杂状态逻辑。在Vue3中,可以通过Vue官方的vuex
插件来集成Vuex。
安装Vuex:
npm install vuex@next --save
创建Vuex Store:
在src
目录下创建store
文件夹,并在其中建立index.js
文件:
import { createStore } from 'vuex' export default createStore({ state: { count: 0 }, mutations: { increment(state) { state.count++ } }, actions: { increment({ commit }) { commit('increment') } }, getters: { doubleCount: state => state.count * 2 } })
在主应用中使用Store:
在main.js
中:
import { createApp } from 'vue' import App from './App.vue' import store from './store' const app = createApp(App) app.use(store) app.mount('#app')
在组件中使用Store:
在src/components/StoreComponent.vue
中:
<template> <div> <p>{{ count }}</p> <button @click="increment">Increment</button> <p>{{ doubleCount }}</p> </div> </template> <script> import { mapState, mapActions, mapGetters } from 'vuex' export default { name: 'StoreComponent', computed: { ...mapState(['count']), ...mapGetters(['doubleCount']) }, methods: { ...mapActions(['increment']) } } </script>
Vue Router是Vue.js官方的路由插件,用于实现单页面应用的路由模式。Vue Router支持嵌套路由、动态路由、路由守卫等功能。
安装Vue Router:
npm install vue-router@next --save
创建路由配置:
在src
目录下创建一个router
目录,在其中建立index.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
在主应用中使用Vue 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')
<router-link>
标签进行页面跳转:
<router-link to="/">Home</router-link> <router-link to="/about">About</router-link>
动态路由允许根据URL参数匹配不同的路由组件,而嵌套路由则允许在当前路由下嵌套子路由。
动态路由配置:
router/index.js
中:
const routes = [ { path: '/user/:id', name: 'User', component: User } ]
使用动态路由参数:
<script> export default { name: 'User', props: ['id'], setup(props) { console.log(props.id) } } </script>
嵌套路由配置:
router/index.js
中:
const routes = [ { path: '/admin', name: 'Admin', component: Admin, children: [ { path: 'articles', name: 'AdminArticles', component: AdminArticles }, { path: 'users', name: 'AdminUsers', component: AdminUsers } ] } ]
<template> <div> <router-link to="/admin/articles">Articles</router-link> <router-link to="/admin/users">Users</router-link> <router-view /> </div> </template>
TypeScript是JavaScript的超集,提供了静态类型检查、面向对象编程特性等,能够帮助提高代码的可维护性和可读性。
安装TypeScript:
npm install -g typescript
tsconfig.json
文件:
{ "compilerOptions": { "target": "esnext", "module": "esnext", "strict": true, "jsx": "preserve", "moduleResolution": "node", "rootDir": "./", "esModuleInterop": true, "skipLibCheck": true, "resolveJsonModule": true, "allowJs": true, "checkJs": false, "allowSyntheticDefaultImports": true, "baseUrl": ".", "incremental": true }, "include": ["src/**/*.ts", "src/**/*.d.ts"], "exclude": ["node_modules", "dist"] }
安装Vue3的TypeScript支持:
npm install -D @vue/cli-plugin-typescript @vue/compiler-sfc
重新生成项目结构:
vue upgrade
编写TypeScript组件:
在src/components/TypeScriptComponent.vue
中:
<template> <div> <p>{{ message }}</p> </div> </template> <script lang="ts"> import { defineComponent, ref } from 'vue' export default defineComponent({ name: 'TypeScriptComponent', setup() { const message = ref('Hello TypeScript!') return { message } } }) </script>
假设要构建一个简易博客系统,主要功能包括:
用户模块:
文章模块:
评论模块:
用户注册:
前端实现:
<template> <div> <form @submit.prevent="register"> <input v-model="username" placeholder="Username" /> <input v-model="password" placeholder="Password" type="password" /> <button type="submit">Register</button> </form> </div> </template> <script> import { ref } from 'vue' import axios from 'axios' export default { setup() { const username = ref('') const password = ref('') const register = () => { axios.post('/api/register', { username: username.value, password: password.value }) .then((response) => { console.log(response) }) .catch((error) => { console.error(error) }) } return { username, password, register } } } </script>
用户登录:
前端实现:
<template> <div> <form @submit.prevent="login"> <input v-model="username" placeholder="Username" /> <input v-model="password" placeholder="Password" type="password" /> <button type="submit">Login</button> </form> </div> </template> <script> import { ref } from 'vue' import axios from 'axios' export default { setup() { const username = ref('') const password = ref('') const login = () => { axios.post('/api/login', { username: username.value, password: password.value }) .then((response) => { console.log(response) }) .catch((error) => { console.error(error) }) } return { username, password, login } } } </script>
发布文章:
前端实现:
<template> <div> <form @submit.prevent="publishArticle"> <input v-model="title" placeholder="Title" /> <textarea v-model="content" placeholder="Content" /> <button type="submit">Publish</button> </form> </div> </template> <script> import { ref } from 'vue' import axios from 'axios' export default { setup() { const title = ref('') const content = ref('') const publishArticle = () => { axios.post('/api/articles', { title: title.value, content: content.value }) .then((response) => { console.log(response) }) .catch((error) => { console.error(error) }) } return { title, content, publishArticle } } } </script>
查看文章列表:
前端实现:
<template> <div> <ul> <li v-for="article in articles" :key="article.id"> <h3>{{ article.title }}</h3> <p>{{ article.content }}</p> </li> </ul> </div> </template> <script> import { ref } from 'vue' import axios from 'axios' export default { setup() { const articles = ref([]) axios.get('/api/articles') .then((response) => { articles.value = response.data }) .catch((error) => { console.error(error) }) return { articles } } } </script>
发布评论:
前端实现:
<template> <div> <form @submit.prevent="publishComment"> <input v-model="comment" placeholder="Comment" /> <button type="submit">Publish</button> </form> </div> </template> <script> import { ref } from 'vue' import axios from 'axios' export default { setup() { const comment = ref('') const publishComment = () => { axios.post('/api/comments', { comment: comment.value }) .then((response) => { console.log(response) }) .catch((error) => { console.error(error) }) } return { comment, publishComment } } } </script>
查看评论列表:
前端实现:
<template> <div> <ul> <li v-for="comment in comments" :key="comment.id"> <p>{{ comment.content }}</p> </li> </ul> </div> </template> <script> import { ref } from 'vue' import axios from 'axios' export default { setup() { const comments = ref([]) axios.get('/api/comments') .then((response) => { comments.value = response.data }) .catch((error) => { console.error(error) }) return { comments } } } </script>
文章管理:
前端实现:
<template> <div> <ul> <li v-for="article in articles" :key="article.id"> <h3>{{ article.title }}</h3> <button @click="editArticle(article.id)">Edit</button> <button @click="deleteArticle(article.id)">Delete</button> </li> </ul> </div> </template> <script> import { ref } from 'vue' import axios from 'axios' export default { setup() { const articles = ref([]) const editArticle = (id) => { // 实现编辑文章逻辑 } const deleteArticle = (id) => { axios.delete(`/api/articles/${id}`) .then((response) => { console.log(response) }) .catch((error) => { console.error(error) }) } axios.get('/api/articles') .then((response) => { articles.value = response.data }) .catch((error) => { console.error(error) }) return { articles, editArticle, deleteArticle } } } </script>
用户管理:
前端实现:
<template> <div> <ul> <li v-for="user in users" :key="user.id"> <p>{{ user.username }}</p> <button @click="deleteUser(user.id)">Delete</button> </li> </ul> </div> </template> <script> import { ref } from 'vue' import axios from 'axios' export default { setup() { const users = ref([]) const deleteUser = (id) => { axios.delete(`/api/users/${id}`) .then((response) => { console.log(response) }) .catch((error) => { console.error(error) }) } axios.get('/api/users') .then((response) => { users.value = response.data }) .catch((error) => { console.error(error) }) return { users, deleteUser } } } </script>
通过以上内容,你已经掌握了Vue3的基本概念、组件化开发、路由配置、TypeScript集成以及实战项目开发的流程。希望这些内容能帮助你更好地掌握Vue3开发技能。