本文详细介绍了Vue3的基础概念和核心特性,包括Composition API、Teleport、Fragments等新功能。文章还涵盖了Vue3的安装配置、项目搭建与运行、组件化开发以及路由与状态管理等内容,帮助读者全面了解Vue3教程。
Vue3基础概念介绍Vue3 是 Vue.js 的最新版本,它在 Vue2 的基础上进行了多项优化和改进。以下是一些 Vue3 的核心特性:
Composition API:
setup
函数,可以更直观地定义响应式数据、方法、生命周期钩子等。Teleport:
Teleport
是 Vue3 新增的组件,允许将 DOM 元素渲染到 DOM 中的任何位置,无论父组件的层级结构如何。这对于模态框、弹出层等组件非常有用。Fragments:
更好的TypeScript支持:
更好的性能:
响应式系统:
Composition API:
组件树优化:
v-if
和 v-else
的使用方式。这些变化使得模板语法更加一致和直观。Vue3 的响应式系统基于 ES2015 的 Proxy,相比 Vue2 使用的 Object.defineProperty,Proxy 提供了更强大和灵活的特性。以下是 Vue3 响应式系统的核心概念:
Proxy 代理对象:
getter 和 setter:
依赖收集:
数据绑定:
v-bind
指令实现数据绑定。可以在模板中通过 v-bind
绑定组件的属性或样式。<template> <div class="app"> <p>{{ message }}</p> <input v-model="message" /> </div> </template> <script> export default { name: 'App', data() { return { message: '' } } } </script>
生命周期钩子:
beforeCreate
、created
、beforeMount
、mounted
、beforeUpdate
、updated
、beforeUnmount
、unmounted
等。<template> <div class="app"> <p>{{ message }}</p> </div> </template> <script> export default { name: 'App', data() { return { message: 'Hello Vue3!' } }, created() { console.log('created') }, mounted() { console.log('mounted') } } </script>
Composition API 是 Vue3 引入的一种编程范式,它提供了一个更灵活的方式来组织和管理组件的逻辑。以下是使用 Composition API 的基本示例:
setup 函数:
setup
函数中定义响应式数据、方法和生命周期钩子:<template> <div class="app"> <p>{{ message }}</p> <button @click="increment">点击我</button> </div> </template> <script> import { ref } from 'vue' export default { name: 'App', setup() { const message = ref('Hello Vue3!') const increment = () => { message.value += '!' } return { message, increment } } } </script>
使用 ref 和 reactive:
ref
和 reactive
来创建响应式数据:<template> <div class="app"> <p>{{ message }}</p> <button @click="increment">点击我</button> </div> </template> <script> import { ref, reactive } from 'vue' export default { name: 'App', setup() { const message = ref('Hello Vue3!') const state = reactive({ count: 0 }) const increment = () => { message.value += '!' state.count++ } return { message, increment, state } } } </script>
使用 Vue CLI 创建项目:
使用 Vue CLI 创建一个新的 Vue 项目,命名为 my-first-vue3-project
:
vue create my-first-vue3-project
在创建过程中,选择 Vue 3 版本:
? Please pick a preset: default (babel, eslint) > manual (让你自定义配置)
初始化项目:
使用 vue create
命令创建项目后,进入项目目录:
cd my-first-vue3-project
运行项目:
使用以下命令启动开发服务器:
npm run serve
http://localhost:8080
查看效果。启动开发服务器:
使用以下命令启动开发服务器:
npm run serve
开发服务器启动后,你会看到以下输出:
App running at: - Local: http://localhost:8080/ - Network: http://192.168.1.100:8080/
http://localhost:8080
查看项目的运行效果。Vue3 组件是构建 Vue 应用的基础。组件可以通过 <template>
、<script>
和 <style>
标签定义。以下是一个简单的 Vue 组件示例:
创建组件:
在 src/components
目录下创建一个名为 HelloWorld.vue
的文件,并编写以下内容:
<template> <div class="hello"> <h1>{{ message }}</h1> <p>{{ text }}</p> </div> </template> <script> export default { name: 'HelloWorld', props: { message: String, text: String }, setup(props) { return { message: props.message, text: props.text } } } </script> <style scoped> .hello { border: 1px solid black; padding: 20px; margin-bottom: 20px; } </style>
在父组件中使用组件:
在 src/App.vue
文件中引入并使用 HelloWorld
组件:
<template> <div id="app"> <HelloWorld message="Hello Vue!" text="Welcome to Vue3!" /> </div> </template> <script> import HelloWorld from './components/HelloWorld.vue' export default { name: 'App', components: { HelloWorld } } </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
属性传递:
可以通过 props
将数据从父组件传递到子组件。以下是一个简单的示例:
<!-- HelloWorld.vue --> <template> <div class="hello"> <h1>{{ message }}</h1> <p>{{ text }}</p> </div> </template> <script> export default { name: 'HelloWorld', props: { message: String, text: String } } </script> <style scoped> .hello { border: 1px solid black; padding: 20px; margin-bottom: 20px; } </style>
<!-- App.vue --> <template> <div id="app"> <HelloWorld message="Hello Vue!" text="Welcome to Vue3!" /> </div> </template> <script> import HelloWorld from './components/HelloWorld.vue' export default { name: 'App', components: { HelloWorld } } </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
事件绑定:
可以通过 v-on
指令将事件从子组件绑定到父组件。以下是一个示例:
<!-- HelloWorld.vue --> <template> <div class="hello"> <h1>{{ message }}</h1> <p>{{ text }}</p> <button @click="handleClick">点击我</button> </div> </template> <script> export default { name: 'HelloWorld', props: { message: String, text: String }, methods: { handleClick() { this.$emit('custom-event', '这是子组件传递的数据') } } } </script> <style scoped> .hello { border: 1px solid black; padding: 20px; margin-bottom: 20px; } </style>
<!-- App.vue --> <template> <div id="app"> <HelloWorld message="Hello Vue!" text="Welcome to Vue3!" @custom-event="handleCustomEvent" /> <p>{{ customMessage }}</p> </div> </template> <script> import HelloWorld from './components/HelloWorld.vue' export default { name: 'App', components: { HelloWorld }, data() { return { customMessage: '' } }, methods: { handleCustomEvent(data) { this.customMessage = data } } } </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
插槽允许你将内容传递给组件的特定部分。以下是使用插槽的基本示例:
定义插槽:
在组件中定义插槽,可以通过 <slot>
标签来实现:
<!-- HelloWorld.vue --> <template> <div class="hello"> <h1>{{ message }}</h1> <slot></slot> </div> </template> <script> export default { name: 'HelloWorld', props: { message: String } } </script> <style scoped> .hello { border: 1px solid black; padding: 20px; margin-bottom: 20px; } </style>
使用插槽:
在父组件中通过 <HelloWorld>
标签内的内容来填充插槽:
<!-- App.vue --> <template> <div id="app"> <HelloWorld message="Hello Vue!"> <p>这是插槽内容</p> </HelloWorld> </div> </template> <script> import HelloWorld from './components/HelloWorld.vue' export default { name: 'App', components: { HelloWorld } } </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
Vue Router 是 Vue.js 官方的路由管理器,用于实现单页面应用(SPA)中的路由功能。以下是使用 Vue Router 的基本示例:
安装 Vue Router:
使用 npm
安装 Vue Router:
npm install vue-router@next
创建路由配置:
在 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
创建视图组件:
在 src/views
目录下创建两个视图组件 Home.vue
和 About.vue
:
<!-- Home.vue --> <template> <div class="home"> <h1>Home</h1> </div> </template> <script> export default { name: 'Home' } </script> <!-- About.vue --> <template> <div class="about"> <h1>About</h1> </div> </template> <script> export default { name: 'About' } </script>
在主应用中使用路由:
在 src/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')
在模板中使用路由链接:
在 src/App.vue
文件中使用 <router-link>
组件来创建导航链接:
<template> <div id="app"> <router-link to="/">Home</router-link> <router-link to="/about">About</router-link> <router-view></router-view> </div> </template> <script> export default { name: 'App' } </script> ``
Vuex 是 Vue.js 的状态管理模式,用于管理应用中的状态。以下是使用 Vuex 的基本示例:
安装 Vuex:
使用 npm
安装 Vuex:
npm install vuex@next
创建 Vuex store:
在 src/store
目录下创建一个名为 index.js
的文件,并编写以下内容:
import { createStore } from 'vuex' const store = createStore({ state: { count: 0 }, mutations: { increment(state) { state.count++ } }, actions: { increment(context) { context.commit('increment') } }, getters: { count(state) { return state.count } } }) export default store
在主应用中使用 store:
在 src/main.js
文件中引入并使用 store:
import { createApp } from 'vue' import App from './App.vue' import store from './store' const app = createApp(App) app.use(store) app.mount('#app')
在组件中使用 store:
在组件中通过 store
来访问状态和触发操作:
<template> <div class="app"> <p>{{ count }}</p> <button @click="increment">点击我</button> </div> </template> <script> import { computed } from 'vue' import { useStore } from 'vuex' export default { name: 'App', setup() { const store = useStore() const count = computed(() => store.state.count) const increment = () => store.dispatch('increment') return { count, increment } } } </script>
模块化管理:
const moduleA = { state: () => ({ count: 0 }), mutations: { increment(state) { state.count++ } }, actions: { increment(context) { context.commit('increment') } }, getters: { count(state) { return state.count } } } const store = createStore({ modules: { a: moduleA } })
类型安全:
import { createStore } from 'vuex' interface State { count: number } const store = createStore<State>({ state: { count: 0 }, mutations: { increment(state) { state.count++ } }, actions: { increment(context) { context.commit('increment') } }, getters: { count(state) { return state.count } } })
创建项目:
使用 Vue CLI 创建一个新的项目:
vue create my-vue3-project
添加路由和状态管理:
在项目中添加 Vue Router 和 Vuex,并实现简单的页面切换和状态管理:
// 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
// src/store/index.js import { createStore } from 'vuex' const store = createStore({ state: { count: 0 }, mutations: { increment(state) { state.count++ } }, actions: { increment(context) { context.commit('increment') } }, getters: { count(state) { return state.count } } }) export default store
在主应用中使用路由和状态管理:
在 src/main.js
文件中引入并使用路由和 store:
import { createApp } from 'vue' import App from './App.vue' import router from './router' import store from './store' const app = createApp(App) app.use(router) app.use(store) app.mount('#app')
在组件中使用路由和状态管理:
在组件中通过路由链接和 store 来实现功能:
<!-- App.vue --> <template> <div id="app"> <router-link to="/">Home</router-link> <router-link to="/about">About</router-link> <router-view></router-view> </div> </template> <script> import { computed } from 'vue' import { useStore } from 'vuex' export default { setup() { const store = useStore() const count = computed(() => store.state.count) const increment = () => store.dispatch('increment') return { count, increment } } } </script>
打包项目:
使用 npm run build
命令将项目打包成静态文件:
npm run build
部署到服务器:
Nginx
、Apache
或 GitHub Pages
。Vite
或 Webpack
来构建项目,并将构建后的文件部署到服务器。打包后无法访问静态资源:
确保在服务器配置中正确配置静态资源路径,例如在 Nginx
中添加以下配置:
server { listen 80; server_name your-domain.com; location / { root /path/to/dist; try_files $uri $uri/ /index.html; } }
开发环境无法启动:
Node.js
和 npm
已经正确安装,并且 Vue CLI
已经全局安装。项目打包后体积过大:
使用 Vue CLI
的 production
模式进行打包,并对代码进行压缩和混淆。例如:
npm run build --mode production
路由配置问题:
Vue Router
的配置正确,并且在 main.js
中正确引入和使用路由。store
,并且在 main.js
中正确引入和使用 Vuex
。通过以上步骤,你可以创建、运行和部署一个基本的 Vue3 项目。希望这篇文章对你有所帮助!