Vue(五)

news2025/1/11 0:14:46

1. 绑定class和style样式

 

 dom里自己拿到节点,改它上面的class样式

shift()移除第一个class属性

 

 push想加哪个class属性都行

 

59行div知道自己只能用两个样式,四种情况 

上面这种不合法,就算把样式加进div也得

 

样式对象:里面的key绿色的不能瞎写,都得是存在的

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>绑定样式</title>
		<style>
			.basic{
				width: 400px;
				height: 100px;
				border: 1px solid black;
			}
			
			.happy{
				border: 4px solid red;;
				background-color: rgba(255, 255, 0, 0.644);
				background: linear-gradient(30deg,yellow,pink,orange,yellow);
			}
			.sad{
				border: 4px dashed rgb(2, 197, 2);
				background-color: gray;
			}
			.normal{
				background-color: skyblue;
			}

			.atguigu1{
				background-color: yellowgreen;
			}
			.atguigu2{
				font-size: 30px;
				text-shadow:2px 2px 10px red;
			}
			.atguigu3{
				border-radius: 20px;
			}
		</style>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
			绑定样式:
					1. class样式
								写法:class="xxx" xxx可以是字符串、对象、数组。
										字符串写法适用于:类名不确定,要动态获取。
										对象写法适用于:要绑定多个样式,个数不确定,名字也不确定。
										数组写法适用于:要绑定多个样式,个数确定,名字也确定,但不确定用不用。
					2. style样式
								:style="{fontSize: xxx}"其中xxx是动态值。
								:style="[a,b]"其中a、b是样式对象。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			  <!-- basic正常的样式正常写,变化的样式绑定v-bind -->
			<!-- 绑定class样式--字符串写法,适用于:样式的类名不确定,需要动态指定 -->
			<div class="basic" :class="mood" @click="changeMood">{{name}}</div> <br/><br/>

			<!-- 绑定class样式--数组写法,适用于:要绑定的样式个数不确定、名字也不确定 -->
			<div class="basic" :class="classArr">{{name}}</div> <br/><br/>

			<!-- 绑定class样式--对象写法,适用于:要绑定的样式个数确定、名字也确定,但要动态决定用不用 -->
			<div class="basic" :class="classObj">{{name}}</div> <br/><br/>

			<!-- 绑定style样式--对象写法 -->
			<div class="basic" :style="styleObj">{{name}}</div> <br/><br/>
			<!-- 绑定style样式--数组写法 不常用-->
			<div class="basic" :style="styleArr">{{name}}</div>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false
		
		const vm = new Vue({
			el:'#root',
			data:{
				name:'尚硅谷',
				mood:'normal',
				//classArr,classObj都是在vue控制台改的
				//把用到的样式都配置到数组里面
				classArr:['atguigu1','atguigu2','atguigu3'],
				classObj:{
					//false不用,true用
					atguigu1:false,
					atguigu2:false,
				},
				styleObj:{
					fontSize: '40px',
					color:'red',
				},
				styleObj2:{
					backgroundColor:'orange'
				},
				styleArr:[
					{
						fontSize: '40px',
						color:'blue',
					},
					{
						backgroundColor:'gray'
					}
				]
			},
			methods: {
				changeMood(){
					const arr = ['happy','sad','normal']
					//Math.floor向下取整,Math.random()在0-1内,逼近1但不等于1
					//×3就是0.几,1.几,2.几再取整变成0,1,2对应['happy','sad','normal']
					const index = Math.floor(Math.random()*3)
					this.mood = arr[index]
				}
			},
		})
	</script>
	
</html>

 2. 条件渲染

 v-if/v-else-if  跟以前一个用法,eg:三个if都会判断,但像上面这种if实现了就不会往下判断

 v-else 前面条件都不执行直接执行else里面的,没条件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>条件渲染</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
		条件渲染:
			1.v-if
					写法:
							(1).v-if="表达式" 
							(2).v-else-if="表达式"
							(3).v-else="表达式"
						    	适用于:切换频率较低的场景。
								特点:不展示的DOM元素直接被移除。
								注意:v-if可以和:v-else-if、v-else一起使用,但要求结构不能被“打断”。

			2.v-show
				true页面中能看到,false页面中看不到
				false只是把结构隐藏了,用display:none但结构还有,v-if:false连结构都没了
							写法:v-show="表达式"
							适用于:切换频率较高的场景。
							特点:不展示的DOM元素未被移除,仅仅是使用样式隐藏掉
								
			3.备注:使用v-if的时,元素可能无法获取到,而使用v-show一定可以获取到。
		 -->
		<!-- 准备好一个容器-->
		<div id="root">
			<h2>当前的n值是:{{n}}</h2>
			<button @click="n++">点我n+1</button>
			<!-- 使用v-show做条件渲染 -->
			<!-- <h2 v-show="false">欢迎来到{{name}}</h2> -->
			<!-- <h2 v-show="1 === 1">欢迎来到{{name}}</h2> -->

			<!-- 使用v-if做条件渲染 -->
			<!-- <h2 v-if="false">欢迎来到{{name}}</h2> -->
			<!-- <h2 v-if="1 === 1">欢迎来到{{name}}</h2> -->

			<!-- v-else和v-else-if -->
			<!-- <div v-if="n === 1">Angular</div>
			<div v-else-if="n === 2">React</div>
			<div v-else-if="n === 3">Vue</div>
			<div v-else>哈哈</div> -->

			<!-- v-if与template的配合使用 
			template(模板),不影响结构,只能跟v-if配合使用-->
			<template v-if="n === 1">
				<h2>你好</h2>
				<h2>尚硅谷</h2>
				<h2>北京</h2>
			</template>

		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false

		const vm = new Vue({
			el:'#root',
			data:{
				name:'尚硅谷',
				n:0
			}
		})
	</script>
</html>

3. 列表渲染

3.1 基本列表

 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>基本列表</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
				v-for指令:
						1.用于展示列表数据
						2.语法:v-for="(item, index) in xxx" :key="yyy"
						3.可遍历:数组、对象、字符串(用的很少)、指定次数(用的很少)
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<!-- 遍历数组 -->
			<h2>人员列表(遍历数组)</h2>
			<ul>
				<!-- p是形参,框架里用for遍历同样结构的东西,必须给每个都加上表标识key 
				:key="p.id"另一种写法,保证里面每个id都不一样就行
			(p,index)p是value,index是key-->
				<li v-for="(p,index) in persons" :key="index">
					{{p.name}}-{{p.age}}
				</li>
			</ul>

			<!-- 遍历对象 -->
			<h2>汽车信息(遍历对象)</h2>
			<ul>
				<li v-for="(value,k) of car" :key="k">
					{{k}}-{{value}}
				</li>
			</ul>

			<!-- 遍历字符串 -->
			<h2>测试遍历字符串(用得少)</h2>
			<ul>
				<li v-for="(char,index) of str" :key="index">
					{{char}}-{{index}}
				</li>
			</ul>
			
			<!-- 遍历指定次数 -->
			<h2>测试遍历指定次数(用得少)</h2>
			<ul>
				<!-- number数值12345,index索引值01234 -->
				<li v-for="(number,index) of 5" :key="index">
					{{index}}-{{number}}
				</li>
			</ul>
		</div>

		<script type="text/javascript">
			Vue.config.productionTip = false
			
			new Vue({
				el:'#root',
				data:{
					persons:[
						{id:'001',name:'张三',age:18},
						{id:'002',name:'李四',age:19},
						{id:'003',name:'王五',age:20}
					],
					car:{
						name:'奥迪A8',
						price:'70万',
						color:'黑色'
					},
					str:'hello'
				}
			})
		</script>
</html>

3.2 key作用与原理

1.index做标识

 对比虚拟dom里面input一样,索性直接用了人家的真是dom,轮到王五比较左边没有key是3的了,于是自己生成真是dom

都是从新虚拟dom上掉下来的,复用率低

2. id作为key是唯一标识,不错乱

只有老刘30和后面的框新生成,绿色框里都是复用的,效率高,数据不会错乱 

3. 不写key照样错乱

不写在用v-for时,vue自动把遍历的索引值作为key了(说白了如果你没有写key,vue自动帮你补了index)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>key的原理</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
				面试题:react、vue中的key有什么作用?(key的内部原理)
						
						1. 虚拟DOM中key的作用:
										key是虚拟DOM对象的标识,当数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM】, 
										随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较,比较规则如下:
										
						2.对比规则:
									(1).旧虚拟DOM中找到了与新虚拟DOM相同的key:
												①.若虚拟DOM中内容没变, 直接使用之前的真实DOM!
												②.若虚拟DOM中内容变了, 则生成新的真实DOM,随后替换掉页面中之前的真实DOM。

									(2).旧虚拟DOM中未找到与新虚拟DOM相同的key
												创建新的真实DOM,随后渲染到到页面。
												
						3. 用index作为key可能会引发的问题:
											1. 若对数据进行:逆序添加、逆序删除等破坏顺序操作:
															会产生没有必要的真实DOM更新 ==> 界面效果没问题, 但效率低。

											2. 如果结构中还包含输入类的DOM:
															会产生错误DOM更新 ==> 界面有问题。

						4. 开发中如何选择key?:
											1.最好使用每条数据的唯一标识作为key, 比如id、手机号、身份证号、学号等唯一值。
											2.如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,仅用于渲染列表(没有输入操作)用于展示,
												使用index作为key是没有问题的。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<!-- 遍历数组 -->
			<h2>人员列表(遍历数组)</h2>
			<button @click.once="add">添加一个老刘</button>
			<ul>
				<li v-for="(p,index) of persons" :key="index">
					{{p.name}}-{{p.age}}
					<input type="text">
				</li>
			</ul>
		</div>

		<script type="text/javascript">
			Vue.config.productionTip = false
			
			new Vue({
				el:'#root',
				data:{
					persons:[
						{id:'001',name:'张三',age:18},
						{id:'002',name:'李四',age:19},
						{id:'003',name:'王五',age:20}
					]
				},
				methods: {
					add(){
						const p = {id:'004',name:'老刘',age:40}
						this.persons.unshift(p)
					}
				},
			})
		</script>
</html>

3.3 列表过滤

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>列表过滤</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			<h2>人员列表</h2>
			<input type="text" placeholder="请输入名字" v-model="keyWord">
			<ul>
				<li v-for="(p,index) of filPerons" :key="index">
					{{p.name}}-{{p.age}}-{{p.sex}}
				</li>
			</ul>
		</div>

		<script type="text/javascript">
			Vue.config.productionTip = false
			
			//用watch实现
			//#region 开始折叠
			/* new Vue({
				el:'#root',
				data:{
					keyWord:'',
					persons:[
						{id:'001',name:'马冬梅',age:19,sex:'女'},
						{id:'002',name:'周冬雨',age:20,sex:'女'},
						{id:'003',name:'周杰伦',age:21,sex:'男'},
						{id:'004',name:'温兆伦',age:22,sex:'男'}
					],
					filPerons:[]
				},
				watch:{
					keyWord:{
						immediate:true,一上来啥也没干直接调handler,val是空串,每个字符串里都有空串所以全都显示
						handler(val){
							//filter过滤,return后面是留下来的,p.name里是否包含val
							若this.Perons接收,变了之后再接收返给data再体现在页面,但数据会越过滤越少
							所以定义了一个新的this.filPerons接收,保证原来的数据不变
							this.filPerons = this.persons.filter((p)=>{
								return p.name.indexOf(val) !== -1
							})
						}
					}
				}
			}) */
			//#endregion结束折叠
			
			//用computed实现
			new Vue({
				el:'#root',
				data:{
					keyWord:'',
					persons:[
						{id:'001',name:'马冬梅',age:19,sex:'女'},
						{id:'002',name:'周冬雨',age:20,sex:'女'},
						{id:'003',name:'周杰伦',age:21,sex:'男'},
						{id:'004',name:'温兆伦',age:22,sex:'男'}
					]
				},
				computed:{
					filPerons(){
						//第一个return返回新数组的值(filPerons的值)
						return this.persons.filter((p)=>{
							return p.name.indexOf(this.keyWord) !== -1
						})
					}
				}
			}) 
		</script>
</html>

3.4 列表排序

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>列表排序</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			<h2>人员列表</h2>
			<input type="text" placeholder="请输入名字" v-model="keyWord">
			<button @click="sortType = 2">年龄升序</button>
			<button @click="sortType = 1">年龄降序</button>
			<button @click="sortType = 0">原顺序</button>
			<ul>
				<li v-for="(p,index) of filPerons" :key="p.id">
					{{p.name}}-{{p.age}}-{{p.sex}}
					<input type="text">
				</li>
			</ul>
		</div>

		<script type="text/javascript">
			Vue.config.productionTip = false
			
			new Vue({
				el:'#root',
				data:{
					keyWord:'',
					sortType:0, //0原顺序 1降序 2升序
					persons:[
						{id:'001',name:'马冬梅',age:30,sex:'女'},
						{id:'002',name:'周冬雨',age:31,sex:'女'},
						{id:'003',name:'周杰伦',age:18,sex:'男'},
						{id:'004',name:'温兆伦',age:19,sex:'男'}
					]
				},
				computed:{
					filPerons(){
						//过滤排序不分家
						const arr = this.persons.filter((p)=>{
							return p.name.indexOf(this.keyWord) !== -1
						})
						//判断一下是否需要排序
						if(this.sortType){
							arr.sort((p1,p2)=>{
								return this.sortType === 1 ? p2.age-p1.age : p1.age-p2.age
							})
						}
						return arr
						//sort(a,b)前-后升序,后-前降序
					}
				}
			}) 

		</script>
</html>

3.5 更新时的一个问题

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>更新时的一个问题</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			<h2>人员列表</h2>
			<button @click="updateMei">更新马冬梅的信息</button>
			<ul>
				<li v-for="(p,index) of persons" :key="p.id">
					{{p.name}}-{{p.age}}-{{p.sex}}
				</li>
			</ul>
		</div>

		<script type="text/javascript">
			Vue.config.productionTip = false
			
			const vm = new Vue({
				el:'#root',
				data:{
					persons:[
						{id:'001',name:'马冬梅',age:30,sex:'女'},
						{id:'002',name:'周冬雨',age:31,sex:'女'},
						{id:'003',name:'周杰伦',age:18,sex:'男'},
						{id:'004',name:'温兆伦',age:19,sex:'男'}
					]
				},
				methods: {
					updateMei(){
						// this.persons[0].name = '马老师' //奏效
						// this.persons[0].age = 50 //奏效
						// this.persons[0].sex = '男' //奏效
						// this.persons[0] = {id:'001',name:'马老师',age:50,sex:'男'} //不奏效Vue检测不到,但是代码改了
						  //先点按钮更新再打开vue开发者工具data里的就改了,反之不能改
						this.persons.splice(0,1,{id:'001',name:'马老师',age:50,sex:'男'})
					}
				}
			}) 

		</script>
</html>

3.6 Vue监测数据的原理_对象

vue检测对象里面数据的改变:只要里面有对象,就有对应的set,get检测

//模拟一个数据监测
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>Document</title>
	</head>
	<body>
		<script type="text/javascript" >

			let data = {
				name:'尚硅谷',
				address:'北京',
			}

			//创建一个监视的实例对象,用于监视data中属性的变化
			const obs = new Observer(data)		
			console.log(obs)	

			//准备一个vm实例对象
			let vm = {}
			vm._data = data = obs

			function Observer(obj){
				//汇总对象中所有的属性形成一个数组keys
				const keys = Object.keys(obj)
				//遍历
				keys.forEach((k)=>{
					//this是Observer身上的实例对象
					//Object.defineProperty往这个实例对象身上添加属性k
					Object.defineProperty(this,k,{
						getSS(){
							//obj[k]传入对象身上的属性
							return obj[k]
						},
						set(val){
							console.log(`${k}被改了,我要去解析模板,生成虚拟DOM.....我要开始忙了`)
							obj[k] = val
							//把传入对象身上的k属性改掉
						}
					})
				})
			}
			
			


		</script>
	</body>
</html>

 3.7 Vue.set()方法

不能给vm/data追加属性,只能给data里面的某一个对象追加属性

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>Vue监测数据改变的原理</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			<h1>学校信息</h1>
			<h2>学校名称:{{school.name}}</h2>
			<h2>学校地址:{{school.address}}</h2>
			<h2>校长是:{{school.leader}}</h2>
			<hr/>
			<h1>学生信息</h1>
			<button @click="addSex">添加一个性别属性,默认值是男</button>
			<h2>姓名:{{student.name}}</h2>
			<h2 v-if="student.sex">性别:{{student.sex}}</h2>
			<h2>年龄:真实{{student.age.rAge}},对外{{student.age.sAge}}</h2>
			<h2>朋友们</h2>
			<ul>
				<li v-for="(f,index) in student.friends" :key="index">
					{{f.name}}--{{f.age}}
				</li>
			</ul>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		const vm = new Vue({
			el:'#root',
			data:{
				school:{
					name:'尚硅谷',
					address:'北京',
				},
				student:{
					name:'tom',
					age:{
						rAge:40,
						sAge:29,
					},
					friends:[
						{name:'jerry',age:35},
						{name:'tony',age:36}
					]
				}
			},
			methods: {
				addSex(){
					//Vue.set(target,key,value)
					// Vue.set(this.student,'sex','男')
					this.$set(this.student,'sex','男')
				}
			}
		})
	</script>
</html>

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

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

相关文章

【ElasticSearch7.X】学习笔记(一)

【ElasticSearch7.X】学习笔记一、介绍1.1、ElasticSearch1.2、RESTful1.3、数据格式二、下载安装&#xff08;单机部署&#xff09;2.1、解压文件2.2、修改配置配置2.3、创建用户并授权2.5、启动三、增删查改3.1、 索引操作3.1.1、增加索引3.1.2、查看索引3.1.2.1、查看所有索…

定时任务介绍及X-Job和E-Job简单对比

下面对elastic-Job和xxl-Job做个简单的描述和对比 一、区别 1、XJob环境依赖于mysql&#xff0c;不依赖ZooKeeper&#xff0c; 2、EJob依赖ZooKeeper1、X-Job 侧重的业务实现的简单和管理的方便&#xff0c;学习成本简单&#xff0c; 失败策略和路由策略丰富。推荐使用在“用户…

对elasticsearch的实际应用

有业务需求&#xff0c;要做一个搜索接口&#xff0c;从千万的数据中根据筛选项查到需要的数据 筛选项有 1.学段。高中&#xff0c;初中等 2.学科。数学&#xff0c;语文等 3.专区。同步专区&#xff0c;高考专区等 4.试卷类型。月考卷&#xff0c;期中考试卷等 5.年级。高一&a…

MyBatis-Plus常用注解

常用注解 TableName 在使用MyBatis-Plus实现基本的CRUD时&#xff0c;我们并没有指定要操作的表&#xff0c;只是在Mapper接口继承BaseMapper时&#xff0c;设置了泛型User&#xff0c;而操作的表为user表 由此得出结论&#xff0c;MyBatis-Plus在确定操作的表时&#xff0c;…

基于 Tensorflow 2.x 从零训练花卉图像识别模型

一、数据集准备 本篇文章使用数千张花卉照片作为数据集&#xff0c;共分为5个分类&#xff1a;雏菊&#xff08;daisy&#xff09;、蒲公英&#xff08;dandelion&#xff09;、玫瑰&#xff08;roses&#xff09;、向日葵&#xff08;sunflowers&#xff09;、郁金香&#xf…

ClickHouse中的数据类型

ClickHouse中的数据类型数据类型说明数值类型IntFloatDecimal字符串类型StringFixedStringUUID时间类型DateDateTimeDateTIme64复杂类型ArrayEnumTupleNested特殊类型IPV4GEOBoolean 和 Nullable[参考文章]&#xff1a; ClickHouse &#xff5c; 数据类型介绍 数据类型说明 …

Docker | docker安装portainer详细步骤

portainer是一款容器管理可视化界面&#xff0c;不想在虚拟中使用命令管理容器的小伙伴&#xff0c;可以选择安装portainer对容器进行管理&#xff0c;查看日志、启动、停止容器等非常方便。 1. 搜索portainer镜像 docker search portainer 2. 拉取portainer镜像 docker pull…

[torch]日志记录之SummaryWriter(持更)

参考博文&#xff1a; 《tensorboardX的简单使用》《详解PyTorch项目使用TensorboardX进行训练可视化》《使用TensorBoard检查监控深度学习模型》 一、使用方法 class SummaryWriter(builtins.object)| SummaryWriter(log_dirNone, comment, purge_stepNone, max_queue10, f…

Springboot扩展点之ApplicationContextInitializer

前言 一提到Spring、Springoboot&#xff0c;很多人马上就会想到依赖注入、控制反转、自动装配、约定大于配置、使开发变得简单等等。但是如果仅仅会使用Springboot、SpringMVC完成一些增删改查&#xff0c;解决一些bug&#xff0c;那么实际上你并没有真的懂Spring、Sp…

每天5分钟机器学习:线性判别分析LDA算法

本文重点 我们前面学习了PCA算法,本文我们将学习一种新的算法,这种算法和PCA非常相似,这个算法叫做线性判别分析,简称为LDA,也称为Fisher线性判别(Fisher Linear Discriminant,FLD),是模式识别的经典算法,在1996年由Belhumeur引入模式识别和人工智能领域。 LDA原理 …

毒鸡汤 | 云服务器部署项目

文章目录前言环境介绍安装PHP安装Apache安装MySQL上传项目访问网站前言 新年的第一篇文章&#xff0c;今年继续努力加油&#xff0c;继续产出高质量的文章。 前面用PHPstudy搭建了【毒鸡汤】项目&#xff0c;但是这样只能自己访问&#xff0c;别人是访问不了的&#xff0c;因此…

Redis 持久化机制

个人博客地址&#xff1a; 文章目录Redis 持久化机制1. 概述2. RDB2.1 手动快照2.2 自动快照3. AOF3.1 AOF机制3.2 AOF文件的重写4. 混合型持久化5. 总结Redis 持久化机制 1. 概述 Redis​为了保证性能&#xff0c;会将所有数据放在内存中&#xff0c;那么万一Redis宕机&…

AcWing 756. 蛇形矩阵

目录问题描述思路与代码1. 个人解法2. 官方题解问题描述 原题链接&#x1f517;&#xff1a;756. 蛇形矩阵 输入两个整数 nnn 和 mmm&#xff0c;输出一个 nnn 行 mmm 列的矩阵&#xff0c;将数字 111 到 nmnmnm 按照回字蛇形填充至矩阵中。 具体矩阵形式可参考样例。 输入格…

synchronized底层原理

synchronized是JVM内置锁&#xff0c;基于monitor机制实现&#xff0c;依赖底层操作系统的互斥源语Mutex&#xff08;互斥量&#xff09;&#xff0c;它是一个重量级锁&#xff0c;性能较低。 当然&#xff0c;JVM内置锁在1.5之后版本做了重大优化&#xff0c;如锁粗化&#xf…

[红明谷CTF 2021]JavaWeb

0x01 好久没打过ctf了&#xff0c;最近也在学Java 就看下java的题吧 WP 进入环境就提示访问 /login &#xff0c;访问之后 提示的 /json ,试着访问一下 给了 jessid&#xff0c;继续访问 /json 的话 又会跳转至 /login 应该是要传点username password 果然是了&#…

web制作网页

HTML(人的骨架): 标签 1.超文本标记性语言 2.当前最新版HTML5 3.URL统一资源定位器&#xff08;网址&#xff09; 4.网站首页名称index.html&#xff0c;default.htm&#xff0c;main.heml 基本结构&#xff1a; 注意&#xff1a;1.标签都是小写 2.标签成对写 3.代码要层次缩进…

JavaScript内存管理

JavaScript 是一个弱类型的、动态语言&#xff0c;在执行一段 JS 代码时&#xff0c;需要经历编译、执行、内存回收阶段。 一、编译阶段 JS 代码执行时&#xff0c;会首先创建全局执行上下文、以及函数执行上下文&#xff0c;上下文的执行顺序按照栈的方式进行调用&#xff0c…

面试题: JVM内存结构

目录目的资源概览JVM内存溢出分类类型1: OutOfMemoryError类型2: StackOverflowError方法区与永久代、元空间之间的关系目的 学习记录, 面试准备 资源 B站的一个讲高频面试题的一个学习视频 概览 线程私有 ① 程序计数器 ② 虚拟机栈线程共享 ① 堆 ② 方法区 JVM内存溢…

RSA密钥协商过程

目录 TSL握手过程 RSA密钥协商握手过程 TLS第一次握手 TLS第二次握手 客户端验证证书 TLS第三次握手 TLS 第四次握手 RSA 算法的缺陷 TSL握手过程 HTTP 由于是明文传输&#xff0c;所谓的明文&#xff0c;就是说客户端与服务端通信的信息都是肉眼可见的&#xff0c;随…

linux常用指令讲解

文章目录 前言一、指令详解总结前言 Linux是一种自由和开放源代码的类UNIX操作系统&#xff0c;该操作系统的内核由林纳斯托瓦兹在1991年首次发布&#xff0c;之后&#xff0c;在加上用户空间的应用程序之后&#xff0c;就成为了Linux操作系统。严格来讲&#xff0c;Linux只是操…