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

Vue3 学习总结补充(一)

文章目录

      • 1、Vue3中为什么修改变量的值后,视图不更新?
      • 2、使用 ref 还是 reactive?
      • 3、reactive 为什么会有响应性连接丢失情况?
      • 4、watch的不同使用方法
      • 5、watchEffect和 watch 的区别
        • 区别1:数据源的区别
        • 区别2:获取新值和旧值的区别
        • 区别3:惰性执行和非惰性(立即)执行的区别
      • 6、watchEffect和 watch 使用注意点
      • 7、使用ref修改DOM元素

1、Vue3中为什么修改变量的值后,视图不更新?

<template><div>app</div><div class="container">{{ msg1 }}{{ msg2 }}</div><button @click="say()">按钮</button>
</template><script setup>
import { reactive, ref } from 'vue'let msg1 = 'hi'
let msg2 = ref('hello')
const say = () => {console.log(msg1) // himsg1 = 'hi vue3' // 这里修改 msg1的值,console.log('msg1', msg1) // 这里可以获取到修改后的值,hi vue3,但是视图中的 msg1 没有更新,原因是 msg1不是响应式的。msg2.value = 'hello vue3 ' // 这里修改 msg2的值console.log('msg2', msg2) // 这里可以获取到修改后的值,hello vue3,视图中的 msg2 也会更新,原因是 msg2是响应式的。
}
</script>

2、使用 ref 还是 reactive?

  • reactive 可以转换【复杂数据类型】(例如:对象、数组等) 成为响应式数据,但是不支持简单数据类型(例如:字符串、数值、布尔值);
  • ref 可以转换【简单数据类型】或【复杂数据类型】 为响应式数据,但是操作的时候需要 .value

如果能确定数据是复杂数据类型,并且定义的属性也是知道的,则可以使用 reactive 转成响应式数据,如果不满足以上条件,则使用 ref

代码如下:

    // 1. 明确login对象有两个字段,需要使用 reactiveconst login = reactive({username: '',password: ''})// 2. 后台返回的数据对象const data = ref(null)const res = await axios.get('/login')data.value = res.data // 把不是响应式的 res 赋值给 响应式data中的value,data仍然是响应式的。// 3. 思考:为什么以下方式不可行?const data = reactive({ })const res = await axios.get('/login')data = res // 由于res 不是响应式的,然后把不是响应式的 res 赋值给 响应式的data ,那么data就不是响应式的了。

3、reactive 为什么会有响应性连接丢失情况?

响应性连接丢失的意思是:一个响应式对象原本是响应式的,但随意通过 “赋值”操作,把一个非响应式的数据,赋值给响应式的数据对象,这个响应式对象就变成了非响应式数据对象了。

reactive API有两个限制性情况:

  • 情况1:reactive 仅支持复杂数据类型(对象、数组等),对简单数据类型(字符串、数值、布尔值)等原始类型不支持。

  • 情况2:因为Vue 的响应式系统是通过属性访问进行跟踪的,必须始终保持对该响应式对象的相同引用。所以不可以随意地“替换(赋值)”一个响应式对象,因为这将导致对初始引用的响应性连接丢失。

    也就是说:如果重新赋值或解构赋值,就会丢失原来响应式对象的引用地址,然后变成了一个新的引用地址,因为这个新的引用地址指向的对象是没有经过 reactive 处理的,所以就是一个普通对象,而不是响应式对象。

❌ 响应性连接丢失 代码举例1:

    const data = reactive({ })const res = await axios.get('/login')data = res // 由于res 不是响应式的,然后把不是响应式的 res 赋值给 响应式的data ,那么data就不是响应式的了

❌ 响应性连接丢失 代码举例2:

// 将响应式对象的属性直接赋值或解构赋值时,或是将该属性传入一个函数时,也会失去响应性连接let dataCount = reactive({ count: 0 })// 响应式对象的属性直接赋值时,响应式对象的属性响应性连接丢失,也就是说:dataCount.count 失去响应式连接,但不会影响 dataCount (dataCount仍然是响应式数据对象)
let num = dataCount.count // 响应式对象的属性值 直接赋值给了 num
num++// 响应式对象属性解构时,响应式对象属性(dataCount.count)响应性连接丢失,但不会影响 dataCount
let { count } = dataCount // 响应式对象的属性解构赋值
count++// change函数接收一个普通数字,将无法跟踪 dataCount.count 的变化, dataCount.count失去响应性连接
const change = (item) => {console.log(item)
}
change(dataCount.count)

4、watch的不同使用方法

watch 第一个参数:不同形式的数据源,

  • 可以是 ref(含计算属性)
  • 一个getter函数
  • 一个响应式对象
  • 或多个数据源组成的数组。

注意: watch不能侦听到响应式对象的属性值,比如:watch(data.count,()=>{ }),可以提供一个getter函数进行返回响应式对象的属性值。

watch 第二个参数:回调函数,当数据源发生变化时,执行回调函数

watch 第三个参数【可选】:是一个配置项,

  • deep 用于强制深度遍历
  • immediate 用于立即执行第二个参数中的回调函数
  • flush 用于调整回调函数的刷新时机
  • onTrack / onTrigger 调试侦听器的依赖

watch 的五种不同使用方法如下:

<template><div>app</div><div>{{ count }}</div><button @click="count++">累加</button>
</template><script setup>
import { ref, reactive, watch } from 'vue'const count = ref(0)
const obj = reactive({name: 'xiaozhu',age: 18,info: {height: 180,weight: 70,},
})// 使用方法1:第一个参数为 ref
watch(count, (newVal, oldVal) => {console.log('newVal', newVal) // 累加后 新的值console.log('oldVal', oldVal) // 累加前 旧的值
})// 使用方法2:第一个参数为 getter函数
watch(() => obj.age,(newVal, oldVal) => {console.log('newVal', newVal) // 20console.log('oldVal', oldVal) // 18}
)
setTimeout(() => {obj.age = 20
}, 1000)// 使用方法3:第一个参数为 一个响应式对象中的 简单数据类型
watch(() => obj.name, // name为obj对象中的一个字符串类型(newVal, oldVal) => {console.log('改变了')console.log('obj.name', obj.name) // 筱竹console.log('newVal', newVal) // 筱竹console.log('oldVal', oldVal) // xiaozhu}
)
setTimeout(() => {obj.name = '筱竹'
}, 1000)// 使用方法4:第一个参数为 一个响应式对象中的 复杂数据类型时,需要开启深度监听(设置deep选项)
watch(() => obj.info, // info 为obj对象中的一对象类型(newVal, oldVal) => {console.log('obj.info.height', obj.info.height) // 筱竹console.log('newVal', newVal) // 筱竹console.log('oldVal', oldVal) // xiaozhu},{ deep: true } // 开启深度监听
)
setTimeout(() => {obj.info.height = 175
}, 1000)// 使用方法5:第一个参数为 多个数据源组成的数组
watch([count, obj], () => {console.log('count.value', count.value) // 点击 累加按钮后,count+1console.log('obj.info.weight', obj.info.weight) // 65
})
setTimeout(() => {obj.info.weight = 65
}, 1000)
</script>

5、watchEffect和 watch 的区别

区别1:数据源的区别

  • watch 是需要侦听一个数据源(ref、响应式对象等),当依赖数据更新时执行回调函数;
  • watchEffect 不需要设置侦听的数据源,而是自动收集依赖数据,当依赖数据更新时会立即执行回调函数
<template><div>app</div><div>{{ count }}</div><button @click="count++">累加</button>
</template><script setup>
import { ref, reactive, watch, watchEffect } from 'vue'const count = ref(0)//  watchEffect 和 watch 区别1:// watchEffect 不需要设置侦听的数据源,就可以自动收集依赖(以下可以自动收集 ref 数据源)
watchEffect(() => {console.log('count.value', count.value) 
})// watch 需要设置侦听的数据源,只有设置了数据源,才能侦听数据源的变化
watch(count, (newVal, oldVal) => {console.log('newVal', newVal) console.log('oldVal', oldVal) 
})
</script>

区别2:获取新值和旧值的区别

  • watch 在回调函数中获取到 新值(变化后的值)和 旧值(变化之前的值);
  • watchEffect 在回调函数中 只可以获取到新值(变化后的值),不能获取到 旧值(变化之前的值);
//  watchEffect 和 watch 区别2:// watchEffect 只能拿到 新值
watchEffect(() => {console.log('count.value', count.value) // 只能拿到 新值
})// watch 可以获取到 新值和 旧值
watch(count, (newVal, oldVal) => {console.log('newVal', newVal) // 累加后 新的值console.log('oldVal', oldVal) // 累加前 旧的值
})

区别3:惰性执行和非惰性(立即)执行的区别

  • watch 的回调函数具有一定的惰性 当第一次页面展示的时候不会执行,只有数据变化的时候才会执行(设置immediate 选项为true时可以变为非惰性(可以立即执行),页面首次加载就会执行;
  • watchEffect 的回调函数可以立即执行,没有惰性,页面的首次加载就会执行;
//  watchEffect 和 watch 区别3:
const todoId = ref(1)
const data = ref(null)// watchEffect 中的回调函数会立即执行,不需要指定 immediate: true
watchEffect(async () => {const response = await fetch(`https://jsonplaceholder.typicode.com/todos/${todoId.value}`)data.value = await response.json()
})// 在 watch 中想要立即执行回调函数,就需要 设置 immediate: true
// watch 默认是惰性的:仅当数据源变化时,才会执行回调。但在某些场景中,我们希望在创建侦听器时,立即执行一遍回调。举例来说,我们想请求一些初始数据,然后在相关状态更改时重新请求数据。
watch(todoId,async () => {const response = await fetch(`https://jsonplaceholder.typicode.com/todos/${todoId.value}`)data.value = await response.json()},{ immediate: true }
)

6、watchEffect和 watch 使用注意点

【注意点1】: 侦听器必须用同步语句创建:如果用异步回调创建一个侦听器,那么它不会绑定到当前组件上,必须手动停止侦听,以防止内存泄漏。例如:

// 它会自动停止 ( watch同理 )
watchEffect(() => {})// 这个则不会! ( watch同理 )
setTimeout(() => {watchEffect(() => {})
}, 100)// 要手动停止一个侦听器,请调用 watch 或 watchEffect 返回的函数:
const unwatch = watchEffect(() => {})// 当该侦听器不再需要时
unwatch()

【注意点2】: 需要异步创建侦听器的情况很少,请尽可能选择同步创建,如果需要等待一些异步数据,你可以使用条件式的侦听逻辑:

// 需要异步请求得到的数据
const info = ref(null)watchEffect(() => {if (info.value) {// 数据加载后执行某些操作...}
})

7、使用ref修改DOM元素

<template><div ref="ref_item">app</div><input type="button" value="修改DOM元素" @click="change()" />
</template><script setup>
import { ref, onMounted } from 'vue'const ref_item = ref(null)// 注意: 获取元素需要在Vue3 生命周期钩子 onMounted中获取,如果在 setup 中是获取不到的,因为setup中类似Vue2声明周期钩子函数中的beforeCreate和 created ,此时DOM还没生成,所以获取不到DOM。
onMounted(() => {// 获取DOM元素console.log('ref_item.value.innerText', ref_item.value.innerText) // app
})const change = () => {// 修改DOM元素的值ref_item.value.innerText = '你好 Vue3'console.log('ref_item.value.innerText', ref_item.value.innerText) // 你好 Vue3
}
</script>

相关文章:

Vue3 学习总结补充(一)

文章目录1、Vue3中为什么修改变量的值后&#xff0c;视图不更新&#xff1f;2、使用 ref 还是 reactive&#xff1f;3、reactive 为什么会有响应性连接丢失情况&#xff1f;4、watch的不同使用方法5、watchEffect和 watch 的区别区别1&#xff1a;数据源的区别区别2&#xff1a…...

使用ChatGPT 开放的 API 接口可以开发哪些自研工具?

使用ChatGPT开放的API接口,可以开发多种自研工具,例如: 智能聊天机器人:可以使用ChatGPT提供的语言生成能力,构建一个智能聊天机器人,能够根据用户的输入自动回复,完成自然语言交互。 文本生成工具:可以使用ChatGPT的文本生成能力,开发一个文本生成工具,例如自动生…...

I2C和SPI总线以及通信

通讯属性 概括 Serial/parallel 串行/并行Synchronous/asynchronous 同步/异步Point-to-point / bus 点对点 总线Half-duplex/full-duplex 半双工/全双工Master-slave/ equal partners 主从/对等single-ending / differential 单端/差分 点对点和总线 点对点通讯 只有两个通…...

Spring八股文

Bean的生命周期 1.通过反射生成对象 2.填充Bean的属性 3.调用aware接口的invokeAwareMethod方法&#xff0c;对BeanName、BeanFactory、BeanClassLoader对象的属性设值 4.调用BeanPostProcessor的前置处理方法&#xff0c;其中使用较多的是ApplicationContextPostProcessor…...

20 k8sMetric 简介

一. Metric 简介metrics-server 可实现 Kubernetes 的 Resource Metrics API&#xff08;metrics.k8s.io&#xff09;&#xff0c;通过此 API 可以查询 Pod 与 Node 的部分监控指标&#xff0c;Pod 的监控指标用于 HPA、VPA 与 kubectl top pods -n ns 命令&#xff0c;而 Node…...

面试问了解Linux内存管理吗?10张图给你安排的明明白白

linux内存管理&#xff0c;内存管理好像离我们很远&#xff0c;但这个知识点虽然冷门&#xff08;估计很多人学完根本就没机会用上&#xff09;但绝对是基础中的基础&#xff0c;这就像武侠中的内功修炼&#xff0c;学完之后看不到立竿见影的效果&#xff0c;但对你日后的开发工…...

【C++】内联函数inline

文章目录概念使用特性原理概念 C中内联函数的出现解决了C语言宏函数的不足&#xff0c;类似于宏展开&#xff0c;这种在函数调用处直接嵌入函数体的函数称为内联函数&#xff0c;又称内嵌函数或内置函数。 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内…...

C++演讲比赛流程管理系统_黑马

任务 学校演讲比赛&#xff0c;12人&#xff0c;两轮&#xff0c;第一轮淘汰赛&#xff0c;第二轮决赛 选手编号 [ 10001 - 10012 ] 分组比赛 每组6人 10个评委 去除最高分 最低分&#xff0c;求平均分 为该轮成绩 每组淘汰后三名&#xff0c;前三名晋级决赛 决赛 前三名胜出 …...

谈谈低代码的安全问题,一文全给你解决喽

低代码是一种软件开发方法&#xff0c;通过使用图形化用户界面和可视化建模工具&#xff0c;以及自动生成代码的技术&#xff0c;使得开发人员可以更快速地构建和发布应用程序。 作为近些年软件开发市场热门之一&#xff0c;市面上也涌现了许多低代码产品&#xff0c;诸如简道云…...

[数据结构]二叉树OJ(leetcode)

目录 二叉树OJ(leetcode)训练习题&#xff1a;&#xff1a; 1.单值二叉树 2.检查两棵树是否相同 3.二叉树的前序遍历 4.另一棵树的子树 5.二叉树的构建及遍历 6.二叉树的销毁 7.判断二叉树是否是完全二叉树 二叉树OJ(leetcode)训练习题&#xff1a;&#xff1a; 1.单值二叉…...

flutter 输入时插入分隔符

每四位插入一个分隔符import package:flutter/services.dart;class DividerInputFormatter extends TextInputFormatter {final int rear; //第一个分割位数,后面分割位,,数final String pattern; //分割符DividerInputFormatter({this.rear 4, this.pattern });overrideTex…...

静态版通讯录——“C”

各位CSDN的uu你们好呀&#xff0c;之前小雅兰学过了一些结构体、枚举、联合的知识&#xff0c;现在&#xff0c;小雅兰把这些知识实践一下&#xff0c;那么&#xff0c;就让我们进入通讯录的世界吧 实现一个通讯录&#xff1a; 可以存放100个人的信息每个人的信息&#xff1a;名…...

前端基础开发环境搭建工具等

一、基本开发环境&#xff08;软件&#xff09;安装1、Vscode&#xff08;代码编辑器&#xff09;官网下载网址&#xff1a;https://code.visualstudio.com/2、nvm&#xff08;node多版本管理器&#xff0c;每个node版本都有对应的npm版本&#xff09;安装包下载地址&#xff1…...

华为OD机试题【IPv4 地址转换成整数】用 Java 解 | 含解题说明

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典本篇题目:IPv4 地址转换成整数 题目 存在…...

[数据结构]排序算法

目录 常用排序算法的实现&#xff1a;&#xff1a; 1.排序的概念及其运用 2.插入排序 3.希尔排序 4.选择排序 5.冒泡排序 6.堆排序 7.快速排序 8.归并排序 9.排序算法复杂度及稳定性分析 10.排序选择题练习 常用排序算法的实现&#xff1a;&#xff1a; 1.排序的概念及其运用…...

不愧是2023年就业最难的一年,还好有车企顶着~

就业龙卷风已经来临&#xff0c;以前都说找不到好的工作就去送外卖&#xff0c;但如今外卖骑手行业都已经接近饱和状态了&#xff0c;而且骑手们的学历也不低&#xff0c;本科学历都快达到了30%了&#xff0c;今年可以说是最难找到工作的一年。 像Android 开发行业原本就属于在…...

C/C++之while(do-while)详细讲解

目录 while循环有两个重要组成部分&#xff1a; while 是一个预测试循环 无限循环 do-while 循环 while循环有两个重要组成部分&#xff1a; 进行 true 值或 false 值判断的表达式&#xff1b;只要表达式为 true 就重复执行的语句或块&#xff1b;图 1 显示了 while 循环的…...

SpringCloud学习笔记(一)认识微服务

一、微服务技术栈 二、单体架构和分布式架构的区别 1、单体架构&#xff1a; 将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包进行部署 优点&#xff1a;架构简单&#xff0c;部署成本低缺点&#xff1a;耦合度高 2、分布式架构&#xff1a; 根据业务功能对系统…...

Unity中使用WebSocket (ws://)的方法

WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直接可以创建持久性的连接&#xff0c;并进行双向数据传输。 WebSocket与http 其…...

米哈游春招算法岗-2023.03.19-第一题-交换字符-简单题

交换字符Problem Description 米小游拿到了一个仅由小写字母组成的字符串&#xff0c;她准备进行恰好一次操作&#xff1a;交换两个相邻字母&#xff0c;在操作结束后使得字符串的字典序尽可能大。 请你输出最终生成的字符串。 input 一个仅由小写字母组成的字符串&#xff0c;…...

能把爬虫讲的这么透彻的,没有20年功夫还真不行【0基础也能看懂】

前言 可以说很多人学编程&#xff0c;不玩点爬虫确实少了很多意思&#xff0c;不管是业余、接私活还是职业爬虫&#xff0c;爬虫世界确实挺精彩的。 今天来给大家浅谈一下爬虫&#xff0c;目的是让准备学爬虫或者刚开始起步的小伙伴们&#xff0c;对爬虫有一个更深更全的认知…...

springcloud学习总结

springcloud 构建微服务项目步骤 导入依赖编写配置文件开启这个功能 Enablexxx配置类 于2023年2月24日下午17点38分开始学习于2023年3月17日晚上20点26分学完总结代码地址&#xff1a;https://gitee.com/liang-weihao/StudySpringcloud学习笔记地址&#xff1a;https://www.…...

2022年亏损超10亿,告别野蛮成长的众安在线急需新“引擎”

2023年3月21日&#xff0c;众安在线披露了2022年财报&#xff0c;营收233.52亿元&#xff0c;同比增长6.44%&#xff1b;净亏损16.33亿元&#xff0c;去年同期净利润为11.6亿元&#xff0c;同比由盈转亏。 尽管众安在线再次身陷亏损的泥潭&#xff0c;但投资者却没有选择逃离。…...

ChatGPT文心一言逻辑大比拼(一)

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…...

【机器学习面试总结】————特征工程

【机器学习面试总结】————特征工程一、特征归一化为什么需要对数值类型的特征做归一化?二、类别型特征在对数据进行预处理时,应该怎样处理类别型特征?三、高维组合特征的处理什么是组合特征?如何处理高维组合特征?四、组合特征怎样有效地找到组合特征?五、文本表示模型…...

如何将字符串反转?

参考答案 使用 StringBuilder 或 StringBuffer 的 reverse 方法&#xff0c;本质都调用了它们的父类 AbstractStringBuilder 的 reverse 方法实现。&#xff08;JDK1.8&#xff09;不考虑字符串中的字符是否是 Unicode 编码&#xff0c;自己实现。递归1. public AbstractStrin…...

Linux内核IO基础知识与概念

什么是 IO在计算机操作系统中&#xff0c;所谓的I/O就是 输入&#xff08;Input&#xff09;和输出&#xff08;Output&#xff09;&#xff0c;也可以理解为读&#xff08;Read&#xff09;和写&#xff08;Write)&#xff0c;针对不同的对象&#xff0c;I/O模式可以划分为磁盘…...

paper文献和科研小工具

一、好用的网站 Aminer 二、好用的工具 ​1. SciSpace SciSpace官网 【ChatGPT 论文阅读神器】SciSpace 用户注册与实战测试 SciSpace是一款基于 ChatGPT 的论文阅读神器。 2. ReadPaper 强大且超实用的论文阅读工具——ReadPaper ReadPaper官网 ReadPaper下载链接 Rea…...

dfs和bfs能解决的问题

一.理解暴力穷举之dfs和bfs暴力穷举暴力穷举是在解决问题中最常用的手段&#xff0c;而dfs和bfs算法则是这个手段的两个非常重要的工具。其实&#xff0c;最简单的穷举法是直接遍历&#xff0c;如数列求和&#xff0c;遍历一个数组即可求得所问答案&#xff0c;这与我在前两篇博…...

静态通讯录,适合初学者的手把手一条龙讲解

数据结构的顺序表和链表是一个比较困难的点&#xff0c;初见会让我们觉得有点困难&#xff0c;正巧C语言中有一个类似于顺序表和链表的小程序——通讯录。我们今天就来讲一讲通讯录的实现&#xff0c;也有利于之后顺序表和链表的学习。 目录 0.通讯录的初始化 1.菜单的创建…...

申请一个网站需要怎么做/怎么用手机制作网站

Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2087 Accepted Submission(s): 999 Problem Description 2007年到来了。经过2006年一年的修炼&#xff0c;数学神童zouyu终于把0到100000000的Fibonacci数列…...

沈阳 网站建设/网站网页设计

前言&#xff1a;打脸了&#xff0c;前脚刚说过要跟Servlet正式告别。结果最近的面试被问到了同一个Servlet可不可以被映射到多个URL上&#xff0c;也就是如何用一个Servlet实现多个功能。 前置知识&#xff1a; Servlet容器如何处理请求资源路径&#xff1f; 1、这个地址 ht…...

东莞网站建设lhznkj/seo外包网站

Linux中使用curl命令出现403错误的解决办法 403错误&#xff0c;是网站访问过程中&#xff0c;常见的错误提示&#xff0c;资源不可用&#xff0c; 服务器理解客户请求&#xff0c;但拒绝处理它&#xff0c;通常由于服务器上文件或目录的权限设置导致&#xff0c; 比如IIS或者a…...

深圳做网站开发费用/软文的目的是什么

sublime 使用心得 sublime是一个非常容易上手的编辑器&#xff0c;做前端的攻城狮完全可以使用&#xff1b; sublime在国内的一些论坛&#xff0c;网站都有讲述。sublime自己本身的一些特性决定着它是一个非常容易上手的编辑器&#xff0c;然后里面又有着非常丰富的插件可以选…...

wordpress怎么重装/百度知道灰色词代发收录

首页和图标定制 首页 图标定制 1.图片命名为favicon.ico 2.放在public目录下 3.更改配置 #关闭默认图标 &#xff0c;新版本没有 spring.mvc.favicon.enabledfalse4.测试访问...

建建建设网站公司电话号码/开发网站建设公司

常用控件和类的使用 Visual Studio.Net(简称VS.Net)使用控件(组件)设计Windows应用程序。将VS.Net工具箱窗口中的控件放到窗体中&#xff0c;使用属性窗口改变控件属性&#xff0c;或在程序中用语句修改控件属性&#xff0c;设计应用程序界面&#xff0c;为控件增加事件函数&am…...