Vue3【进阶】

简介

https://cn.vuejs.org/guide/introduction.html

创建vue3工程

【基于 vue-cli创建】

基本和vue-cli的过程类似,只是选择的时候用vue3创建

【基于vite创建】【推荐】

【官网】https://vitejs.cn/ 【可以先去学一下webpack】
image.png
image.png

步骤 【https://cn.vitejs.dev/guide/】

npm create vue@latest
pnpm create vue

你还可以通过附加的命令行选项直接指定项目名称和你想要使用的模板。例如,要构建一个 Vite + Vue 项目,运行:
bash

# npm 7+, extra double-dash is needed:
npm create vite@latest my-vue-app -- --template vue# yarn
yarn create vite my-vue-app --template vue# pnpm
pnpm create vite my-vue-app --template vue# bun
bun create vite my-vue-app --template vue

查看 create-vite 以获取每个模板的更多细节:vanilla,vanilla-ts, vue, vue-ts,react,react-ts,react-swc,react-swc-ts,preact,preact-ts,lit,lit-ts,svelte,svelte-ts,solid,solid-ts,qwik,qwik-ts。

命令行创建

image.png
image.png

小结

image.png

VUE3核心语法

【optionsAPI】和【compositionAPI】->【vue2】和【vue3】

image.png
image.png
image.png
image.png

拉开序幕的【setup】

image.png

  • 新的配置项
  • setup语法糖出现时机在beforecreated之前
  • setup的返回值也是一个渲染函数

【面试题】setup和vue2中的data、method有什么区别?

  • 可以同时存在
  • setup执行的比data的早(data可以拿到setup中的值,但是反过来拿不到)

Setup语法糖

之前的写法
image.png
缺点是:每次都要返回数据和方法
语法糖写法
image.png
不需要返回,setup自动给你返回;只关注数据和方法
因为最新的语法糖省去了name,则利用插件npm i vite-plugin-vue-setup-extend -D来命名
image.png
image.png
一般其实和文件名一样可以不写

ref_可以实现【基本类型】响应式数据 【让数据动起来】

vue2->都放在data中,就是响应式了
vue3->ref 和 reative 此ref不是vue2中的ref
image.png

  • 什么时候需要value和什么时候不需要value是需要注意的点
  • 模块中不需要。JS中操作需要!

作用:
image.png

reactive_创建【对象类型】【只能定义】响应式数据

image.png
image.png

ref_可以实现【对象类型】响应式数据 【让数据动起来】

image.png

需要注意的是:

  • 使用ref的时候必须加上.value去拿到值
  • ref的实现也是基于reactive实现的(底层逻辑)
  • ref既可以定义基本类型也可以对象类型

【ref对比reactive】

image.png

  • 可以用volar插件【目前是官方vue插件】自动添加.value

在设置中进行设置-勾上即可
image.png

toRefs 和 toRef

image.png

<template><h1>hello</h1><h1>姓名:{{ name }}</h1><h1>年龄:{{ age}}</h1><button @click="changeName">修改名字</button><button @click="changeAge">修改年龄</button></template><script setup lang="ts">import { reactive,toRefs } from 'vue';let person = reactive({name: 'John',age:22})// toRefs 就是将reactive中的数据都取出来 数据还是具备响应式let {name, age} = toRefs(person)const changeName = () =>{name.value = 'lisi'}const changeAge = () =>{age.value += 1}
</script><style></style>

computed属性【是有缓存的】

image.png

<template>姓:<input type="text" v-model="names"><br>名:<input type="text" v-model="ming"><br>姓名: <h1>{{fullname}}</h1><button @click="changeFullname">修改全名</button>
</template><script setup lang="ts">
import { ref ,computed} from 'vue';let names= ref('张三')
let ming = ref('ming')// 只读的不可修改的
// let fullname =computed(()=>{
//    return names.value +  ming.value.slice(0,1).toUpperCase() + ming.value.slice(1)
// })
// 这样可读可写
let fullname =computed({get(){return names.value +  ming.value.slice(0,1).toUpperCase() + ming.value.slice(1)},set(vals){const x = vals.split('-')names.value = x[0]ming.value = x[1]console.log(x);},
})
let changeFullname  = ()=>{console.log(fullname.value);fullname.value = 'li-si'}
</script><style></style>

watch监视数据的变化

image.png

情况一【常用】:

image.png

<template><div class="person"><h1>情况一</h1><h1>sum:{{ sum }}</h1><button @click="changeName">点我sum+1</button></div>
</template><script setup lang="ts">
import {ref,watch} from 'vue'
let sum = ref(100)let changeName = ()=>{sum.value += 100
}
const stopWatch =  watch(sum,(newValue,oldValue)=>{console.log(newValue,oldValue);if(newValue>1000){stopWatch()}
})
</script><style></style>

情况二:

image.png
image.png

<template><div class="person"><h1>姓名:{{person.name }}</h1><h2>年龄:{{person.age}}</h2><button @click="changename">修改年龄</button><button @click="changeperson">修改person</button></div>
</template><script lang="ts" setup>
import {ref,watch} from 'vue'let person = ref({name:"zhangsan",age:22,})const changename = () =>{person.value.age += 1;}const changeperson = () =>{// 如果是recative 就要用object.assginperson.value = {name:"zha33ngsan", age:2342}}watch(person,(newValue,oldValue)=>{console.log(newValue,oldValue);},{deep:true,immediate:true})</script><style>.person{background-color: skyblue;box-shadow: 0 0 10px;border-radius: 10px;padding: 10px;}
</style>

情况三:

image.png
看一个案例:ref 和 reactive 对象赋值的区别
image.png

<template><div class="person"><h1>姓名:{{person.name }}</h1><h2>年龄:{{person.age}}</h2><button @click="changename">修改年龄</button><button @click="changeperson">修改person</button></div>
</template><script lang="ts" setup>
import {ref,watch,reactive} from 'vue'let person = reactive({name:"zhangsan",age:22,})const changename = () =>{person.age += 1;}const changeperson = () =>{// 如果是recative 就要用object.assginObject.assign(person,{name:"zha33ngsan", age:2342})}watch(person,(newValue,oldValue)=>{console.log(newValue,oldValue);})</script><style>.person{background-color: skyblue;box-shadow: 0 0 10px;border-radius: 10px;padding: 10px;}
</style>

情况四【常用】【函数式】:

image.png
image.png
结论: 监视的要是对象里面的属性,最好写成函数,注意:若是监视的是地址值,需要关注对象内部。需要开启手动深度监视

<template><div class="person"><h1>姓名:{{person.name }}</h1><h2>年龄:{{person.age}}</h2><h2>汽车:{{person.car.car1}}-{{ person.car.car2 }}</h2><button @click="changename">修改年龄</button><button @click="changeperson">修改person</button><button @click="changeCar1">修改car1</button><button @click="changeCar2">修改car2</button><button @click="changeAll">修改全部</button></div>
</template><script lang="ts" setup>
import {ref,watch,reactive} from 'vue'let person = reactive({name:"zhangsan",age:22,car:{car1:'hello1',car2:'hello2'}})const changename = () =>{person.age += 1;}const changeperson = () =>{// 如果是recative 就要用object.assginObject.assign(person,{name:"zha33ngsan", age:2342})}const changeCar1 = ()=>{person.car.car1 = 'world1'}const changeCar2 = ()=>{person.car.car2 = 'world2'}const changeAll = ()=>{person.car = {car1:'hello221', car2:'hello241'}}watch(()=>{return person.age},(newValue,oldValue)=>{console.log(newValue,oldValue);})watch(()=>person.car,(newValue,oldValue)=>{console.log(newValue,oldValue);},{deep:true})
</script><style>.person{background-color: skyblue;box-shadow: 0 0 10px;border-radius: 10px;padding: 10px;}
</style>

情况五:

监视上述的多个数据【多个函数】
image.png

    watch([()=>person.name,()=>person.car.car1],(newValue,oldValue)=>{console.log(newValue,oldValue);},{deep:true})

【多写项目-练习】

watchEffect

image.png
image.png

标签中ref属性

image.png
image.png

回顾TS中的接口_泛型_自定义类型

image.png

Props的使用

vue2【父子之间的通信】
image.png
vue3通信
image.png
image.png
注意点:【区别一下:的绑定和 ref的区别】
image.png
【父子之间的传值的多种方式】
image.png
【注意:宏函数不用引入,例如defineProps】

理解生命周期【组件的一生】

image.png
创建、挂载、更新、销毁【每个时期都调用特定的函数】
created 、 mounted 、updated 、destoyed
叫法:生命周期、生命周期函数、生命周期钩子

vue2的生命周期

创建、(前与后)(beforeCreate|Created)
挂载、(前与后)(beforeMount|Mounted)
更新、(前与后)(beforeUpdate|updated)
销毁、(前与后)(beforeDestory|destoryed)

vue3的生命周期

创建、setup ----------------------------> (前与后)(beforeCreate|Created)
挂载、onBeforeMount|onMounted—>(前与后)(beforeMount|Mounted)
更新、onBeforeUpdate|onUpdated—>(前与后)(beforeUpdate|updated)
卸载、onBeforeUnmount|onUnmounted---->(前与后)(beforeDestory|destoryed)
image.png

自定义hooks【mixin】【重】

image.png

路由

image.png
image.png
image.png

两个注意点

image.png
路由组件:pages/views
一般组件:components
image.png

to的两种写法

image.png

路由器工作模式

【history 和 hash模式】
image.png
image.png

命名路由

image.png
image.png

嵌套路由

image.png
image.png

路由_query参数

image.png

路由_params参数

image.png

  • 必须为name
  • 参数如果可传可不传则添加?在占位的地方
  • 参数不能为数组和对象

image.png

路由的Props配置

image.png
image.png
image.png
image.png

【注意】
  • 一般组件和路由组件传参的区别

路由的_replace属性

  • push【默认】
  • replace【替换】

image.png

【编程式导航】

image.png

出了routerlink进行跳转还有编程式路由导航

image.png

  • 什么时候进行编程式导航
    • 需要再某个条件下跳转

image.png

路由重定向

image.png

Pinia【对比VUE2中vuex】【集中式状态数据管理】

【redux vuex pinia】
image.png
是vue的最新的状态管理工具,是vuex的替代品
image.png

手动添加pinia

官网:https://pinia.vuejs.org/zh/introduction.html

  1. 使用vite创建一个新的vue3项目
  2. 安装pinia到项目中

用vite安装时注意node的版本

案例

image.png
image.png
lovetalk.vue

<template><div class="lovetalk"><button @click="getLoveTalk">hello</button><ul><li v-for="item in newsList" :key="item.id">{{ item.title }}</li></ul></div>
</template><script lang="ts" setup>
import { reactive } from 'vue';
import axios from 'axios';
import { nanoid } from 'nanoid';
const newsList = reactive([{ id: '12423421', title: 'hel123' },{ id: '1224231', title: 'h424el123' },{ id: '1242341', title: 'he4243l123' },
]);
async function getLoveTalk() {// 下面的写法:连续解构赋值 + 重命名let {data: { content:title },} = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json');//    nanoid 可以随机生成IDlet obj = { id: nanoid(),title};console.log(obj);newsList.unshift(obj);
}
</script><style>
.lovetalk {background-color: skyblue;box-shadow: 0 0 10px;border: 1px solid black;
}
</style>

count.vue

<template><div class="count"><h2>当前求和为:{{sum}}</h2><select v-model.number="n"><option value="1">1</option><option value="2">2</option><option value="3">3</option></select><button @click="add">加</button><button @click="minus">减 </button></div>
</template><script setup lang="ts">
import {ref} from 'vue'
let sum = ref(1)
let n = ref(1)
function add(){sum.value += n.value
}
function minus(){sum.value -= n.value
}
</script><style>
.count {background-color: skyblue;box-shadow: 0 0 10px;border: 1px solid black;
}
</style>

【注意】:引入了axios和nanoid【随机生成id】

搭建pinia环境

npm i pinia
image.png

存取读取数据

image.png
image.png

修改数据的三种方式

image.png
image.png

storeToRefs【只关注store数据】【对数据进行解构操作】

image.png

getters

image.png
对数据的加工

$subscribe

image.png
image.png

store的组合式写法【推荐】

image.png

组件通信_方式1_props 【父子】

image.png
image.png

组件通信_方式2_自定义事件【子传父】

image.png

组件通信_方式3_mitt【任意组件通信】

  • pubsub
  • $bus
  • mitt

image.png
image.png

组件通信_方式4_v-model【通常用于表单】

作用在组件和html的方式【底层】
image.png
image.png
image.png

组件通信_方式5_$atters【祖孙之间通信】【打扰了中间人】

image.png
image.png

组件通信_方式6_ r e f s − refs- refsparent【父->子|子->父】image.png

image.png

组件通信_方式7_provide_inject【提供-注入】【向后代之间通信】【零打扰】

image.png

插槽

默认插槽

image.png

具名插槽【template 中 v-solt & #】【重】【动态的摆放】

image.png
可以用【#s1 、#s2代替v-slot】

作用域插槽

image.png

总结

image.png

其他API

shallowRef 和 shallowReactive

image.png
image.png

readonly 和 shallowReadonly

image.png
image.png

roRaw 和 markRow

image.png
image.png

customRef

image.png
image.png
image.png

Teleport【转移】

image.png

Suspense

image.png

全局api到应用对象

image.png

其他【非兼容性改变】

image.png

面试题:vue3相比vue2做了哪些改变?

https://v3-migration.vuejs.org/zh/breaking-changes/
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/300304.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kubernetes集群添加到jumpserver堡垒机里管理

第一步、在kubernetes集群中获取一个永久的token。 jumpserver堡垒机用api的来管理kubernetes&#xff0c;所以需要kubernetes的token&#xff0c;这个token还需要是一个永久的token&#xff0c;版本变更&#xff1a;Kubernetes 1.24基于安全方面的考虑&#xff08;特性门控Le…

LeetCode-热题100:118. 杨辉三角

题目描述 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1 输出: [[1]]…

代码随想录第32天|455.分发饼干 376. 摆动序列

理论基础 贪心算法核心&#xff1a;选择每一阶段的局部最优&#xff0c;从而达到全局最优。 455.分发饼干 455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09;代码随想录 (programmercarl.com)455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 贪心算法理论基础&am…

【AI绘画/作图】风景背景类关键词模板参考

因为ds官网被墙,所以翻了IDE的源码整理了下stablestudio里的官方模板&#xff0c;顺便每个模板生成了一份…不知道怎么写关键词的可以参考 Stunning sunset over a futuristic city, with towering skyscrapers and flying vehicles, golden hour lighting and dramatic cloud…

C语言高效的网络爬虫:实现对新闻网站的全面爬取

1. 背景 搜狐是一个拥有丰富新闻内容的网站&#xff0c;我们希望能够通过网络爬虫系统&#xff0c;将其各类新闻内容进行全面地获取和分析。为了实现这一目标&#xff0c;我们将采用C语言编写网络爬虫程序&#xff0c;通过该程序实现对 news.sohu.com 的自动化访问和数据提取。…

行业型软文怎么写,媒介盒子分享

行业型软文即指面对行业内人群的软文,此类文章的目的通常是为了扩大行业影响力,奠定行业品牌地位。企业的行业地位将直接影响到其核心竞争力,甚至会影响到最终用户的选择。今天媒介盒子就和大家聊聊行业型软文怎么写。 一、了解受众需求&#xff1a; 首先&#xff0c;深入研究…

【C++第三阶段】string容器

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 string容器基本概念构造函数赋值操作拼接操作字符串查找和替换字符串比较字符串存取字符串插入和删除字符串子串 string容器 基本概念 本质&#x1f449;string是C风格的字符串&…

快速获取文件夹及其子文件夹下的所有文件名

1、在文件夹中新建文本文档&#xff0c;命名为“命令.txt” 2、输入以下内容 tree /F > 文件名.txt dir *.* /B > 文件名.txt 其中文件名和文件格式可以是任意的&#xff0c;tree命令可生成文件及其子文件夹下所有文件的名称&#xff0c;dir命令只生成当前目…

网络基础三——初识IP协议

网络基础三 ​ 数据通过应用层、传输层将数据传输到了网络层&#xff1b; ​ 传输层协议&#xff0c;如&#xff1a;TCP协议提供可靠性策略或者高效性策略&#xff0c;UDP提供实时性策略&#xff0c;保证向下层交付的数据是符合要求的的&#xff1b;而网络层&#xff0c;如&a…

LeetCode 40. 组合总和 II

解题思路 cand[]{1,2,3,4} target4; 相关代码 class Solution {List<List<Integer>> res;List<Integer> path;boolean st[];public List<List<Integer>> combinationSum2(int[] candidates, int target) {path new ArrayList<>();res …

c++前言

目录 1. 什么是 C 2. C 发展史 3. C 的重要性 4. 如何学习 C 5. 关于本门课程 1. 什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的 程序&#xff0c;需要高度的抽象和建模时&#xff0c; C 语言则不合适…

Acwing.1388 游戏(区间DP对抗思想)

题目 玩家一和玩家二共同玩一个小游戏。 给定一个包含 N个正整数的序列。 由玩家一开始&#xff0c;双方交替行动。 每次行动可以在数列的两端之中任选一个数字将其取走&#xff0c;并给自己增加相应数字的分数。&#xff08;双初始分都是 0分&#xff09; 当所有数字都被…

备战蓝桥杯---线段树应用2

来几个不那么模板的题&#xff1a; 对于删除&#xff0c;我们只要给那个元素附上不可能的值即可&#xff0c;关键问题是怎么处理序号变化的问题。 事实上&#xff0c;当我们知道每一个区间有几个元素&#xff0c;我们就可以确定出它的位置&#xff0c;因此我们可以再维护一下前…

优秀企业都在用的企微知识库,再不搭建就晚了!

每个团队都在寻找让工作效率提升的方法。如果你想知道哪些团队能够高效地完成任务&#xff0c;而另一些却步履维艰&#xff0c;那么答案可能就是“企业微信知识库”。见过很多团队都在使用它&#xff0c;而且效果非常显著。如果你还没有搭建属于自己的企微知识库&#xff0c;可…

C++ 【原型模式】

简单介绍 原型模式是一种创建型设计模式 | 它使你能够复制已有对象&#xff0c;客户端不需要知道要复制的对象是哪个类的实例&#xff0c;只需通过原型工厂获取该对象的副本。 以后需要更改具体的类或添加新的原型类&#xff0c;客户端代码无需改变&#xff0c;只需修改原型工…

各类系统业务功能架构图整理

一、前言 很多软件系统一直经久不衰&#xff0c;主要这些系统都是一些生产工作经营不可或缺的系统。比如财务系统&#xff0c;商城系统&#xff0c;支付系统&#xff0c;供应链系统&#xff0c;人力资源管理系统&#xff0c;ERP系统等等。这些系统不管大公司还是小公司往往都需…

简约轻量-失信录系统源码

失信录系统-最新骗子收录查询系统源码 首页查询&#xff1a; 举报收录页&#xff1a; 后台管理页&#xff1a; 失信录系统 V1.0.0 更新内容&#xff1a; 1.用户查询,举报功能 2.界面独立开发 3.拥有后台管理功能 4.xss,sql安全过滤 5.平台用户查询 6.用户中心&#xff08;待完…

揭开“栈和队列”的神秘面纱

前言 在线性表中不止有顺序表和链表&#xff0c;今天的主角就如标题所说--->认识栈和队列。把他们俩放一起总结是有原因的&#xff0c;还请看官听我娓娓道来~ 什么是栈&#xff1f; 栈&#xff08;stack&#xff09;是限定仅在表尾进行插入和删除操作的线性表 咱可以把栈理…

【活动创作】未来AI技术方面会有哪些创业机会

放假期间突然看到这个活动创作&#xff0c;觉得很有意思&#xff0c;既然如此&#xff0c;我就先让AI来回答一下吧&#xff0c;哈哈 1、文心一言 首先来看看文心一言的回答&#xff1a; 2、讯飞星火 然后来看看讯飞星火的回答&#xff1a; 3、个人感受 最后来说说给人感受吧&am…

深入剖析主机安全中的零信任机制及其实施原理

引言 在数字化转型加速与云端服务普及的大背景下&#xff0c;传统依赖边界的网络安全模式逐渐显露出其局限性。面对愈发复杂多变的威胁环境&#xff0c;零信任安全架构作为新一代的安全范式应运而生&#xff0c;尤其是在主机层面的安全实践中&#xff0c;零信任机制正扮演着至…