【Vue3】项目实战前基本知识

Vue3+Vite+TypeScript+pinia

      • Vue3更新点
      • 新建项目方式一
      • 新建项目方式二
      • vite-demo目录讲解
        • 安装常用扩展
      • vue3书写风格
          • 动态css也可以这样使用
      • 虚拟DOM
      • Ref全家桶
          • ref小知识1
          • ref小知2,可以直接操作Dom
      • recative全家桶
          • 数组赋值方式一
          • 数组赋值方式二
      • to系列全家桶
      • Vue3的响应式原理
          • Vue2的不足
      • computed计算属性
      • watch侦听器
      • watchEffect高级侦听器
          • 更新时机(例如,一进来获取dom)
          • 开发调试
      • Vue3生命周期
          • 引入组件,有红色下划线的警告提示
      • 认识less sass和scoped
          • 定义变量
          • 插值语句,动态类名
          • 混入样式
          • bem规则实现

Vue3更新点

  • MVVM架构
  • Composition API结构
  • 重写双向数据绑定

vue2:基于Object.defineProperty()实现
vue3:基于Proxy去做的劫持
优点:1,丢掉麻烦的备份数据
——:2,省去for in 循环
——:3,可以监听数据变化
——:4,代码更简化,对数组更友好
——:5,可以监听动态新增的属性
——:6,可以监听删除的属性
——:7,可以监听数组的索引和length属性

  • VDOM性能瓶颈
  • Fragments

允许我们有多个根节点
同时支持render JSX写法
新增Suspense teleport 和多v-model用法

  • Tree-Shaking的支持

Vue3:import {watch} from ‘vue’

新建项目方式一

  • npm init vite@latest或者
    在这里插入图片描述
  • 进入项目,npm install,安装devDependencies的东西
    在这里插入图片描述
  • npm i有可能报错,切换成淘宝镜像即可
    在这里插入图片描述
  • npm run dev
    在这里插入图片描述

新建项目方式二

  • npm init vue@latest
  • 它是专门为VUE去做一个定制的
  • npm i 即可
  • npm run dev
    在这里插入图片描述

vite-demo目录讲解

在这里插入图片描述

安装常用扩展

在这里插入图片描述
在这里插入图片描述

vue3书写风格

  • 必须手动return出去,页面才能使用
    在这里插入图片描述
  • 为解决手动return这个麻烦方式-采用setup语法糖,且不需要ts
    在这里插入图片描述
  • 为满足ts格式
    在这里插入图片描述
动态css也可以这样使用

在这里插入图片描述

虚拟DOM

  • 通过JS来生成一个AST节点数
  • 为什么使用虚拟DOM,因为一个dom上面的属性是非常多的,直接操作DOM浪费性能
  • 解决方案:用js的计算属性来换取操作DOM所消耗的性能,虽然也会操作DOM,但我们尽可能的操作js,减少操作Dom的次数
  • 例如,v-for数组循环的key有没有的渲染情况,有key会更加友好
    在这里插入图片描述
    在这里插入图片描述

Ref全家桶

  • 注意ref是深层次的,shallowRef是浅层次的
  • 两者不能再一块写,shallowRef会受ref的影响,造成视图更新
  • 而triggerRef(变量),代表强制更新
<template><div class="main">{{ detail.name }}</div><button @click="changebtn">修改</button>
</template><script setup lang="ts">
import { ref,shallowRef,triggerRef} from 'vue';
const detail = ref({ name: '花神' });
const changebtn = () => {detail.value.name = '花神技术点击';
};
</script><style scoped></style>
  • 当碰到引入的vue下红色波浪线
    在这里插入图片描述
  • 修改moduleResolution的值为’node’
    在这里插入图片描述
ref小知识1
  • 当我们打印修改过的值的时候

  • 控制台显示的不直观在这里插入图片描述

  • 通过修改游览器的,勾选这个属性即可
    在这里插入图片描述
    在这里插入图片描述

  • 这样就显示的直观啦
    在这里插入图片描述

ref小知2,可以直接操作Dom
<template><div class="main">{{ detail.name }}</div><div ref="dom">dom值</div><button @click="changebtn">修改</button>
</template><script setup lang="ts">
import { ref } from 'vue';
const detail = ref({ name: '花神' });
//注意,定义在点击事件外定义,并且不能让他自主推断类型
//需要设置类型为HTMLDivElement
const dom = ref<HTMLDivElement>();
const changebtn = () => {detail.value.name = '花神技术点击';console.log(detail);//然后因为一上来dom没渲染完,所以在点击事件里面打印console.log(dom.value?.innerText);
};
</script><style scoped></style>

在这里插入图片描述

recative全家桶

  • ref支持所有的类型

  • reactive支持引用类型 Array Object Map Set

  • reactive取值,赋值不需要.value

  • 注意,reactive数组赋值不可以直接直接赋值,需要通过push+解构的方式

  • 全家桶系列:readonly只读,shallowReactive浅层的

  • 注意以下的报错
    在这里插入图片描述

  • 原因ref是一个响应式的数据类型,它只能包含一个值。当你尝试在ref上使用push方法时,TypeScript会提示错误,因为push方法是数组对象的方法,而不是ref对象的方法。

  • 解决这个问题的方法是,你需要使用reactive来创建响应式的数组对象

数组赋值方式一

在这里插入图片描述

数组赋值方式二
  • 添加一个对象,把数组作为一个属性
    在这里插入图片描述

to系列全家桶

  • toRef,如果原始对象是非响应式的就不会更新视图,数据会变,是响应式的就会更新视图,更新数据
    在这里插入图片描述
    在这里插入图片描述

  • toRefs,解构多个值
    在这里插入图片描述

  • toRaw,可以让响应式数据不响应
    在这里插入图片描述

Vue3的响应式原理

  • Vue2使用的是Object defineProperty
  • Vue3使用的是Proxy
Vue2的不足
  • 对象只能劫持设置好的数据,新增的数据需要Vue Set(xxx)数组只能操作7种方法,修改某一项值无法劫持

computed计算属性

  • 计算属性,就是当依赖的属性的值发生变化的时候,才触发他的更改,如果依赖的值,不发生变化,使用的是缓存中的属性值
<template><div class="main"><div>姓:<input type="text" v-model="firstname" name="" id="" /></div><div>名:<input type="text" v-model="lastname" name="" id="" /></div><div>姓名:{{ name }}</div><div>姓名:{{ name1 }}</div><button @click="changename">修改姓名</button></div>
</template><script setup lang="ts">
import { ref, computed } from 'vue';
let firstname = ref('花');
let lastname = ref('神');//computed用法
//1,选项式写法,支持一个对象传入get函数以及set函数自定义操作
let name = computed<string>({get() {return firstname.value + lastname.value;},set(newvalue) {[firstname.value, lastname.value] = newvalue.split('-');},
});
const changename = () => {name.value = '小-花';
};
//2,函数式写法,只能支持一个getter函数,不允许修改值
let name1 = computed(() => firstname.value + lastname.value);
</script><style scoped></style>

watch侦听器

  • watch需要侦听特定的数据源,并在单独的回调函数中执行副作用
  • 第一个参数是监听源
  • 第二个参数是回调函数
  • 第三个参数是一个options配置项是一个对象{immediately:true,//是否立即调用一次deep:true//是否开启深度监听 }
  • deep:true,//一般用来监听深层次对象,但注意的是源数据如果是reactive绑定的,不开启深度监听也可以监听到,因为在源码里面有开启
<template><div class="main"><div>姓:<input type="text" v-model="firstname" /></div><div>姓:<input type="text" v-model="lastname" /></div><div>姓:<input type="text" v-model="obj.foo.box.bar.name" /></div></div>
</template><script setup lang="ts">
import { ref, reactive, watch } from 'vue';
let firstname = ref<string>('花神');
let lastname = ref<string>('花神');
let obj = reactive({foo: {box: {bar: {name: '花神',},},},
});//监听单个数组
watch(firstname,(oldvalue, newvalue) => {console.log(oldvalue, newvalue);},{deep: true, //一般用来监听深层次对象,但注意的是源数据如果是reactive绑定的,不开启深度监听也可以监听到}
);
//监听多个数组.此时的oldvalue, newvalue也是数组
watch([firstname, lastname], (oldvalue, newvalue) => {console.log(oldvalue, newvalue);
});
//如果监听对象中深层次的一个属性
watch(() => obj.foo.box.bar.name,(oldvalue, newvalue) => {console.log(oldvalue, newvalue);}
);
</script><style scoped></style>

watchEffect高级侦听器

  • 立即执行传入的一个函数,同时响应式追踪其依赖,并在其依赖变更时重新运行该函数
//具有非惰性,一进页面,会自动调用一下
watchEffect((oninvalidate) => {oninvalidate(()=>{console.log('这个函数用来清除副作用,是最先执行的,类似可以防抖')})console.log('firstname', firstname.value);console.log('obj', obj.foo.box.bar.name);
});
  • 还可以防止监听
//具有非惰性,一进页面,会自动调用一下
const stop = watchEffect((oninvalidate) => {oninvalidate(() => {console.log('这个函数用来清除副作用,是最先执行的,类似可以防抖');});console.log('firstname', firstname.value);console.log('obj', obj.foo.box.bar.name);
});
//watchEffect会返回一个函数,可以用来取消监听
const changestop = () => stop();

在这里插入图片描述

更新时机(例如,一进来获取dom)
  • pre ,组件更新前执行
  • sync,强制效果始终同步触发
  • post,组件更新后执行
    在这里插入图片描述
开发调试
  • onTrigger对于监听的值将在依赖项变更导致副作用被触发时被调用
    在这里插入图片描述

Vue3生命周期

引入组件,有红色下划线的警告提示
  • 当组件引用有下划线的时候,虽然不影响使用,但看着不舒服

在这里插入图片描述

  • 在设置里面配置一下
    在这里插入图片描述
  • 重启即可
    在这里插入图片描述
<template><div class="main"></div>
</template><script setup lang="ts">
import {ref,onBeforeMount,onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount,onUnmounted,
} from 'vue';//beforeCreate,created setup语法糖模式是没有这两个生命周期的,setup去代替
console.log('created');//创建
onBeforeMount(() => {console.log('创建');
});
//创建完成
onMounted(() => {console.log('创建完成');
});
//更新之前
onBeforeUpdate(() => {console.log('更新之前');
});
//更新完成
onUpdated(() => {console.log('更新完成');
});
//卸载之前
onBeforeUnmount(() => {console.log('卸载之前');
});
//卸载后
onUnmounted(() => {console.log('卸载完成');
});
</script><style scoped></style>

认识less sass和scoped

  • bem规则,块元素-,块里面的元素__,同层级,不同修饰–
  • less,是一门向后兼容的css扩展语言
  • sass,一款强化css的辅助工具,在css语法基础上增加了变量,嵌套,混合,导入等高级功能
  • sass中文网
定义变量

在这里插入图片描述

插值语句,动态类名

在这里插入图片描述

混入样式
  • 定义混入
    在这里插入图片描述
  • 引用混入
    在这里插入图片描述
bem规则实现
  • 步骤一:新建.scss文件
    在这里插入图片描述
//bem规则
//在变量的结尾添加 !default 给一个未通过 !default 声明赋值的变量赋值,此时,如果变量已经被赋值,不会再被重新赋值
$namespace: 'vt' !default;
$block-sel: '-' !default;
$elem-sel: '__' !default;
$mod-sel: '--' !default;//生成vt-$block类名
@mixin b($block) {//定义$B,接收凭借后的参数$B: #{$namespace + $block-sel + $block};//插槽使用.#{$B} {//@content相当于占位符@content;}
}//生成vt-$block__$el类名
@mixin e($el) {//获取父级类名$parent: &;//此时的类目就是全的,但可能在调用的时候会在元素内部使用,所以需要@at-root跳出嵌套@at-root {#{$parent + $elem-sel + $el} {@content;}}
}//生成vt-$block--$m类名
@mixin m($m) {$parent: &;@at-root {#{$parent + $mod-sel + $m} {@content;}}
}
  • 步骤二,全局引入bem.scss文件
    在这里插入图片描述
  • 步骤三,页面上使用即可
<template><div class="main"><div><div class="vt-test">测试bem规则<div class="vt-test__name">花神技术</div><div class="vt-test--age">花神技术24</div></div></div></div>
</template><script setup lang="ts"></script><style scoped lang="scss">
@include b(test) {color: red;@include e(name) {color: green;}@include m(age) {color: blue;}
}
</style>
  • 步骤四,实现效果
    在这里插入图片描述

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

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

相关文章

Spring实现事务二

. 上一次我们讲到,Spring实现事务的方式有两种,并且,为实现这两种方式,我们做了一些准备工作,那么接下来,我将带着大家,来继续学习事务的相关知识 编程式事务 SpringBoot内置了两个对象 DataSourceTransactionManager 事务管理器. 用来获取事务(开启事务), 提交或回滚事务 Tr…

[Angular 基础] - 指令(directives)

[Angular 基础] - 指令(directives) 这里假设已经知道如何创建 Angular 组件以及数据绑定&#xff0c;不然可以参考前两篇笔记&#xff1a; [Angular 基础] - Angular 渲染过程 & 组件的创建 [Angular 基础] - 数据绑定(databinding) 就像中文翻译一样&#xff0c;dire…

【已解决】pt文件转onnx后再转rknn时得到推理图片出现大量锚框变花屏

前言 环境介绍&#xff1a; 1.编译环境 Ubuntu 18.04.5 LTS 2.RKNN版本 py3.8-rknn2-1.4.0 3.单板 迅为itop-3568开发板 一、现象 采用yolov5训练并将pt转换为onnx&#xff0c;再将onnx采用py3.8-rknn2-1.4.0推理转换为rknn&#xff0c;rknn模型能正常转换&#xff0c;…

养好花草鱼鸟,也能旺家

不少朋友家里既养了鱼鸟&#xff0c;也养了花草&#xff0c;平时逗逗鸟喂喂鱼再赏赏花&#xff0c;真是非常惬意的生活&#xff0c;而用养鱼的水养植物&#xff0c;花草植物会长得格外茂盛。根据这一原理&#xff0c;很多人喜欢在养一些水培花草的时候&#xff0c;顺便养几尾小…

基于SpringBoot+Vue的外卖点餐管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

第三篇:SQL数据模型、通用语法和语法分类

一&#xff0c;SQL数据模型 &#xff08;一&#xff09;关系型数据库&#xff08;RDBMS&#xff09; 1.概念 &#xff08;百度百科&#xff09;指采用了关系模型来组织数据的数据库&#xff0c;其以行和列的形式存储数据&#xff0c;以便于用户理解&#xff0c;关系型数据库这…

【蓝桥杯选拔赛真题64】python数字塔 第十五届青少年组蓝桥杯python 选拔赛比赛真题解析

python数字塔 第十五届蓝桥杯青少年组python比赛选拔赛真题 一、题目要求 (注:input()输入函数的括号中不允许添加任何信息) 提示信息: 数字塔是由 N 行数堆积而成,最顶层只有一个数,次顶层两个数,以此类推。相邻层之间的数用线连接,下一层的每个数与它上一层左上…

网络安全大赛

网络安全大赛 网络安全大赛的类型有很多&#xff0c;比赛类型也参差不齐&#xff0c;这里以国内的CTF网络安全大赛里面著名的的XCTF和强国杯来介绍&#xff0c;国外的话用DenCon CTF和Pwn2Own来举例 CTF CTF起源于1996年DEFCON全球黑客大会&#xff0c;以代替之前黑客们通过互相…

EasyX图形库学习(三、用easyX控制图形界面中的小球、图片-加载、输出)

目录 小球视频 图像输出函数 loadimage用于从文件中读取图片 putimage在当前设备上绘制指定图像。 initgraph 函数 图片输出 代码详解&#xff1a; 1. 初始化图形界面 2. 设置背景颜色并清除屏幕 3. 加载并显示图片 4. 等待用户输入并退出程序 图形界面中的小球 1…

自动化诊断测试之CANoe.DIVA入门

目录 0 前言 1 CANoe.DIVA基础 2 CANoe.DIVA TIPs 0 前言 写在前面&#xff1a;如对本文有任何疑问欢迎评论区讨论&#xff0c;希望和大家一起进步。同时HIL测试群欢迎大家加入如有需要也可私信我拉你。VT和DIVA都可以做UDS的自动化测试&#xff0c;但相对VT来说使用DIVA生成…

Redis学习及总结

Redis 快速入门 Redis属于非关系型数据库 SQL应用场景 数据结构固定相关业务对数据安全性一致性要求高 NoSQL应用场景 数据结构不固定对一致性&#xff0c;安全性要求不高性能要求高 &#x1f3af;需要使用Xftp 传输压缩包到虚拟机上 安装好Redis后&#xff0c; 执行命令…

UE5 PAK包热加载

参考知乎UE5 Pak学习与应用&#xff08;一&#xff09;运行时导入模型 - 知乎 使用的版本为UE5.1 使用插件为HorPatcher和EasyFile Dialog HotPatcher:UE资源热更打包工具HotPatcher | 循迹研究室 ,Github地址为:GitHub - hxhb/HotPatcher: Unreal Engine hot update manage …

最小生成树超详细介绍

目录 一.最小生成树的介绍 1.最小生成树的简介 2.最小生成树的应用 3.最小生成树的得出方法 二.Kruskal算法 1.基本思想&#xff1a; 2.步骤&#xff1a; 3.实现细节&#xff1a; 4.样例分析&#xff1a; 5.Kruskal算法代码实现&#xff1a; 三.Prim算法 1.基本思想…

【多模态大模型】视觉大模型SAM:如何使模型能够处理任意图像的分割任务?

SAM&#xff1a;如何使模型能够处理任意图像的分割任务&#xff1f; 核心思想起始问题: 如何使模型能够处理任意图像的分割任务&#xff1f;5why分析5so分析 总结子问题1: 如何编码输入图像以适应分割任务&#xff1f;子问题2: 如何处理各种形式的分割提示&#xff1f;子问题3:…

【数据结构和算法】--- 基于c语言排序算法的实现(1)

目录 一、排序的概念及其应用1.1排序的概念1.2 排序的应用1.3 常见的排序算法 二、插入排序2.1直接插入排序2.2 希尔排序2.2.1 预排序2.2.2 缩小gap2.2.3 小结 三、选择排序3.1 直接选择排序3.2 堆排序 一、排序的概念及其应用 1.1排序的概念 排序&#xff1a; 所谓排序&…

RTE2023第九届实时互联网大会:揭秘未来互联网趋势,PPT分享引领行业新思考

随着互联网的不断发展&#xff0c;实时互动技术正逐渐成为新时代的核心驱动力。 在这样的背景下&#xff0c;RTE2023第九届实时互联网大会如期而至&#xff0c;为业界人士提供了一个探讨实时互联网技术、交流创新理念的绝佳平台。 本文将从大会内容、PPT分享价值等方面&#…

ShardingSphere 5.x 系列【6】YAML 配置介绍

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 前言2. YamlConfiguration3. 常用配置项3.1 JDBC 驱动3.2 数据源3.3 规则…

mysq开启慢查询日志,对慢查询进行优化

1.创建实验的环境 创建对应的数据库&#xff0c;然后写脚本向数据库中写入400万条的数据 //创建实验用的数据库 CREATE DATABASE jsschool;//使用当前数据库 USE jsschool;//创建学生表 CREATE TABLE student (sno VARCHAR(20) PRIMARY KEY COMMENT 学生编号,sname VARCHAR(20…

加固平板电脑丨三防智能平板丨工业加固平板丨智能城市管理

随着智能城市的不断发展&#xff0c;人们对于城市管理的要求也在不断提高&#xff0c;这就需要高效、智能的城市管理平台来实现。而三防平板就是一款可以满足这一需求的智能设备。 三防平板是一种集防水、防尘、防摔于一体的智能平板电脑&#xff0c;它可以在复杂的环境下稳定运…

python介绍,安装Cpython解释器,IDE工具pycharm的使用

python介绍 官方的Python解释器本质是基于C语言开发的一个软件&#xff0c;该软件的功能就是读取以py.结尾的文件内容&#xff0c;然后按照Guido定义好的语法和规则去翻译并执行相应的代码。这种C实现的解释器被称为Cpython。 python解释器的种类&#xff1a;Jython IPyth…