赞
踩
什么是vue
Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。
单页面(SPA)和多页面(MPA)的介绍
1)单页面应用: SPA是指整个应用只有一个HTML文件,所有页面内容都包含在这个HTML文件中,但页面之间的跳转仅刷新局部资源,
①其优点包括用户体验好(因为不需要重新加载整个页面)②更好的性能(通过缓存和懒加载技术),以及前后端分离的开发模式,便于维护和升级,
①其缺点包括SEO不友好(因为只有一个HTML文件),②首屏加载可能较慢,以及浏览器兼容性问题。
多页面应用。MPA是指每个页面对应一个HTML文件,每次页面跳转时都需要重新加载整个页面,这种应用模式通常使用后端模板引擎如JSP或Thymeleaf来生成页面,
①其优点包括更好的浏览器兼容性和SEO友好性(因为每个页面都有独立的URL),以及开发效率较高(因为每个页面是独立的),
②其缺点包括用户体验较差(每次跳转都需要重新加载页面),以及开发和维护成本较高。
工程创建
3.1:vue-cil 创建
查看@vue/cli版本,确保@vue/cli版本在4.5.0以上
vue --version
安装或者升级你的@vue/cli
npm install -g @vue/cli
创建 项目名称为vue_test的vue3项目
vue create vue_test
启动
cd vue_test // 进入vue_test项目文件
npm run serve // 启动vue3项目
Vue cli创建项目时键盘操作无效;vue3.0项目搭建自定义配置
3.2:使用 vite 创建
Vite 是一个 web 开发构建工具,由于其原生 ES 模块导入方式,可以实现闪电般的冷服务器启动。(这里不详细研究)
通过在终端中运行以下命令,可以使用 Vite 快速构建 Vue 项目。
npm 6.x
npm init vite@latest 项目文件名称 --template vue
npm 7+,需要加上额外的双短横线
npm init vite@latest 项目文件名称 – --template vue
cd 项目文件名称
npm install // 安装node依赖包
npm run dev // 启动vue3项目
3.3:对比两种方式创建项目# Vue 3 的新特性
vite 优势如下:
① 开发环境中,无需打包操作,可快速的冷启动。
② 轻量快速的热重载(HMR)。
③ 真正的按需编译,不再等待整个应用编译完成。
传统 webpack 编译:每次执行编译时,都会通过入口 entry 先去找到各个路由,再去加载每个路由各自的模块,然后会进行打包成为 bundle.js 文件,最后才通知服务器热更新。所以换句话说就是等所有文件加载就绪之后才去渲染更新页面的==》较慢
vite 编译:与传统构建不同的是,vite 会先准备好服务器更新,再去找到入口文件然后再动态的找到需要加载的路由去编译那个路由下的模块,类似于按需加载,总体体积较小且更新更快。
Vue 3 的新特性包括
- 组合式API:这是Vue 3最重要的新特性之一,它允许更灵活、更逻辑化地组织代码。
- 更好的性能:Vue 3的虚拟DOM重写,提供了更快的挂载、修补和渲染速度。
- 更小的打包大小:由于新的架构和树摇技术,Vue 3的打包大小比Vue 2小。
- 更好的TypeScript支持:Vue 3在内部使用了TypeScript,因此它为开发者提供了更好的TypeScript支持
Vue 3与Vue 2的主要区别包括:
- 构建:Vue 3使用monorepo架构,更容易管理和维护。
- API:Vue 3引入了新的组合式API,它提供了更灵活的代码组织方式。
- 性能:Vue 3提供了更好的性能,包括更快的渲染速度和更小的打包大小。
- TypeScript:Vue 3提供了更好的TypeScript支持。
Composition api
// 选项式 (option)API, <template> <button @click="increment">Count is: {{ count }}</button> </template> <script> export default { // data() 返回的属性将会成为响应式的状态 // 并且暴露在 `this` 上 data() { return { count: 0 } }, // methods 是一些用来更改状态与触发更新的函数 // 它们可以在模板中作为事件监听器绑定 methods: { increment() { this.count++ } }, // 生命周期钩子会在组件生命周期的各个不同阶段被调用 // 例如这个函数就会在组件挂载完成后被调用 mounted() { console.log(`The initial count is ${this.count}.`) } } </script>
<template> <button @click="increment">Count is: {{ count }}</button> </template> <script setup> import { ref, onMounted } from 'vue' // 响应式状态 const count = ref(0) // 用来修改状态、触发更新的函数 function increment() { count.value++ } // 生命周期钩子 onMounted(() => { console.log(`The initial count is ${count.value}.`) }) </script>
export default {
setup() {
let name = 'zhang'
function at() {
console.log(1)
}
return {
name,
at,
}
},
}
// 若返回一个渲染函数:则可以自定义渲染内容
import { h } from 'vue'
export default {
setup() {
return () => h('h1', '你好')
},
}
注意 vue3 虽然可以向下兼容 vue2,但是尽量不能混合使用。
Vue2.x 配置(data、methos、computed…)中可以访问到 setup 中的属性、方法
但是由于 setup 中没有 this,所以 setup 中没办法读取 Vue2.x 配置中的数据和方法
如果有重名, setup 优先
setup 的注意点
数问题 setup 接收 2 个参数
setup 执行的时机是最早的,在 beforeCreate 之前执行,所以此时 this 是 undefined 参
// 在子组件中 export default { props: ['msg', 'school'], emits: ['hello'], setup(props, context) { // props:值为对象,包含:组件外部传递过来,且组件内部声明接收了的属性。 // props接收props配置项中的相应式数据{msg:'',school:''} // context相当于上下文对象,里面有三个值attrs,slots,emit // attrs: 值为对象,包含:组件外部传递过来,但没有在props配置中声明的属性, 相当于 ```this.$attrs```。 // slots: 收到的插槽内容, 相当于 ```this.$slots```。 // emit: 分发自定义事件的函数, 相当于 ```this.$emit``` //方法 function test() { // 调用父组件方法 context.emit('hello', 666) } return { test, } }, }
Teleport
Teleport 是一个内置组件,它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。
应用场景:
一个组件模板的一部分在逻辑上从属于该组件,但从整个应用视图的角度来看,它在 DOM 中应该被渲染在整个 Vue 应用外部的其他地方。
主要解决的问题 因为Teleport节点挂载在其他指定的DOM节点下,完全不受父级style样式影响
<button @click="open = true">Open Modal</button>
<Teleport to="body">
<div v-if="open" class="modal">
<p>Hello from the modal!</p>
<button @click="open = false">Close</button>
</div>
</Teleport>
<teleport :disabled="true" to='body'>
<A></A>
</teleport>
<!-- 确保有一个具有.modal类的元素在某处 -->
<div class="modal">
<!-- 这里的内容将会被Teleport传送进来 -->
</div>
<!-- Vue组件中使用Teleport -->
<Teleport to=".modal">
<!-- 这里是你想要传送的内容 -->
</Teleport>
<!-- 确保有一个具有.modal类的元素在某处 -->
<div id="modals"></div>
<!-- Vue组件中使用Teleport -->
<Teleport to="#modals">
<div>A</div>
</Teleport>
<Teleport to="#modals">
<div>B</div>
</Teleport>
Fragments 是什么?
在传统的 Vue 2 中,如果我们想渲染多个子元素,写多个根元素会报错,通常需要使用一个包裹元素来包含这些子元素。
<template>
<div>
<h1>标题</h1>
<p>正文内容</p>
<button>点击我</button>
</div>
</template>
vue3引入了Fragments, 模板中可以存在多个根元
<template>
<div><div>
<div><div>
<div><div>
</template>
Fragments 的优势
简洁性
Fragments 允许我们在不引入多余包裹元素的情况下,组合和渲染多个子元素。这样可以减少 DOM 结构的嵌套层级,使代码更加简洁易读。
更好的性能
相对于使用包裹元素的方式,Fragments 可以减少不必要的 DOM 元素,从而提高渲染性能。因为在 Fragments 中,不会创建额外的 DOM 节点。
更好的样式控制
使用 Fragments 可以避免引入额外的包裹元素,从而减少对样式的影响。特别是在使用 CSS 布局库或者进行样式复用时,Fragments 可以提供更好的样式控制。
注意事项 在使用 Fragments 时,需要确保你的项目使用了 Vue 3 或更高版本。如果你正在使用 Vue 2
或之前的版本,是不支持 Fragments 的。另外,需要注意 Fragments 的语法使用尖括号 <> 和 </>,而不是普通的 HTML 标签
全局 API 重命名
Vue 3 中,许多全局 API 的名称被重命名,以下是一些需要注意的。
更好的 Tree-Shaking 支持
- tree-shaking是依赖于ES6的模块特性,即模块必须是ESM(ES Module)。这是因为ES6模块的依
赖关系是确定的、静态的,和运行的时的状态无关,可以进行静态分析。- tree-shaking只对使用export导出的变量生效
import { createApp } from 'vue' import App from './App.vue' import { createStore } from 'vuex' import { createRouter, createWebHistory } from 'vue-router' const store = createStore({ state: { count: 0 } }) const router = createRouter({ history: createWebHistory(), routes: [ { path: '/', component: Home }, { path: '/about', component: About } ] }) const app = createApp(App) app.use(store) app.use(router) app.mount('#app') // 在这个例子中,我们只导入了实际使用的 createApp、createStore 和 createRouter 函数,而没有导入整个 vue 和 vue-router 库。这将使编译器能够在构建时更好地优化我们的应用程序,减少包大小和提高性能。
Tree-Shaking的作用
通过Tree shaking,Vue3给我们带来的好处是:
- 程序体积更小
- 程序执行时间更快
- 程序低耦合便于未来架构的优化
即 Vue 3.0的模块化系统允许你按需加载组件,只引入应用所需的部,避免将整个Vue库全部打包进应用中,从而减小了代码体积;
Vue 3.0的编译器会将模板中未被使用的部分自动优化掉。这意味着如果你的模板中有未使用的元素或指令,它们将不会出现在最终的渲染函数中,从而减少了代码的大小。
<script lang="ts"> import { defineComponent, ref, onMounted, onUnmounted } from 'vue' export default defineComponent({ setup () { const msg = ref<number>(0) const open = ref(false) onMounted(() => { console.log('Component mounted') }) onUnmounted(() => { console.log('Component unmounted') }) return { msg, open } } }) </script> //例子中,我们使用了 onMounted 和 onUnmounted 钩子来处理组件的生命周期。在组件挂载时,onMounted 钩子会被调用,我们可以在这里执行一些初始化操作。在组件卸载时,onUnmounted 钩子会被调用,我们可以在这里清理一些资源。
npm install --save-dev @types/vue
<template>
<div>
{{ message }}
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
let message: string = ref('hello word')
</script>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。