Vue.js是一个渐进式的JavaScript框架,可以根据项目需求进行不同程度的使用。Vue3是Vue.js的最新版本,它提供了更好的性能、更小的体积、更简单的入门体验以及更完善的TypeScript支持。
Vue3的主要改进包括:
首先,确保安装了Node.js和npm。然后,可以通过npm全局安装Vue CLI:
npm install -g @vue/cli
接着,使用Vue CLI创建一个新的Vue3项目:
vue create my-vue3-project
在选择预设时,选择带有Vue3的预设:
? Please pick a preset (Use arrow keys to navigate): (Use arrow keys to navigate) > Default (Vue 3 + Babel + TypeScript + Router + Vuex + Linting)
创建完成后,在项目根目录运行:
cd my-vue3-project npm run serve
即可启动开发服务器并且可以在浏览器中访问。
使用Vue CLI创建一个新项目时,可以选择不同配置以满足项目需求。上述安装过程中已经演示了如何创建Vue3项目,以下是更详细的步骤:
npm -v @vue/cli -v
vue create my-vue3-project
? Please pick a preset (Use arrow keys to navigate): (Use arrow keys to navigate) > Default (Vue 3 + Babel + TypeScript + Router + Vuex + Linting)
cd my-vue3-project npm install npm run serve
一个典型的Vue项目结构如下:
my-vue3-project ├── node_modules ├── public │ ├── index.html │ └── favicon.ico ├── src │ ├── assets │ ├── components │ ├── App.vue │ ├── main.js │ ├── router │ │ └── index.js │ └── store │ └── index.js ├── .browserslistrc ├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── babel.config.js ├── package.json ├── README.md └── vue.config.js
public
目录存放静态文件,如index.html
。src
目录是项目的主要代码目录。components
目录存放Vue组件。App.vue
是应用的根组件。main.js
是应用的启动文件。router
目录配置应用的路由。store
目录用于管理应用的状态。Vue Router是Vue.js官方的路由管理器。它用于管理应用中的路由和组件的动态加载。首先,安装Vue Router:
npm install vue-router@next
创建路由配置。在src/router/index.js
中,配置路由:
import Vue from 'vue' import Router from 'vue-router' import Home from '../components/Home.vue' import About from '../components/About.vue' Vue.use(Router) export default new Router({ routes: [ { path: '/', name: 'Home', component: Home }, { path: '/about', name: 'About', component: About } ] })
在main.js
中引入并使用路由:
import Vue from 'vue' import App from './App.vue' import router from './router' new Vue({ router, render: h => h(App) }).$mount('#app')
这样,路径/
将渲染Home.vue
组件,路径/about
将渲染About.vue
组件。
创建一个简单的Vue组件MyComponent.vue
:
<template> <div> <h1>{{ title }}</h1> <p>{{ message }}</p> </div> </template> <script> export default { name: 'MyComponent', props: ['title', 'message'] } </script> <style scoped> h1 { color: red; } </style>
在其他组件中使用这个组件:
<template> <div id="app"> <my-component title="Hello" message="Welcome to Vue3" /> </div> </template> <script> import MyComponent from './components/MyComponent.vue' export default { name: 'App', components: { MyComponent } } </script>
在组件之间传递数据通常使用Props。可以在父组件中传递数据给子组件:
<template> <div id="app"> <child-component :data="parentData" /> </div> </template> <script> import ChildComponent from './ChildComponent.vue' export default { name: 'App', components: { ChildComponent }, data() { return { parentData: 'Hello from Parent' } } } </script>
子组件可以监听Props的变化:
<template> <div> <p>{{ data }}</p> </div> </template> <script> export default { name: 'ChildComponent', props: ['data'] } </script>
在组件间通信,还可以使用自定义事件:
<template> <div> <child-component @custom-event="handleCustomEvent" /> </div> </template> <script> import ChildComponent from './ChildComponent.vue' export default { name: 'App', components: { ChildComponent }, methods: { handleCustomEvent(data) { console.log('Custom event data:', data) } } } </script> `` 在子组件中触发事件: ```vue <template> <div> <button @click="triggerCustomEvent">Trigger Event</button> </div> </template> <script> export default { name: 'ChildComponent', methods: { triggerCustomEvent() { this.$emit('custom-event', 'Data from Child') } } } </script> `` ### 槽(Slot)的使用 Vue的插槽机制允许父组件向子组件传递DOM结构。例如,创建一个带插槽的组件`MySlot.vue`: ```vue <template> <div> <slot></slot> </div> </template> <script> export default { name: 'MySlot' } </script>
在父组件中使用这个组件时,可以插入自定义内容:
<template> <div id="app"> <my-slot> <h1>Hello from Parent</h1> </my-slot> </div> </template> <script> import MySlot from './components/MySlot.vue' export default { name: 'App', components: { MySlot } } </script> `` 这样,父组件的内容会被插入到子组件的插槽位置。 ## Vue3响应式原理 ### 响应式数据绑定 在Vue中,数据是响应式的。当数据发生变化时,视图会自动更新。例如,定义响应式的数据: ```javascript export default { data() { return { count: 0 } } }
在模板中使用:
<template> <div> <p>{{ count }}</p> <button @click="increment">Increment</button> </div> </template> <script> export default { methods: { increment() { this.count++ } } } </script>
当点击按钮时,count
的值会增加,并且视图会自动更新。
计算属性是基于数据依赖进行缓存的,当数据发生变化时,计算属性会重新计算:
export default { data() { return { count: 0 } }, computed: { doubleCount() { return this.count * 2 } } }
在模板中使用:
<template> <div> <p>{{ doubleCount }}</p> </div> </template>
侦听器用于监听特定数据的变化,可以执行异步或复杂的更新操作:
export default { data() { return { count: 0 } }, watch: { count(newVal, oldVal) { console.log('count changed from', oldVal, 'to', newVal) } } }
Vue组件生命周期钩子允许在组件的不同生命周期阶段执行特定的操作。常见的生命周期钩子有:
beforeCreate
: 在实例初始化之前,数据观测和事件配置尚未开始。created
: 实例初始化完成,数据观测和事件配置已经完成,但DOM还未渲染。beforeMount
: 在挂载开始之前被调用,此时,模板已经编译,但DOM还未挂载。mounted
: 挂载完成后被调用,此时组件已经挂载到了DOM上。beforeUpdate
: 在数据变更导致的重新渲染之前被调用。updated
: 更新完成后被调用,此时DOM已经更新。beforeDestroy
: 在实例销毁之前被调用。此时,实例仍然完全可用。destroyed
: 实例销毁后被调用。此时,Vue实例上的所有事件监听器和子实例都将被清除。使用生命周期钩子:
export default { data() { return { message: 'Hello' } }, mounted() { console.log('Component is mounted') }, beforeDestroy() { console.log('Component is about to be destroyed') } }
setup函数是Composition API的主要入口,提供一个函数来集中管理组件的状态和逻辑:
import { ref } from 'vue' export default { setup() { const count = ref(0) const increment = () => { count.value++ } return { count, increment } } }
在模板中使用:
<template> <div> <p>{{ count }}</p> <button @click="increment">Increment</button> </div> </template> <script> import { ref } from 'vue' import { setup } from './setup' export default { setup } </script>
ref
用于创建一个可变的响应式变量:
import { ref } from 'vue' export default { setup() { const count = ref(0) return { count } } }
reactive
用于创建一个可变的响应式对象:
import { reactive } from 'vue' export default { setup() { const state = reactive({ count: 0 }) return { state } } }
使用provide
和inject
来复用逻辑:
import { provide, ref } from 'vue' export default { setup() { const count = ref(0) provide('count', count) return { count } } }
在子组件中注入并使用:
import { inject } from 'vue' export default { setup() { const count = inject('count') return { count } } }
创建一个简单的Todo应用,包括添加任务、删除任务和完成任务的功能:
<template> <div> <h1>Todo List</h1> <input v-model="newTodo" placeholder="Add a new todo" /> <button @click="addTodo">Add</button> <ul> <li v-for="(todo, index) in todos" :key="index"> <span @click="toggleTodo(todo)" :class="{ completed: todo.completed }"> {{ todo.text }} </span> <button @click="removeTodo(index)">Remove</button> </li> </ul> </div> </template> <script> export default { data() { return { newTodo: '', todos: [] } }, methods: { addTodo() { if (this.newTodo.trim() !== '') { this.todos.push({ text: this.newTodo, completed: false }) this.newTodo = '' } }, toggleTodo(todo) { todo.completed = !todo.completed }, removeTodo(index) { this.todos.splice(index, 1) } } } </script> <style scoped> .completed { text-decoration: line-through; } </style>
要将Vue项目部署到生产环境,可以使用npm的build
命令:
npm run build
这将生成一个dist
目录,其中包含生产环境下的静态文件。你可以将这些文件部署到任何静态文件服务器,如GitHub Pages、Netlify或AWS S3。
npm install
vue.config.js
中的配置,确保开发服务器设置正确。
module.exports = { devServer: { hot: true } }
import Vue from 'vue' import App from './App.vue' Vue.config.productionTip = false new Vue({ render: h => h(App) }).$mount('#app')
路由不起作用:确保Vue Router的配置正确,检查路由路径和组件名称。
import Vue from 'vue' import Router from 'vue-router' import Home from '../components/Home.vue' import About from '../components/About.vue' Vue.use(Router) export default new Router({ mode: 'history', routes: [ { path: '/', name: 'Home', component: Home }, { path: '/about', name: 'About', component: About } ] })
.my-class { color: red; }
通过以上内容,你已经学会了Vue3的基本概念、项目搭建、组件化开发、响应式原理、Composition API和实战案例。希望这篇指南帮助你快速入门并掌握Vue3开发。