Vue 3知识点整合大纲
-
介绍
- 什么是Vue 3
- 与Vue 2的主要区别
- Vue 3的优势与应用场景
-
创建Vue 3项目
- 使用Vue CLI创建项目
- 项目结构介绍
- 项目配置
-
基本概念
- 响应式系统
- Reactive和Ref
- Computed和Watch
- Composition API
- setup函数
- Reactive和Ref在Composition API中的使用
- 生命周期钩子
- Options API
- Data
- Methods
- Computed
- Watchers
- 生命周期钩子
- 响应式系统
-
模板与指令
- Vue模板语法
- 条件渲染
- 列表渲染
- 事件处理
- 表单绑定
- 组件和插槽
-
组件
- 组件基础
- 父子组件通信
- Provide/Inject
- 动态组件
- 异步组件
1. 介绍
什么是Vue 3
Vue 3是尤雨溪(Evan You)团队开发的一款用于构建用户界面的渐进式JavaScript框架。Vue 3对比Vue 2进行了全面升级,不仅在性能上有了显著提升,还引入了许多新特性,如Composition API、Fragments、Teleport以及更好的TypeScript支持。
与Vue 2的主要区别
- 性能提升: Vue 3通过编译器优化、代理对象(proxy)代替getter/setter以及优化虚拟DOM算法,使得应用性能显著提升。
- Composition API: 新引入的Composition API使逻辑复用性更强,并且在大型项目中更易于组织代码。
- Fragments和Teleport: Vue 3支持多个根节点(Fragments),并引入Teleport特性,可以将模板的一部分渲染到指定位置,不再局限于父子关系。
- 更好的TypeScript支持: Vue 3在设计之初就充分考虑了TypeScript的支持,使开发者能够更安全地编写代码。
- Tree-shaking: 提供了更好的Tree-shaking支持,使得打包体积更小。
Vue 3的优势与应用场景
优势:
- 性能优异:更快的虚拟DOM和响应式系统。
- 更好的代码组织:Composition API使得代码模块划分更加清晰。
- 现代工具链:Vue 3与现代开发工具(如Vite)无缝集成,提升开发体验。
应用场景:
- 中大型前端项目:例如电商平台、社交网络、后台管理系统。
- 移动端应用:通过Vue与跨平台框架如Ionic、Weex或Capacitor结合。
- 单页应用(SPA):通过Vue Router和Vuex打造高性能SPA。
2. 创建Vue 3项目
使用Vue CLI创建项目
Vue CLI是Vue官方提供的一款脚手架工具,它极大地简化了项目的创建和配置过程。以下是使用Vue CLI创建Vue 3项目的步骤:
-
安装Vue CLI:
npm install -g @vue/cli
-
创建新项目:
vue create my-vue3-project
-
选择所需的配置:
- 手动选择特性:如Babel、TypeScript、Router、Vuex、CSS Pre-processors等。
- 保存配置以供将来使用。
-
进入项目目录:
cd my-vue3-project
-
启动开发服务器:
npm run serve
于此,你将成功创建并运行一个基本的Vue 3项目。
项目结构介绍
一个典型的Vue 3项目包含以下文件和目录:
-
node_modules/
: 项目依赖包存放目录。 -
public/
: 静态文件,例如html、ico等。 -
src/
: 源代码目录,主要包括以下子目录和文件:assets/
: 存放静态资源,如图片、CSS文件。components/
: 通用组件存放目录。views/
: 页面级别组件存放目录(当使用vue-router时)。App.vue
: 根组件。main.js
: 入口文件。router/index.js
: 路由配置文件(当使用vue-router时)。store/index.js
: 状态管理配置文件(当使用vuex时)。
-
package.json
: 项目配置文件,记录项目信息和依赖包。 -
babel.config.js
: Babel配置文件。 -
vue.config.js
: Vue CLI配置文件。
项目配置
Vue CLI提供了极大的灵活性,允许通过vue.config.js
文件进行项目配置。以下是一些常见的配置项:
module.exports = {
// 基本路径
publicPath: './',
// 生成的打包文件目录
outputDir: 'dist',
// 存放静态文件的目录
assetsDir: 'static',
// eslint-loader 是否在保存的时候检查
lintOnSave: true,
// 是否使用带有浏览器内编译器的完整构建版本
runtimeCompiler: false,
// 开启生产环境的 source map
productionSourceMap: false,
// 三方插件的选项
pluginOptions: {},
// webpack配置
configureWebpack: {
resolve: {
alias: {
'@': path.resolve(__dirname, 'src')
}
}
},
// 开发服务器配置
devServer: {
open: true,
host: 'localhost',
port: 8080,
https: false,
hotOnly: false,
proxy: null,
}
};
3. 基本概念
响应式系统
Vue 3的响应式系统是其核心特性之一,Vue 3使用Proxy代替Vue 2中的getter/setter实现,实现了更高效的响应追踪和更少的性能开销。
Reactive和Ref
reactive
用于创建响应式对象,而ref
用于创建基本类型的响应式引用。
import { reactive, ref } from 'vue';
const state = reactive({ count: 0 });
const count = ref(0);
state.count++;
count.value++;
Computed和Watch
computed
用于定义计算属性,watch
用于监听数据变化。
import { reactive, computed, watch } from 'vue';
const state = reactive({ count: 0 });
const doubledCount = computed(() => state.count * 2);
watch(() => state.count, (newValue, oldValue) => {
console.log(`Count changed from ${oldValue} to ${newValue}`);
});
Composition API
Composition API是Vue 3的亮点,使得代码在逻辑复用和模块化方面更加高效和灵活。
setup函数
setup
函数是Composition API的核心,用于组合逻辑片段。
import { reactive, toRefs } from 'vue';
export default {
setup() {
const state = reactive({ count: 0 });
function increment() {
state.count++;
}
return {
...toRefs(state),
increment
};
}
};
生命周期钩子
Vue 3中,生命周期钩子可以在setup
中使用组合式API的函数来管理。
import { onMounted, onUnmounted } from 'vue';
export default {
setup() {
onMounted(() => {
console.log('Component is mounted!');
});
onUnmounted(() => {
console.log('Component is unmounted!');
});
}
};
4. 模板与指令
Vue模板语法
Vue的模板语法基于HTML,允许将模板与数据绑定,从而自动渲染界面。
<template>
<div>
<h1>{{ message }}</h1>
</div>
</template>
<script>
export default {
data() {
return {
message: 'Hello, Vue 3!'
};
}
};
</script>
条件渲染
可以使用v-if
和v-show
进行条件渲染。
<template>
<div v-if="isShown">Content is shown</div>
<div v-else>Content is hidden</div>
</template>
<script>
export default {
data() {
return {
isShown: true
};
}
};
</script>
列表渲染
可以使用v-for
进行列表渲染。
<template>
<ul>
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>
</template>
<script>
export default {
data() {
return {
items: [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' }
]
};
}
};
</script>
事件处理
可以使用v-on
进行事件处理。
<template>
<button @click="handleClick">Click Me</button>
</template>
<script>
export default {
methods: {
handleClick() {
console.log('Button clicked!');
}
}
};
</script>
表单绑定
可以使用v-model
进行双向绑定。
<template>
<input v-model="message" />
</template>
<script>
export default {
data() {
return {
message: ''
};
}
};
</script>
组件和插槽
可以定义和使用组件,以及使用插槽实现组件内容分发。
<!-- ParentComponent.vue -->
<template>
<ChildComponent>
<template v-slot:default>
<p>This is a slot content</p>
</template>
</ChildComponent>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
}
};
</script>
<!-- ChildComponent.vue -->
<template>
<div>
<slot></slot>
</div>
</template>
5. 组件
组件基础
组件是Vue应用的基本组成单位,可以通过<script setup>
或<script>
来定义。
<!-- MyComponent.vue -->
<template>
<div>{{ message }}</div>
</template>
<script>
export default {
data() {
return {
message: 'Hello from MyComponent'
};
}
};
</script>
<!-- App.vue -->
<template>
<MyComponent />
</template>
<script>
import MyComponent from './MyComponent.vue';
export default {
components: {
MyComponent
}
};
</script>
父子组件通信
可以通过props
和emit
进行父子组件通信。
<!-- ChildComponent.vue -->
<template>
<button @click="emit('increment')">Increment</button>
</template>
<script>
export default {
emits: ['increment']
};
</script>
<!-- ParentComponent.vue -->
<template>
<ChildComponent @increment="handleIncrement" />
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
},
methods: {
handleIncrement() {
console.log('Increment event received');
}
}
};
</script>
Provide/Inject
provide
和inject
用于跨层级组件间通信。
<!-- ParentComponent.vue -->
<template>
<ChildComponent />
</template>
<script>
import { provide, ref } from 'vue';
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
},
setup() {
const sharedData = ref('Shared Data');
provide('sharedData', sharedData);
}
};
</script>
<!-- ChildComponent.vue -->
<template>
<div>{{ sharedData }}</div>
</template>
<script>
import { inject } from 'vue';
export default {
setup() {
const sharedData = inject('sharedData');
return {
sharedData
};
}
};
</script>
动态组件
可以使用<component>
和is
属性实现动态组件。
<template>
<component :is="currentComponent" />
</template>
<script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';
export default {
data() {
return {
currentComponent: 'ComponentA'
};
},
components: {
ComponentA,
ComponentB
}
};
</script>
异步组件
可以使用defineAsyncComponent
定义异步组件。
import { defineAsyncComponent } from 'vue';
export default {
components: {
AsyncComponent: defineAsyncComponent(() => import('./AsyncComponent.vue'))
}
};