vue3的基本使用(超详细)

1,426 阅读8分钟

引言

在本章中,我们将对Vue 3进行初步了解,探讨它作为前端框架的最新版本所带来的新特性和改进。

Vue 3简介

Vue.js是一个开源的前端JavaScript框架,用于构建用户界面和单页应用程序。Vue 3是该框架的最新主要版本,它带来了许多新特性和性能改进。

Vue 3的核心特性

  • 更好的性能:Vue 3提供了更快的虚拟DOM重渲染和更高效的组件更新。
  • 更小的体积:Vue 3的包大小更小,使得加载和初始化更快。
  • 更好的类型推断:对TypeScript的支持更加完善。

Vue 3的新特性和改进

Vue 3引入了许多新特性和改进,以下是一些显著的亮点:

Composition API

Vue 3引入了Composition API,这是一种新的组件选项,允许开发者更灵活地组织组件逻辑。

示例:使用Composition API
import { ref, reactive } from 'vue';

export default {
  setup() {
    const count = ref(0);
    const increment = () => {
      count.value++;
    };

    return { count, increment };
  }
};

响应式系统的升级

Vue 3的响应式系统得到了重写,现在使用Proxy代替了Vue 2中的Object.defineProperty。

示例:响应式数据的基本使用
import { ref } from 'vue';

const message = ref('Hello Vue 3!');

console.log(message.value); // 输出:Hello Vue 3!

Fragment、Teleport 和 Suspense

Vue 3支持Fragment(多个根节点)、Teleport(将组件的子节点传输到DOM的其他部分)和Suspense(用于异步组件的加载状态)。

示例:使用Fragment
<template>
  <Fragment>
    <div>Part 1</div>
    <div>Part 2</div>
  </Fragment>
</template>

更好的 TypeScript 支持

Vue 3的类型系统经过重新设计,提供了更好的TypeScript集成。

示例:使用TypeScript定义组件

<script lang="ts">
import { defineComponent, ref } from 'vue';

export default defineComponent({
  setup() {
    const message = ref<string>('Hello from TypeScript!');
    return { message };
  }
});
</script>

Vue 3环境搭建

在本章中,我们将介绍如何搭建Vue 3的开发环境,包括安装Vue CLI和创建Vue 3项目。

安装Vue CLI

Vue CLI是Vue的官方命令行工具,用于快速搭建Vue项目和进行项目管理。

安装步骤

npm install -g @vue/cli
# OR 使用 yarn
yarn global add @vue/cli

验证安装

vue --version

创建和管理Vue 3项目

使用Vue CLI,我们可以轻松地创建和管理Vue 3项目。

创建新项目

vue create my-vue3-app

选择Vue 3预设

在创建项目的过程中,CLI会提示你选择Vue 3预设,确保选择包含Vue 3的选项。

项目结构

创建的项目将包含以下基本结构:

my-vue3-app/
├── node_modules/
├── public/
├── src/
│   ├── assets/
│   ├── components/
│   ├── App.vue
│   ├── main.js
│   └── ...
├── package.json
└── ...

运行项目

在项目目录中,使用以下命令启动开发服务器:

cd my-vue3-app
npm run serve
# OR 使用 yarn
yarn serve

构建项目

使用以下命令构建生产环境的代码:

npm run build
# OR 使用 yarn
yarn build

响应式系统的深入理解

Vue 3的响应式系统经过了重写,提供了更高性能和更细粒度的反应能力。

Vue 3的响应式原理

Vue 3使用Proxy替代了Vue 2中的Object.defineProperty来实现响应式系统。

响应式数据的基本使用

import { ref } from 'vue';

const count = ref(0);

console.log(count.value); // 输出:0

count.value++;
console.log(count.value); // 输出:1

响应式对象

import { reactive } from 'vue';

const state = reactive({
  count: 0
});

console.log(state.count); // 输出:0

state.count++;
console.log(state.count); // 输出:1

Reactivity API的使用

Vue 3提供了一组Reactivity API,允许开发者手动创建和管理响应式状态。

使用computed创建计算属性

import { computed } from 'vue';

const doubleCount = computed(() => count.value * 2);

console.log(doubleCount.value); // 输出:2

使用watch侦听数据变化

import { watch } from 'vue';

watch(count, (newValue, oldValue) => {
  console.log(`count changed from ${oldValue} to ${newValue}`);
});

使用watchEffect侦听多个响应式引用

import { watchEffect } from 'vue';

watchEffect(() => {
  console.log(`count is now: ${count.value}`);
});

响应式系统的优化

Vue 3的响应式系统还提供了一些优化措施,比如shouldComponentUpdate的改进和批量异步更新。

示例:组件的更新控制

import { computed } from 'vue';

export default {
  computed: {
    isEven() {
      return this.count % 2 === 0;
    }
  }
};

组件基础

在Vue中,组件是构建用户界面的基本单元。本章将介绍如何创建Vue 3组件以及组件的模板语法和数据绑定。

创建Vue 3组件

Vue 3组件是基于JavaScript类或函数的,可以包含模板、脚本和样式。

示例:简单的Vue 3组件

<template>
  <div>{{ message }}</div>
</template>

<script>
import { defineComponent, ref } from 'vue';

export default defineComponent({
  setup() {
    const message = ref('Hello, Vue 3!');

    // 可以在这里执行更多的组件逻辑

    return { message };
  }
});
</script>

<style scoped>
div {
  color: red;
}
</style>

组件的模板语法

Vue组件的模板使用了HTML-based template syntax,允许开发者声明式地将DOM绑定到组件的数据。

插值表达式

<template>
  <div>{{ rawString }}</div>
  <div>{{ numberFormatted }}</div>
  <div>{{ message.split(' ').join(' & ') }}</div>
</template>

指令

<template>
  <img :src="imageUrl" :alt="imageDescription" />
  <button :key="buttonId">Click me</button>
</template>

数据绑定

Vue 3提供了多种数据绑定的方法,允许开发者将组件的DOM与数据连接起来。

使用v-bind进行属性绑定

<template>
  <div v-bind:id="elementId"></div>
</template>

使用v-model进行双向数据绑定

<template>
  <input v-model="username" placeholder="Enter your name">
</template>

条件渲染和列表渲染

Vue 3的模板语法支持条件渲染和列表渲染,允许开发者根据数据动态渲染DOM。

使用v-ifv-else-if进行条件渲染

<template>
  <div v-if="isVisible">Now you see me!</div>
</template>

使用v-for进行列表渲染

<template>
  <ul>
    <li v-for="item in items" :key="item.id">{{ item.defaultText }}</li>
  </ul>
</template>

组件通信

在Vue应用中,组件之间的通信是实现复杂功能的关键。本章将介绍父子组件通信以及事件绑定和自定义事件的使用方法。

父子组件通信

父子组件之间的通信可以通过props和事件来实现。

父组件向子组件传递数据

<!-- 父组件 -->
<template>
  <child-component :parent-message="message"></child-component>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      message: 'Hello from parent!'
    };
  }
};
</script>

子组件向父组件发送数据

<!-- 子组件 -->
<template>
  <button @click="emitMessage">Send Message to Parent</button>
</template>

<script>
export default {
  emits: ['childEvent'],
  methods: {
    emitMessage() {
      this.$emit('childEvent', 'Hello from child!');
    }
  }
};
</script>

事件绑定和自定义事件

事件是Vue组件之间通信的重要机制。

监听DOM事件

<template>
  <input type="text" @input="onInput">
</template>

<script>
export default {
  methods: {
    onInput(event) {
      console.log(event.target.value);
    }
  }
};
</script>

使用自定义事件

<!-- 子组件 -->
<template>
  <button @click="emitCustomEvent">Custom Event</button>
</template>

<script>
export default {
  emits: ['custom-event'],
  methods: {
    emitCustomEvent() {
      this.$emit('custom-event', 'Data from custom event');
    }
  }
};
</script>

监听自定义事件

<!-- 父组件 -->
<template>
  <child-component @custom-event="handleCustomEvent"></child-component>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  methods: {
    handleCustomEvent(data) {
      console.log(data); // "Data from custom event"
    }
  }
};
</script>

Vue 3的Composition API

Vue 3引入了Composition API,这是一种新的组件选项,提供了一种更灵活、更可组合的方式来组织组件逻辑。

setup函数的使用

setup函数是Composition API的入口点,它在组件创建之前执行。

示例:基本的setup函数

<script>
import { ref, onMounted } from 'vue';

export default {
  setup() {
    const count = ref(0);

    onMounted(() => {
      console.log('Component is mounted!');
    });

    return { count };
  }
};
</script>

响应式状态和计算属性

使用Composition API,你可以创建响应式状态和计算属性。

示例:使用refreactive

import { ref, reactive, computed } from 'vue';

const count = ref(0);
const state = reactive({
  message: 'Hello Vue 3!'
});

const doubleCount = computed(() => count.value * 2);

示例:模板中的使用

<template>
  <div>{{ state.message }} - {{ doubleCount }}</div>
  <button @click="count.value++">Increase</button>
</template>

生命周期钩子

Composition API提供了一组生命周期钩子,用于替代选项式API中的生命周期钩子。

示例:使用生命周期钩子

import { onMounted, onUpdated, onUnmounted } from 'vue';

setup() {
  onMounted(() => {
    console.log('Component is mounted.');
  });

  onUpdated(() => {
    console.log('Component is updated.');
  });

  onUnmounted(() => {
    console.log('Component is unmounted.');
  });
}

提供和注入

provideinject可以在祖先组件中提供数据,并在后代组件中注入数据。

示例:使用provideinject

<!-- 祖先组件 -->
<script>
import { provide, reactive } from 'vue';

export default {
  setup() {
    const state = reactive({ theme: 'dark' });
    provide('theme', state);
  }
};
</script>
<!-- 后代组件 -->
<script>
import { inject } from 'vue';

export default {
  setup() {
    const theme = inject('theme');
    return { theme };
  }
};
</script>

高级特性

Vue 3提供了一些高级特性,如动态组件、<teleport><Suspense>,这些特性可以帮助开发者构建更复杂的应用。

动态组件

动态组件使用<component>标签实现,允许在运行时动态切换不同的组件。

示例:使用动态组件

<template>
  <div>
    <component :is="currentComponent"></component>
    <button @click="switchComponent">Switch Component</button>
  </div>
</template>

<script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';

export default {
  data() {
    return {
      currentComponent: ComponentA
    };
  },
  methods: {
    switchComponent() {
      this.currentComponent = this.currentComponent === ComponentA ? ComponentB : ComponentA;
    }
  }
};
</script>

<teleport>

<teleport>是一个内置的Vue组件,允许将组件的子节点“传送”到DOM的其他部分。

示例:使用<teleport>

<template>
  <div>
    <teleport to="#container">
      <div>I am teleported to another part of the page!</div>
    </teleport>
  </div>
</template>

<script>
export default {
  // ...
};
</script>
<!-- 在HTML中定义一个容器 -->
<div id="container"></div>

<Suspense>

<Suspense>用于包裹异步组件,提供了一种处理异步依赖项加载状态的机制。

示例:使用<Suspense>

<template>
  <Suspense>
    <template #default>
      <AsyncComponent />
    </template>
    <template #fallback>
      <div>Loading...</div>
    </template>
  </Suspense>
</template>

<script>
import { defineAsyncComponent } from 'vue';

const AsyncComponent = defineAsyncComponent(() =>
  import('./path/to/async-component')
);
</script>

高级列表渲染

Vue 3提供了更高级的列表渲染功能,如v-memo和虚拟滚动。

示例:使用v-memo

<template>
  <ul v-for="item in list" :key="item.id">
    <li v-memo="item">{{ item.defaultText }}</li>
  </ul>
</template>

虚拟滚动

虚拟滚动可以提高长列表的性能,只渲染可视区域内的元素。

示例:使用虚拟滚动库

<template>
  <virtual-list :size="itemCount" :remain="10">
    <template v-slot="{ item }">
      <div>{{ item.defaultText }}</div>
    </template>
  </virtual-list>
</template>

<script>
// 引入虚拟滚动库
import VirtualList from 'virtual-list';
export default {
  components: {
    VirtualList
  },
  // ...
};
</script>

Vue Router和Vuex的集成

在大型Vue应用中,Vue Router用于页面路由,Vuex用于状态管理。本章将介绍如何将Vue Router和Vuex集成到Vue 3应用中。

Vue Router 4的使用

Vue Router是Vue官方的路由管理器,适用于构建单页面应用。

安装Vue Router

npm install vue-router@4

创建路由实例

// router/index.js
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;

在Vue应用中使用Vue Router

// 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');

Vuex 4的状态管理

Vuex是Vue的官方状态管理库,适用于构建维护状态的复杂应用。

安装Vuex

npm install vuex@4

创建Vuex store

// store/index.js
import { createStore } from 'vuex';

export default createStore({
  state: {
    count: 0,
  },
  mutations: {
    increment(state) {
      state.count++;
    },
  },
  actions: {
    incrementAsync({ commit }) {
      setTimeout(() => {
        commit('increment');
      }, 1000);
    },
  },
});

在Vue应用中使用Vuex

// main.js
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');

集成Vue Router和Vuex

Vue Router和Vuex可以很好地集成,实现路由状态和应用状态的统一管理。

示例:使用Vuex管理路由元信息

// store/index.js
export default createStore({
  // ...
  actions: {
    setRouteMeta({ commit }, meta) {
      // 根据路由变化更新状态
    },
  },
});

构建和部署

在本章中,我们将讨论如何构建Vue 3应用以及如何将其部署到生产环境。

构建Vue 3应用

构建Vue 3应用是为了优化生产环境的性能和资源。

使用Vue CLI构建应用

npm run build

这个命令会启动Vue CLI的构建过程,生成用于生产环境的优化后的静态资源。

配置生产环境

vue.config.js中,你可以配置生产环境的特定设置。

// vue.config.js
module.exports = {
  productionSourceMap: false,
  devServer: {
    headers: {
      'Access-Control-Allow-Origin': '*',
    },
  },
};

部署Vue 3应用

部署Vue 3应用涉及将构建后的静态资源上传到服务器或静态网站托管服务。

部署到静态网站托管服务

许多静态网站托管服务如Netlify、Vercel和GitHub Pages可以直接部署Vue 3构建的静态资源。

部署到Netlify
  1. 在Netlify上创建新站点。
  2. 连接到你的Git仓库。
  3. 配置构建设置以使用Vue CLI。
  4. 部署并获取自动生成的URL。

部署到云服务平台

云服务平台如AWS、Azure和Google Cloud Platform提供了更多的灵活性和控制权。

部署到AWS
  1. 准备AWS Elastic Beanstalk环境。
  2. 配置Elastic Beanstalk环境以运行Node.js应用。
  3. 将构建后的文件部署到Elastic Beanstalk。

优化Vue 3应用

优化Vue 3应用可以提高性能、减少加载时间和提升用户体验。

代码分割和懒加载

使用Webpack的代码分割功能,可以实现组件级别的懒加载。

// router/index.js
const routes = [
  // ...
  {
    path: '/about',
    component: () => import(/* webpackChunkName: "about" */ '../views/About.vue'),
  },
  // ...
];

服务端渲染(SSR)

服务端渲染可以提高首屏加载速度,改善SEO。

使用Nuxt.js实现SSR
  1. 安装Nuxt.js。
  2. 使用Nuxt.js配置Vue 3应用。
  3. 部署Nuxt.js应用以实现服务端渲染。