手记

Vue3学习:从零开始的全面指南

概述

本文详细介绍了Vue3的基本概念和安装方法,涵盖了Vue3的主要特点和环境配置步骤,帮助读者快速上手。此外,文章还深入讲解了Vue3的基础语法、组件化开发、路由和状态管理等内容,旨在为读者提供全面的Vue3学习指南。

Vue3简介与安装

什么是Vue3

Vue.js 是一个渐进式前端框架,它允许开发者构建用户界面。Vue3 是 Vue.js 的最新版本,它在性能、API 设计以及类型支持上进行了大量的改进和优化。Vue3 引入了新的 Composition API,这使得组件逻辑更加灵活和易于管理。

Vue3的主要特点

  1. 更快的渲染速度:Vue3 通过优化渲染过程,使得组件更新更加高效。
  2. 更小的体积:Vue3 的核心库体积更小,有利于前端代码体积控制。
  3. 更好的类型支持:Vue3 改进了 TypeScript 支持,引入了 Composition API,使得类型检查更加严格。
  4. Composition API:这是一种新的 API 设计,使得开发者可以更加灵活地组织和重用组件逻辑。
  5. 更好的异步支持:Vue3 改进了对异步操作的支持,比如更高效的异步渲染和更好的处理异步逻辑。

安装Vue3环境

要开始使用 Vue3,你需要先安装 Node.js 和 Vue CLI。以下是安装步骤:

  1. 安装 Node.js:首先要确保你的计算机上已经安装了 Node.js。你可以在 Node.js 官方网站上下载最新版本。
  2. 安装 Vue CLI:Vue CLI 是一个命令行工具,可以用来快速搭建 Vue 项目。在命令行中输入以下命令来安装 Vue CLI:

    npm install -g @vue/cli
  3. 创建 Vue 项目:使用 Vue CLI 创建一个新的 Vue 项目。在命令行中输入以下命令:

    vue create my-vue3-project
  4. 选择 Vue3:在创建项目时,选择 Vue 3.x 版本。

  5. 进入项目目录并安装依赖

    cd my-vue3-project
    npm install
Vue3基础语法

模板语法

Vue 的模板语法提供了一种方便的方式来将数据绑定到 DOM。Vue 将模板编译成渲染函数,从而提高性能。

基本语法

在 HTML 模板中,你可以使用 {{ }} 来表示一个变量:

<div id="app">
  {{ message }}
</div>
var app = Vue.createApp({
  data() {
    return {
      message: 'Hello Vue3!'
    };
  }
});

app.mount('#app');

增加条件渲染

Vue 提供了 v-ifv-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-ifv-else:用于条件渲染。
  • v-for:用于列表渲染。
  • v-model:用于双向数据绑定。
  • v-bind:用于绑定属性或内联样式。
  • v-on:用于事件监听。

例如,使用 v-bind 绑定数据到属性:

<div id="app">
  <img v-bind:src="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

在子组件中定义 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 Router 是 Vue.js 官方的路由库,它允许你通过 URL 来动态加载组件,实现单页面应用(SPA)的导航。

安装 Vue Router

首先,你需要安装 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简介

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,它可以帮助你设计出可预测的应用程序状态管理。

安装 Vuex

首先,你需要安装 Vuex:

npm install vuex

安装与配置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');

使用Vuex管理应用状态

在组件中使用 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项目实战

小项目搭建

搭建一个简单的博客应用:

  1. 安装依赖

    npm install
  2. 创建 Vue 项目

    vue create blog-app
  3. 创建路由配置

    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;
  4. 创建 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);
        }
      }
    });
  5. 创建组件

    <!-- 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>

常见问题解决

问题1:组件之间共享数据

使用 Vuex 来共享数据:

import { createStore } from 'vuex';

export default createStore({
  state: {
    sharedData: {}
  },
  mutations: {
    setSharedData(state, data) {
      state.sharedData = data;
    }
  },
  actions: {
    setSharedData({ commit }, data) {
      commit('setSharedData', data);
    }
  }
});

问题2:导航守卫失效

确保每次导航都经过了相应的导航守卫:

router.beforeEach((to, from, next) => {
  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (isAuthenticated) {
      next();
    } else {
      next('/login');
    }
  } else {
    next();
  }
});

代码优化与调试技巧

代码优化

  • 减少渲染的复杂度:通过使用 v-ifv-for 等指令来减少不必要的渲染。
  • 事件优化:使用 v-on 等指令来优化事件处理。
  • 异步优化:使用 async/await 等语法来优化异步操作。

调试技巧

  • Vue Devtools:使用 Vue Devtools 插件来调试 Vue 应用。
  • console.log:使用 console.log 来打印变量,查看其变化。
  • 断点调试:使用浏览器的开发者工具来设置断点调试。
0人推荐
随时随地看视频
慕课网APP