本文详细介绍了如何从零开始搭建第一个Vue3项目,包括Vue3的安装、项目创建、组件使用以及路由与状态管理的配置。文章还涵盖了Vue3的响应式原理和Composition API的使用方法。此外,提供了项目部署和调试的实用技巧。
Vue.js 是一个用于构建用户界面的渐进式框架。Vue的设计目标是尽量保持核心库的简洁,因此它采用了模块化设计,将功能划分为一系列可选的插件。Vue3是Vue.js的最新版本,它在性能、API一致性、TypeScript支持等方面做了许多改进和优化。
Vue3相比Vue2做了很多改进,包括但不限于:
首先安装Node.js。Vue CLI是Vue.js的官方脚手架工具,可以使用它来快速创建Vue项目。Vue CLI需要Node.js环境,所以请确保已经安装了Node.js。
npm install -g @vue/cli
安装完成后,可以通过vue --version
命令检查Vue CLI是否安装成功。
使用Vue CLI创建一个Vue3项目:
vue create my-vue3-project
在创建项目的过程中,会弹出一个选项让你选择预设的项目模板。建议选择Manually select features
,这样你可以选择创建Vue3项目。
选择Vue3后,继续选择其他你需要的特性,如Babel、Router、Vuex等。
```bash.
cd my-vue3-project
npm run serve
此时,你的第一个Vue3项目就已经搭建完成了,并且可以在本地的`http://localhost:8080/`地址访问。 ## Vue3项目结构与基础组件 ### 项目文件结构解析 当使用Vue CLI创建一个Vue3项目后,项目结构大致如下:
my-vue3-project/
│
├── node_modules/
├── public/
│ └── index.html
├── src/
│ ├── assets/
│ ├── components/
│ ├── App.vue
│ ├── main.js
│ └── router/
│ └── index.js
├── .browserslistrc
├── .editorconfig
├── .env
├── .gitignore
├── babel.config.js
├── jest.config.js
├── package.json
└── README.md
- `node_modules/`:存放第三方模块包。 - `public/`:存放静态资源,如`index.html`。 - `src/`:存放项目的源码。 - `assets/`:存放静态资源,如图片。 - `components/`:存放自定义组件。 - `App.vue`:项目的根组件。 - `main.js`:项目的入口文件。 - `router/`:存放路由配置文件。 - 其他配置文件:如`.browserslistrc`,`.editorconfig`,`package.json`等。 `main.js`示例代码: ```javascript import { createApp } from 'vue' import App from './App.vue' import router from './router' const app = createApp(App) app.use(router) app.mount('#app')
App.vue
示例代码:
<template> <div id="app"> <router-view></router-view> </div> </template> <script> export default { name: 'App' } </script>
Vue的组件是构建用户界面的基本单元。一个Vue组件包括三个主要部分:模板(HTML)、脚本(JavaScript)和样式(CSS)。下面是一个简单的Vue组件的例子:
<template> <div> <h1>Hello World!</h1> </div> </template> <script> export default { name: 'HelloWorld' } </script> <style scoped> h1 { color: #42b983; } </style>
在src/components/
目录下创建一个名为HelloWorld.vue
的文件,将上述代码写入文件中。
在App.vue
中引入并使用这个组件:
<template> <div id="app"> <HelloWorld/> </div> </template> <script> import HelloWorld from './components/HelloWorld.vue' export default { name: 'App', components: { HelloWorld } } </script>
父组件可以通过props
向子组件传递数据,子组件可以通过$emit
方法向父组件传递数据。下面是一个例子:
在父组件App.vue
中:
<template> <div id="app"> <ChildComponent message="Hello from parent"/> </div> </template> <script> import ChildComponent from './components/ChildComponent.vue' export default { name: 'App', components: { ChildComponent } } </script>
在子组件ChildComponent.vue
中:
<template> <div> <p>{{ message }}</p> </div> </template> <script> export default { name: 'ChildComponent', props: { message: { type: String, required: true } } } </script>
如果子组件需要向父组件传递数据,可以在子组件中使用this.$emit
方法:
<template> <div> <button @click="sendMessage">Send message</button> </div> </template> <script> export default { name: 'ChildComponent', props: { message: { type: String, required: true } }, methods: { sendMessage() { this.$emit('custom-event', 'Hello from child') } } } </script>
在父组件中监听这个事件:
<template> <div id="app"> <ChildComponent @custom-event="handleMessage" message="Hello from parent"/> </div> </template> <script> import ChildComponent from './components/ChildComponent.vue' export default { name: 'App', components: { ChildComponent }, methods: { handleMessage(data) { console.log(data) // 输出 "Hello from child" } } } </script>
Props是Vue组件之间的通信的一种方式,父组件可以将数据传递给子组件。下面是一个例子:
在父组件App.vue
中:
<template> <div id="app"> <ChildComponent message="Hello from parent"/> </div> </template> <script> import ChildComponent from './components/ChildComponent.vue' export default { name: 'App', components: { ChildComponent } } </script>
在子组件ChildComponent.vue
中:
<template> <div> <p>{{ message }}</p> </div> </template> <script> export default { name: 'ChildComponent', props: { message: { type: String, required: true } } } </script>
通过在父组件中传递props
的方式,子组件可以访问到父组件传递的数据。
在Vue3中,响应式系统主要通过Proxy对象实现。Proxy可以用来拦截和自定义一些操作。例如,在Vue3中,可以通过Proxy来监听数据的变化,当数据发生变化时,Vue会自动更新视图。
在Vue3中,可以通过ref
和reactive
来创建响应式对象。
ref
:用于创建一个包含值的响应式对象,主要用于基本类型的数据。
import { ref } from 'vue' const count = ref(0)
reactive
:用于将普通对象转换为响应式对象,主要用于复杂的数据结构(如对象或数组)。
import { reactive } from 'vue' const state = reactive({ count: 0 })
注意:ref
和reactive
创建的对象是不同的,ref
创建的对象包含一个.value
属性,而reactive
创建的对象直接就是一个响应式对象。
在Vue3中,可以使用watch
来监听数据的变化。watch
可以监听ref
或reactive
创建的响应式数据。
import { ref, watch } from 'vue' const count = ref(0) watch(() => count.value, (newValue, oldValue) => { console.log('count changed', newValue, oldValue) }) count.value++
响应式数据的生命周期主要涉及到数据的创建、读取、修改和销毁。
通常来说,开发者不需要直接关心响应式数据的生命周期,Vue会自动处理这些细节。
Composition API是Vue3引入的一种新的API集合,它的目标是提供一个更灵活、可复用的API方案。Composition API的核心是setup
函数和ref
、reactive
等响应式API。
setup
函数是Composition API的核心,它是每一个Vue组件的入口。在setup
函数内部,可以访问到props
和context
(包含attrs
、slots
、emit
)。
import { ref } from 'vue' export default { props: ['message'], setup(props) { const count = ref(0) return { count } } }
在上述示例中,props
参数包含了从父组件传递过来的数据,count
是一个ref
创建的响应式对象,最后返回的对象会成为组件的响应式状态和方法。
Composition API的一个重要特性是可以创建逻辑复用的API。例如,可以将一些公用的逻辑封装成一个函数,然后在不同的组件中复用这个函数。
import { ref } from 'vue' function useCounter() { const count = ref(0) const increment = () => { count.value++ } return { count, increment } }
在组件中使用这个函数:
export default { setup() { const { count, increment } = useCounter() return { count, increment } } }
在Vue2中,生命周期钩子是直接写在组件选项里,而在Vue3中,可以通过onMounted
、onUnmounted
等函数来访问生命周期钩子。
import { ref, onMounted, onUnmounted } from 'vue' export default { setup() { const isMounted = ref(false) onMounted(() => { console.log('Component is now mounted') isMounted.value = true }) onUnmounted(() => { console.log('Component is now unmounted') isMounted.value = false }) return { isMounted } } }
Vue Router是Vue.js官方支持的状态管理库。首先安装Vue Router:
npm install vue-router@next
然后配置Vue Router:
import { createRouter, createWebHistory } from 'vue-router' import Home from './views/Home.vue' import About from './views/About.vue' const routes = [ { path: '/', component: Home }, { path: '/about', component: About } ] const router = createRouter({ history: createWebHistory(), routes }) export default router
在主入口文件main.js
中引入并使用Vue Router:
import { createApp } from 'vue' import App from './App.vue' import router from './router' const app = createApp(App) app.use(router) app.mount('#app')
在Vue Router中,使用<router-link>
标签来创建导航链接,并使用<router-view>
来渲染组件:
<template> <div> <router-link to="/">Home</router-link> <router-link to="/about">About</router-link> <router-view></router-view> </div> </template>
Vuex是Vue.js官方提供的状态管理库。首先安装Vuex:
npm install vuex@next
配置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 router from './router' import store from './store' const app = createApp(App) app.use(router) app.use(store) app.mount('#app')
在组件中使用Vuex:
<template> <div> <p>{{ count }}</p> <button @click="increment">Increment</button> </div> </template> <script> import { mapState, mapActions } from 'vuex' export default { computed: { ...mapState(['count']) }, methods: { ...mapActions(['increment']) } } </script>
在Composition API中使用Vuex,可以使用mapState
和mapActions
来映射状态和动作:
import { useStore } from 'vuex' import { computed, ref, watch } from 'vue' export function useCounter() { const store = useStore() const count = computed(() => store.state.count) const increment = () => store.dispatch('increment') return { count, increment } }
在组件中使用这个函数:
<template> <div> <p>{{ count }}</p> <button @click="increment">Increment</button> </div> </template> <script> import { useCounter } from './useCounter' export default { setup() { const { count, increment } = useCounter() return { count, increment } } } </script>
使用Vue CLI构建项目:
npm run build
构建完成后,会在dist
目录下生成一个index.html
文件,以及其他静态资源文件。
将dist
目录下的文件上传到服务器,服务器需要支持静态文件服务,如Apache或Nginx。
scp -r dist/* user@your.server.com:/var/www/html/
Vue Devtools是一个浏览器扩展,可以帮助你调试Vue应用。它提供了许多功能,如查看组件树、检查响应式数据等。
index.html
文件在服务器上正确配置。watch
监听数据变化。<router-view>
是否正确配置,确保组件路径正确。tsconfig.json
配置,确保类型正确。希望以上内容能帮助你快速上手Vue3项目开发。更多详细信息和高级用法可以参考Vue官方文档。