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.assgin
        person.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.assgin
        Object.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.assgin
        Object.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 可以随机生成ID
    let 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL入门到实战-第三弹

PostgreSQL入门到实战 PostgreSQL安装之linux官网地址PostgreSQL概述linux安装PostgreSQL更新计划 PostgreSQL安装之linux 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://www.postgresql.org/PostgreSQL概述 Postg…

【全套源码教程】基于SpringBoot+MyBatis+Vue的流浪动物救助网站的设计与实现

目录 前言 需求分析 可行性分析 技术实现 后端框架&#xff1a;Spring Boot 持久层框架&#xff1a;MyBatis 前端框架&#xff1a;Vue.js 数据库&#xff1a;MySQL 功能介绍 前台界面功能介绍 动物领养及捐赠 宠物论坛 公告信息 商品页面 寻宠服务 个人中心 购…

AI视觉入门:卷积和池化

从2012年以AlexNet为代表的模型问世以来&#xff0c;人工智能尤其是视觉cv部分飞速发展&#xff0c;在刚开始效果不如人类&#xff0c;到2015年在ImageNet1000数据集的表现就超过了人类。在Transformer模型出现之前&#xff0c;视觉模型的主要组成部分就是卷积和池化&#xff0…

在家也能赚钱!长期副业兼职,充分利用你的零碎时间!

2024年已然匆匆走过了三分之一&#xff0c;许多人或许都感受到了这一年大环境带来的压力。然而&#xff0c;对我而言&#xff0c;每个月的副业收入尚算可观&#xff0c;稳定在3000元以上&#xff0c;这让我深感庆幸&#xff0c;因为我找到了那份适合自己的副业。 打工的日子&a…

【40分钟速成智能风控1】互联网金融风险管理简介

目录 瓦联网金融的发展和现状 风险管理类型划分 欺诈风险 第一方和第三方 账户级和交易级 个人和团伙 互联网金融是传统金融业务与新兴互联网技术结合的一个交叉领域&#xff0c;例如互联网公司开展的金融业务&#xff0c;或者金融机构的线上化服务&#xff0c;都属于互联…

python 如何生成uuid

UUID&#xff08;Universally Unique Identifier&#xff09;是通用唯一识别码&#xff0c;在许多领域用作标识&#xff0c;比如我们常用的数据库也可以用它来作为主键&#xff0c;原理上它是可以对任何东西进行唯一的编码的。作为新手一看到类似varchar(40)这样的主键就觉得有…

从零到一:如何使用亮数据代理快速收集训练数据打造自己的AIGC大模型

这里写自定义目录标题 前言项目内容项目进展 1、本章节事项1.1、确定2个分类1.2、寻找来源网站1.2.1、京东搜索1.2.2、淘宝搜索1.2.3、唯品会搜索 1.3、编写代码&#xff0c;收集数据&#xff0c;并按照分类存放图片1.3.1、在Java项目里加载SeleniumChromeDriverJsoup的jar包1.…

【计算机毕业设计】医院电子病历管理系统

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

蓝桥杯刷题-05-子串简写-暴力

#include <iostream>using namespace std; string s; int main() {// 请在此输入您的代码int k0;int num0;char c1,c2;cin>>k;cin>>s;cin>>c1>>c2;int lens.size();for(int i0;i<len-k1;i){for(int ji1;j<len;j){if(s[i]c1&&s[j]c…

基于R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析教程

原文链接&#xff1a;基于R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247600473&idx6&sn431e9408a42862d29fe4f4ef7703595b&chksmfa8208becdf581a820d9479d2aa61b88e96612c4ab72b0…

用苹果CMS一小时搭建自己的私人影院(仅供学习与参考,请勿用于商业用途)

用苹果CMS一小时搭建自己的私人影院&#xff08;仅供学习与参考&#xff0c;请勿用于商业用途&#xff09; 一、购买域名和服务器空间或虚拟主机空间。 二、下载苹果CMS影视安装程序到本地。 三、上传苹果CMS安装程序至你的空间并安装。 四、后台设置完善你的电影网站。 五、…

亚马逊店铺引流:海外云手机的利用方法

在电商业务蓬勃发展的当下&#xff0c;亚马逊已经成为全球最大的电商平台之一&#xff0c;拥有庞大的用户群和交易量。在激烈的市场竞争中&#xff0c;如何有效地吸引流量成为亚马逊店铺经营者所关注的重点。海外云手机作为一项新兴技术工具&#xff0c;为亚马逊店铺的流量引导…

4.网络编程-websocket(golang)

目录 什么是websocket golang中使用websocket Server端 Client端 什么是websocket WebSocket是一种在互联网上提供全双工通信的协议&#xff0c;即允许服务器和客户端之间进行双向实时通信的网络技术。它是作为HTML5的一部分标准化的&#xff0c;旨在解决传统HTTP协议在实…

“Java泛型” 得所憩,落日美酒聊共挥

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…

Leetcode 64. 最小路径和

心路历程&#xff1a; 第一反应像是一个回溯问题&#xff0c;但是看到题目中要求最值&#xff0c;大概率是一道DP问题。并且这里面的递推关系也很明显。 这里面边界条件可以有多种处理方法。 解法&#xff1a;动态规划 class Solution:def minPathSum(self, grid: List[List…

代码随想录算法训练营第42天| 背包问题、416. 分割等和子集

01 背包 题目描述&#xff1a;有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 二维dp数组01背包&#xff1a; 确定dp数组以及下标的含义 …

【aster-boot】1.快速搭建springboot3.x多模块项目

springboot3已经出来一段时间了&#xff0c;正好最近也不太忙&#xff0c;就把之前搭的架子整理了一下。   关于springboot3的介绍&#xff0c;以及它的新特性就不再赘述&#xff0c;大家自行百度。 0.前期准备 因springboot3对jdk的最低要求是jdk17&#xff0c;所以需先下载…

河海大学-海洋学院2024年硕士研究生调剂通知

一、调剂专业及计划具体调剂专业及计划可参见河海大学研究生院官网《河海大学2024年硕士研究生调剂通知》和附件。 二、调剂报名与复试要求 1.报名条件&#xff1a;调剂原则见《河海大学202 4年硕士研究生调剂通知》&#xff0c;详细要求见中国研究生招生信息网“全国硕士研究…

Redis数据库③主从复制+哨兵模式+集群模式

一.Redis主从复制 1.概念 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(Master)&#xff0c;后者称为从节点(Slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。 默认情况下&#xff0c;每台…

【动态规划-状态压缩dp】【蓝桥杯备考训练】:毕业旅行问题、蒙德里安的梦想、最短Hamilton路径、国际象棋、小国王【已更新完成】

目录 1、毕业旅行问题&#xff08;今日头条2019笔试题&#xff09; 2、蒙德里安的梦想&#xff08;算法竞赛进阶指南&#xff09; 3、最短Hamilton路径&#xff08;《算法竞赛进阶指南》&模板&#xff09; 4、国际象棋&#xff08;第十二届蓝桥杯省赛第二场C A组/B组&#…