当前位置: 首页 > news >正文

《vue3学习手记4》

vue3的生命周期

vue2生命周期 分为四个阶段,分别是创建,挂载,更新,销毁。包含八个钩子
vue3生命周期 分为四个阶段,分别是创建,挂载,更新,卸载。包含八个钩子
vue2和vue3钩子的名字有区别,且写法也有区别。

<template><div class="app"><h2>和为:{{sum}}</h2><button @click="add">点我sum+1</button></div>
</template><script lang="ts" setup name="Person">import {onBeforeMount, onBeforeUnmount, onBeforeUpdate, onMounted, onUnmounted, onUpdated, ref} from "vue"let sum=ref(0)function add(){sum.value++}
// ==========================================================================// 第一阶段:创建 setup  (脚本中就是setup函数,所以在vue3中创建阶段直接输出)console.log("创建了")
// 当打开页面控制台就输出“创建了”// ==========================================================================// 第二阶段:挂载 (挂载前:onBeforeMount; 挂载后:onMounted)onBeforeMount(()=>{console.log("挂载前")})onMounted(()=>{console.log("挂载完成")})
// 当打开页面控制台就输出“挂载前”和“挂载完成”// ==========================================================================// 第三阶段:更新 (更新前:onBeforeUpdate; 更新后:onUpdated)onBeforeUpdate(()=>{console.log("更新前")})onUpdated(()=>{console.log("更新完成")})
// 当点击按钮,sum值发生改变控制台就输出“更新前”和“更新完成”// ==========================================================================// 第四阶段:卸载 (卸载前:onBeforeUnmount; 卸载后:onUnmounted)onBeforeUnmount(()=>{console.log("卸载前")})onUnmounted(()=>{console.log("卸载完成")})
// 看App组件的条件渲染,当布尔值为false控制台就输出“卸载前”和“卸载完成”,此时组件被卸载
</script>

App.vue:

<template><!-- 这里使用 v-if而不使用v-show,是因为v-if会将不展示的组件销毁,便于演示;但v-show将不展示的组件用display:none进行隐藏--><Person v-if="isShow"/>
</template><script lang="ts" setup name="App">import Person from "./components/Person.vue"// 只需引入,不用注册组件,vue3引入之后会自动注册import {ref} from "vue"let isShow=ref(false)</script>

tips:
对子组件和父组件都进行挂载,则子组件先呈现,父组件再呈现,这和vue的解析流程有关

Hooks

先按照以前的方法写:

<template><div class="app"><h2>和为:{{sum}}</h2><button @click="add">点我sum+1</button><hr><img v-for="(image,index) in images" :key="index" :src="image" alt="小狗图片"><br><button @click="addImage">点击按钮获取一张图片</button></div>
</template><script lang="ts" setup name="Person">
// 要求:从提供的接口获取图片,点击按钮增加一个图片,并使其排成一行
import { ref,reactive } from 'vue';
import axios from "axios"let sum=ref(0)let images=reactive([])// 求和function add(){sum.value++}// 获取图片async function addImage(){try{   //使用try...catch捕获错误信息let result=await axios.get("https://dog.ceo/api/breed/pembroke/images/random")// console.log(result.data.message)images.push(result.data.message)} catch (error){alert(error)}}
</script><style>.app {background-color: #ddd;box-shadow: 0 0 10px;border-radius:10px;padding: 20px;}img {height: 150px;padding-left: 10px;}</style>

这样写并没有显现出vue3组合式开发的好处,一个组件处理的求和事件和获取图片的事件都写在一起,比较混乱
所以可以使用hooks,将所要处理的事件分开写就会很清晰,真正实现vue3组合式开发
使用hooks:
针对上述案例,在src下创建Hooks文件夹,文件夹下创建sumInfo.ts和dogInfo.ts
sumInfo.ts:

import { ref,reactive } from 'vue';
// 用函数包起来并暴露
export default function () {let sum=ref(0)// 求和function add(){sum.value++}// 把数据和方法等进行的操作交出去return {sum,add}
}

dogInfo.ts:

import { ref,reactive } from 'vue';
import axios from "axios"
// 用函数包起来并暴露
export default function () {let images=reactive([])// 获取图片async function addImage(){try{   //使用try...catch捕获错误信息let result=await axios.get("https://dog.ceo/api/breed/pembroke/images/random")// console.log(result.data.message)images.push(result.data.message)} catch (error){alert(error)}}// 把数据和方法等进行的操作交出去return {images,addImage}
}

person.vue:

<template><div class="app"><h2>和为:{{sum}}</h2><button @click="add">点我sum+1</button><hr><img v-for="(image,index) in images" :key="index" :src="image" alt="小狗图片"><br><button @click="addImage">点击按钮获取一张图片</button></div>
</template><script lang="ts" setup name="Person">
import sumInfo from "@/hooks/sumInfo"
import dogInfo from "@/hooks/dogInfo";
// 解构
const {sum,add}=sumInfo()
const {images,addImage}=dogInfo()
</script><style>.app {background-color: #ddd;box-shadow: 0 0 10px;border-radius:10px;padding: 20px;}img {height: 150px;padding-left: 10px;}</style>

效果图:
在这里插入图片描述

路由的基本切换

路由的基本切换

1.和vue2基本相同
但vue3中需要进行引入
import {RouterView} from "vue-router"
import {RouterLink} from "vue-router"
2.路由组件一般放在pages或views文件夹下,一般组件放在components文件夹下。
3.切换掉的路由组件默认被卸载,再次切换回来时,再进行挂载。

路由的工作模式

vue2:mode:"history" /mode:"hash"
vue3:
HTML5模式:history:createWebHistory 相当于vue2中的history模式
hash模式:history: createWebHashHistory(), 相当于vue2中的hash模式
Memory模式: history: createMemoryHistory(),
hash模式带#号,兼容性更强,担当分享链接时,#可能会被标记为不合法。
history模式不带#号,页面美观,但可能刷新页面会出现404的问题。

相关文章:

  • 《前端面试题之 Vue 篇(第二集)》
  • await 在多线程,子线程中的使用
  • 大模型赋能工业制造革新:10个显效可落地的应用场景
  • 字符设备驱动程序的另一种注册方法
  • IoT FEM射频前端模组芯片(2.4G PA)三伍微电子GSR2401 兼容替代RFX2401
  • 408数据结构绪论刷题001
  • 3.Rust + Axum 提取器模式深度剖析
  • 红宝书第四十九讲:XSS/CSRF攻击防御策略解析
  • 从零上手GUI Guider学习LVGL——Button
  • AI与思维模型——耗散结构思维模型【64】
  • 第十七届“华中杯”大学生数学建模挑战赛题目A题 晶硅片产销策略优化 完整成品 代码 模型 思路 分享
  • 动态规划专题5:最长上升子序列
  • MIX-LN: UNLEASHING THE POWER OF DEEP LAYERS BY COMBINING PRE-LN AND POST-LN
  • 计算生物学在中国的发展情况?
  • C 语言实现 HTTP 和 HTTPS 通信的例程
  • 高度图(Heightmap)
  • H5 swiper.js slide滑动失效问题解决
  • Vert.x学习(五)—— SockJS,搭建客户端,与后端服务器进行通信
  • Tomcat与Servlet(2)
  • 【Ai】CherryStudio 详细使用:本地知识库、MCP服务器
  • 种罂粟喂鸡防病?四川广元一村民非法种植毒品原植物被罚​
  • 体坛联播|穆勒主场完成拜仁谢幕战,山西车队再登环塔拉力赛
  • 网红街区如厕难,如何多管齐下补缺口?
  • 跨越时空的“精神返乡”,叶灵凤藏书票捐赠上海文学馆
  • 印度最新发声:对所有敌对行动均予以反击和回应,不会升级冲突
  • 中日有关部门就日本水产品输华问进行第三次谈判,外交部回应