本文详细介绍了Vue3的基本概念和安装方法,涵盖了Vue3的主要特点和环境配置步骤,帮助读者快速上手。此外,文章还深入讲解了Vue3的基础语法、组件化开发、路由和状态管理等内容,旨在为读者提供全面的Vue3学习指南。
Vue3简介与安装Vue.js 是一个渐进式前端框架,它允许开发者构建用户界面。Vue3 是 Vue.js 的最新版本,它在性能、API 设计以及类型支持上进行了大量的改进和优化。Vue3 引入了新的 Composition API,这使得组件逻辑更加灵活和易于管理。
要开始使用 Vue3,你需要先安装 Node.js 和 Vue CLI。以下是安装步骤:
安装 Vue CLI:Vue CLI 是一个命令行工具,可以用来快速搭建 Vue 项目。在命令行中输入以下命令来安装 Vue CLI:
npm install -g @vue/cli
创建 Vue 项目:使用 Vue CLI 创建一个新的 Vue 项目。在命令行中输入以下命令:
vue create my-vue3-project
选择 Vue3:在创建项目时,选择 Vue 3.x 版本。
进入项目目录并安装依赖:
cd my-vue3-project npm install
Vue 的模板语法提供了一种方便的方式来将数据绑定到 DOM。Vue 将模板编译成渲染函数,从而提高性能。
在 HTML 模板中,你可以使用 {{ }}
来表示一个变量:
<div id="app"> {{ message }} </div>
var app = Vue.createApp({ data() { return { message: 'Hello Vue3!' }; } }); app.mount('#app');
Vue 提供了 v-if
和 v-else
指令来实现条件渲染:
<div id="app"> <p v-if="seen">now you see me</p> <p v-else>now you don't</p> </div>
var app = Vue.createApp({ data() { return { seen: true }; } }); app.mount('#app');
使用 v-for
可以渲染一个列表:
<div id="app"> <ol> <li v-for="item in items">{{ item }}</li> </ol> </div>
var app = Vue.createApp({ data() { return { items: ['Foo', 'Bar', 'Baz'] }; } }); app.mount('#app');
Vue 使用 v-model
指令来实现双向数据绑定:
<div id="app"> <input v-model="message" /> <p>{{ message }}</p> </div>
var app = Vue.createApp({ data() { return { message: 'Hello' }; } }); app.mount('#app');
计算属性 (Computed Properties) 是在依赖的数据发生变化时动态计算的属性。你可以使用 computed
选项来定义计算属性:
<div id="app"> <p>{{ fullName }}</p> </div>
var app = Vue.createApp({ data() { return { firstName: 'John', lastName: 'Doe' }; }, computed: { fullName() { return `${this.firstName} ${this.lastName}`; } } }); app.mount('#app');
方法 (Methods) 是在事件处理或者其它地方调用的函数:
<div id="app"> <p>{{ greeting() }}</p> </div>
var app = Vue.createApp({ data() { return { firstName: 'John', lastName: 'Doe' }; }, methods: { greeting() { return 'Hello, ' + this.firstName + ' ' + this.lastName; } } }); app.mount('#app');
Vue 提供了许多内置指令来操作 DOM,包括但不限于:
v-if
和 v-else
:用于条件渲染。v-for
:用于列表渲染。v-model
:用于双向数据绑定。v-bind
:用于绑定属性或内联样式。v-on
:用于事件监听。例如,使用 v-bind
绑定数据到属性:
<div id="app"> <img v-bind:class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="imageSrc" /> </div>
var app = Vue.createApp({ data() { return { imageSrc: 'https://example.com/image.jpg' }; } }); app.mount('#app');组件化开发
组件是独立可复用的 Vue 实例,它有自己独立的数据、模板、内部逻辑。创建组件有两种方式:
Vue.createApp
创建全局组件。defineComponent
创建局部组件。创建一个全局组件:
var app = Vue.createApp({ data() { return { message: 'Hello Vue' }; }, components: { 'my-component': { template: `<div>{{ message }}</div>` } } }); app.mount('#app');
创建一个局部组件:
<div id="app"> <my-component></my-component> </div>
var MyComponent = { template: '<div>{{ message }}</div>', data() { return { message: 'I am a component' }; } }; var app = Vue.createApp({ components: { 'my-component': MyComponent } }); app.mount('#app');
组件可以通过 props
从父组件向子组件传递数据,也可以通过 slot
向父组件传递数据。
在子组件中定义 props
:
<div id="app"> <my-component message="Hello from parent"></my-component> </div>
var MyComponent = { props: ['message'], template: '<div>{{ message }}</div>' }; var app = Vue.createApp({ components: { 'my-component': MyComponent } }); app.mount('#app');
插槽允许子组件插入父组件的内容:
<div id="app"> <my-component> <template v-slot:default> <div>This is the default slot</div> </template> </my-component> </div>
var MyComponent = { template: ` <div> <slot></slot> </div> ` }; var app = Vue.createApp({ components: { 'my-component': MyComponent } }); app.mount('#app');
组件可以在全局或局部范围内注册,然后在模板中使用。
全局注册组件:
Vue.createApp({ components: { 'my-component': { template: '<div>{{ message }}</div>', data() { return { message: 'Hello from my-component' }; } } } }).mount('#app');
局部注册组件:
<div id="app"> <my-component></my-component> </div>
var MyComponent = { template: '<div>{{ message }}</div>', data() { return { message: 'Hello from my-component' }; } }; var app = Vue.createApp({ components: { 'my-component': MyComponent } }); app.mount('#app');Vue3路由
Vue Router 是 Vue.js 官方的路由库,它允许你通过 URL 来动态加载组件,实现单页面应用(SPA)的导航。
首先,你需要安装 Vue Router:
npm install vue-router
创建路由配置:
import { createRouter, createWebHistory } from 'vue-router'; import Home from './components/Home.vue'; import About from './components/About.vue'; const routes = [ { path: '/', component: Home }, { path: '/about', component: About } ]; const router = createRouter({ history: createWebHistory(), routes }); export default router;
在主应用文件中使用路由:
import { createApp } from 'vue'; import App from './App.vue'; import router from './router'; createApp(App).use(router).mount('#app');
路由参数可以通过 :id
来获取:
<router-link :to="{ name: 'about', params: { userId: 123 }}">About</router-link>
const routes = [ { path: '/about/:userId', name: 'about', component: About } ];
导航守卫用于在导航发生时执行一些逻辑,比如权限检查、页面加载等:
router.beforeEach((to, from, next) => { if (to.meta.requiresAuth && !isAuthenticated) { next('/login'); } else { next(); } });Vue3状态管理
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,它可以帮助你设计出可预测的应用程序状态管理。
首先,你需要安装 Vuex:
npm install vuex
创建 Vuex store:
import { createStore } from 'vuex'; export default createStore({ state: { count: 0 }, mutations: { increment(state) { state.count++; } }, actions: { increment({ commit }) { commit('increment'); } } });
在主应用文件中使用 store:
import { createApp } from 'vue'; import App from './App.vue'; import store from './store'; createApp(App).use(store).mount('#app');
在组件中使用 store:
<div id="app"> <p>{{ count }}</p> <button @click="increment">Increment</button> </div>
import { createApp } from 'vue'; import App from './App.vue'; import store from './store'; createApp(App).use(store).mount('#app');Vue3项目实战
搭建一个简单的博客应用:
安装依赖:
npm install
创建 Vue 项目:
vue create blog-app
创建路由配置:
import { createRouter, createWebHistory } from 'vue-router'; import Home from './components/Home.vue'; import Post from './components/Post.vue'; const routes = [ { path: '/', component: Home }, { path: '/post/:id', component: Post } ]; const router = createRouter({ history: createWebHistory(), routes }); export default router;
创建 Vuex store:
import { createStore } from 'vuex'; export default createStore({ state: { posts: [ { id: 1, title: 'First Post', content: 'This is the first post' }, { id: 2, title: 'Second Post', content: 'This is the second post' } ] }, mutations: { addPost(state, post) { state.posts.push(post); } }, actions: { addPost({ commit }, post) { commit('addPost', post); } } });
创建组件:
<!-- Home.vue --> <template> <div> <h1>Blog Home</h1> <ul> <li v-for="post in posts" :key="post.id"> <router-link :to="`/post/${post.id}`">{{ post.title }}</router-link> </li> </ul> <button @click="addPost">Add Post</button> </div> </template> <script> import { computed } from 'vue'; import { useStore } from 'vuex'; export default { setup() { const store = useStore(); const posts = computed(() => store.state.posts); const addPost = () => { const newPost = { id: posts.value.length + 1, title: 'New Post', content: 'This is a new post' }; store.dispatch('addPost', newPost); }; return { posts, addPost }; } }; </script>
<!-- Post.vue --> <template> <div> <h1>{{ post.title }}</h1> <p>{{ post.content }}</p> </div> </template> <script> import { computed } from 'vue'; import { useRoute } from 'vue-router'; export default { setup() { const route = useRoute(); const post = computed(() => { return store.state.posts.find(p => p.id === parseInt(route.params.id)); }); return { post }; } }; </script>
使用 Vuex 来共享数据:
import { createStore } from 'vuex'; export default createStore({ state: { sharedData: {} }, mutations: { setSharedData(state, data) { state.sharedData = data; } }, actions: { setSharedData({ commit }, data) { commit('setSharedData', data); } } });
确保每次导航都经过了相应的导航守卫:
router.beforeEach((to, from, next) => { if (to.matched.some(record => record.meta.requiresAuth)) { if (isAuthenticated) { next(); } else { next('/login'); } } else { next(); } });
v-if
、v-for
等指令来减少不必要的渲染。v-on
等指令来优化事件处理。async/await
等语法来优化异步操作。console.log
来打印变量,查看其变化。