前端vue入门(纯代码)15

news2024/11/14 16:34:59

16.Vue的过渡与动画

1.点击切换按钮:实现某一元素的显示/隐藏

Test.vue文件中

<template>
	<div>
		<!-- 点击事件触发后,isShow取反 -->
    <!-- 通过点击按钮让h1标签出现或者消失 -->
		<button @click="isShow = !isShow">切换按钮:显示/隐藏</button>
		<h1 v-show="isShow">你好啊,梅小姐!</h1>
	</div>
</template>

<script>
export default {
	name: 'Test',
	data() {
		return {
			isShow: true,
		};
	},
};
</script>

<style scoped>
  button {
    background-color: aquamarine;
  }
  h1 {
    background-color: orange;
  }
</style>

在这里插入图片描述

2.切换太生硬了:利用Vue的 transition标签,来处理过渡以及动画

  • 1、准备样式

    过度样式

    • 元素进入的样式
    • v-enter:进入的起点
    • v-enter-active:进入过程中
    • v-enter-to:进入的终点
    • 元素离开的样式
      • v-leave:离开的起点
      • v-leave-active:离开过程中
      • v-leave-to:离开的终点

    动画样式

    • 定义动画

      • @keyframes 动画名 { … }
    • 使用动画

      • v-enter-active:进入过程中的动画

      • v-leave-active:离开过程中的动画

  • 2、使用<transition>包裹要过度的元素

    • <transition>要过添加过度或动画的元素</transiton>

知识补充:

  • 关键帧 @keyframes 动画名 { … }

  • <transition>包裹的元素一开始就有出场动画【有以下两种方式,but如果写成了appear="true",没有冒号,那等式右边的"true"就成一个字符串,所以必须要有冒号】

    <transition name="haha" :appear="true">
    
    <transition name="haha" appear>
    

完整Test.vue代码

<template>
	<div>
		<!-- 点击事件触发后,isShow取反 -->
    <!-- 通过点击按钮让h1标签出现或者消失 -->
		<button @click="isShow = !isShow">切换按钮:显示/隐藏</button>
		<transition name="haha" appear>
      <h1 v-show="isShow">你好啊,梅小姐!</h1>
    </transition>
	</div>
</template>

<script>
export default {
	name: 'Test',
	data() {
		return {
			isShow: true,
		};
	},
};
</script>

<style scoped>
  button {
    background-color: aquamarine;
  }
  h1 {
    background-color: orange;
  }
  /* 针对name为haha的 <transition></transition>设置的样式动画*/
  .haha-enter-active {
    /* 进入过程中 :动画名XYG,持续时间 1s 匀速*/
    animation: XYG 1s linear ;
  }
  .haha-leave-active {
    /* 离开过程中 :动画名XYG,持续时间 1s 匀速  翻转XYG动画*/
    animation: XYG 1s linear reverse;
  }
  /* 自定义动画 XYG 从from...到to...*/
  @keyframes XYG{
    from{
      /*XYG动画从左边看不见   */
      transform: translateX(-100%);
    }
    to{
      /*到完全显示出来   */
      transform: translateX(0);
    }
  }
</style>

在这里插入图片描述

3.如果Vue的 <transition>标签中想放入多个类似于list的标签,请用<transition-group>标签,但是在<transition-group>标签中包裹的元素必须写key值。

<transition-group name="haha" appear>
  <h1 v-show="isShow" key="1">你好啊,梅小姐!</h1>
  <h1 v-show="!isShow" key="2">梅小姐,伍六七想约你去海边!</h1>
</transition-group>
  • 样式css分析
/* 进入的起点、离开的终点 */
.haha-enter,.haha-leave-to{
    transform: translateX(-100%);
}
 /* 进入的过程、离开的过程 */
.haha-enter-active,.haha-leave-active{
    transition: 0.5s linear;
}
/* 进入的终点、离开的起点 */
.haha-enter-to,.haha-leave{
    transform: translateX(0);
}
  • 【此处的v指<transition-group name="haha">中的name:haha】

进入、离开的起点

  • .v-leave :在离开过渡被触发时立刻生效,并在下一帧被移除。
  • .v-enter :在进入过渡被触发时立刻生效,并在下一帧被移除。

进入、离开的过程

  • .v-leave-active :在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。
  • .v-enter-active :在整个进入过渡的阶段中应用,在进入过渡被触发时立刻生效,在过渡/动画完成之后移除。

进入、离开的终点

  • .v-leave-to:在离开过渡被触发之后下一帧生效 (与此同时 v-leave 被删除),在过渡/动画完成之后移除。
  • .v-enter-to:在进入过渡被触发之后下一帧生效 (与此同时 v-enter 被删除),在过渡/动画完成之后移除。
  • .v-leave-active和**.v-leave是同时被添加到标签中的,但是.v-leave被添加的时间只有一帧**;.v-leave-to是最后一个添加到标签中的
<template>
	<div>
		<!-- 点击事件触发后,isShow取反 -->
    <!-- 通过点击按钮让h1标签出现或者消失 -->
		<button @click="isShow = !isShow">切换按钮:显示/隐藏</button>
		<transition-group name="haha" appear>
      <h1 v-show="isShow" key="1">你好啊,梅小姐!</h1>
      <h1 v-show="!isShow" key="2">梅小姐,伍六七想约你去海边!</h1>
    </transition-group>
	</div>
</template>

<script>
export default {
	name: 'Test2',
	data() {
		return {
			isShow: true,
		};
	},
};
</script>

<style scoped>
  button {
    background-color: aquamarine;
  }
  h1 {
    background-color: orange;
  }
	/* 进入的起点、离开的终点 */
	.haha-enter,.haha-leave-to{
		transform: translateX(-100%);
	}
  /* 进入的过程、离开的过程 */
	.haha-enter-active,.haha-leave-active{
		transition: 0.5s linear;
	}
	/* 进入的终点、离开的起点 */
	.haha-enter-to,.haha-leave{
		transform: translateX(0);
	}
</style>

在这里插入图片描述

Vue使用第三方库实现动画效果:animate.css

1、安装animate.css库
npm i animate.css 
2、引入animate.css库
import 'animate.css';
3、基础用法

name="animate__animated animate__bounce"必须配置

 <transition name="animate__animated animate__bounce">
4、配置样式

通过enter-active-classleave-active-class实现不同样式配置

<transition-group 
appear
name="animate__animated animate__bounce"
enter-active-class="animate__backInRight"
leave-active-class="animate__backOutUp"
>
...
</transition-group>  

在这里插入图片描述

案例代码:

<template>
	<div>
		<!-- 点击事件触发后,isShow取反 -->
        <!-- 通过点击按钮让h1标签出现或者消失 -->
		<button @click="isShow = !isShow">切换按钮:显示/隐藏</button>
		<transition-group 
        appear
        name="animate__animated animate__bounce"
        enter-active-class="animate__backInRight"
        leave-active-class="animate__backOutUp"
        >
      <h1 v-show="isShow" key="1">你好啊,梅小姐!</h1>
      <h1 v-show="!isShow" key="2">梅小姐,伍六七想约你去海边!</h1>
    </transition-group>
	</div>
</template>

<script>
// animate依赖包在node_modules
import 'animate.css';
export default {
	name: 'Test3',
	data() {
		return {
			isShow: true,
		};
	},
};
</script>

<style scoped>
  button {
    background-color: aquamarine;
  }
  h1 {
    background-color: orange;
  }
</style>

动画效果展示:

在这里插入图片描述

17.TodoList案例动画

TodoList.vue文件中需要修改的代码

<template>
	<ul class="todo-main">
		<transition-group
			appear
			name="animate__animated animate__bounce"
			enter-active-class="animate__backInRight"
			leave-active-class="animate__backOutUp"
		>
			<TodoItem
				v-for="todoObj in todos"
				:key="todoObj.id"
				:todo="todoObj"
			/>
		</transition-group>
	</ul>
</template>
import 'animate.css';

动画效果展示:

在这里插入图片描述

完整代码:

main.js

//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'
//关闭Vue的生产提示
Vue.config.productionTip = false

//创建vm
new Vue({
	el:'#app',
	render: h => h(App),
  // 生命周期钩子beforeCreate中模板未解析,且this是vm
  beforeCreate() {
    // this:指的是vm
		Vue.prototype.$bus = this  //安装全局事件总线$bus
  }
})

App.vue

<template>
	<div id="root">
		<div class="todo-container">
			<div class="todo-wrap">
        <TodoHeader @addTodo="addTodo"/>
				<TodoList 
         :todos="todos"
        />
				<TodoFooter
        :todos="todos"
        @checkAllTodo="checkAllTodo"
        @clearAllTodo="clearAllTodo"
        />
			</div>
		</div>
	</div>
</template>

<script>
import pubsub from "pubsub-js";
//引入App的子组件
import TodoHeader from './components/TodoHeader'
import TodoFooter from './components/TodoFooter'
import TodoList from './components/TodoList'

  export default {
    name:'App',
    components: { TodoHeader,TodoFooter,TodoList },
    data() {
      return {
        //由于todos是TodoHeader组件和TodoFooter组件都在使用,所以放在App中(状态提升)
        todos:[
          {id:'001',title:'练功夫',done:true},
					{id:'002',title:'睡觉',done:false},
					{id:'003',title:'打豆豆',done:true}
        ],
      }
    },
    methods: {
      //添加一个todo
      addTodo(todoObj){
        // 在数组的开头添加一个数据
        this.todos.unshift(todoObj)
      },
      //全选or取消全选
      checkAllTodo(done){
        this.todos.forEach(todo => todo.done = done)
      },
      // 清除所有已经完成的todo
      clearAllTodo(){
        this.todos= this.todos.filter(todo =>{
          return todo.done == false
          // 或者换成 return !todo.done
        }
        )
      },
    },
    mounted() {
      // 利用数据总线去通信
      //勾选or取消勾选一个todo
      this.$bus.$on('checkTodo',(id)=>{
        this.todos.forEach((todo) => {
          if(todo.id === id) todo.done = !todo.done
        })
      })
      
      // 利用消息的订阅与发布去通信
      // 订阅deleteTodo
      this.pubId = pubsub.subscribe('deleteTodo',(_,id)=>{
        this.todos=this.todos.filter(
          (todo)=>{
            return todo.id != id
          }
        )
      })
    },
    beforeDestroy() {
      // this.$bus.$off(['deleteTodo','checkTodo'])
      this.$bus.$off(['checkTodo'])
      // 取消订阅
      pubsub.unsubscribe(this.pubId)
    },

  }
</script>

<!-- style没有scoped属性:【全局样式】 -->
<!-- style有scoped属性:样式设置只在本组件里起作用【局部样式】 -->
<style>
	/*base*/
	body {
		background: #fff;
	}
  .btn {
    /* 行内的块级元素 */
		display: inline-block;
		padding: 4px 12px;
		margin-bottom: 0;
		font-size: 14px;
		line-height: 20px;
    /* 文本内容居中 */
		text-align: center;
    /* 垂直居中 */
		vertical-align: middle;
		cursor: pointer;
		box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
		border-radius: 4px;
	}
	.btn-danger {
    /* 字体颜色设置:白色 */
		color: #fff;
		background-color: #da4f49;
		border: 1px solid #bd362f;
	}
  /* 鼠标移动到删除按钮时 */
	.btn-danger:hover {
		color: #fff;
		background-color: #bd362f;
	}
	.btn:focus {
		outline: none;
	}

	.todo-container {
		width: 600px;
    /* 上下外边距为0,左右自动,实际效果为左右居中*/
		margin: 0 auto;
	}
  /* 后代选择器(包含选择器),选择到的是todo-container下面的所有后代todo-wrap  */
	.todo-container .todo-wrap {
		padding: 10px;
		border: 1px solid #67dbd1;
		border-radius: 5px;
	}
</style>

TodoHeader.vue

<template>
	<div class="todo-header">
    <!-- @keyup.enter="add" :按下回车按键,调用add方法 -->
		<input type="text" placeholder="请输入你的任务名称,按回车键确认" @keyup.enter="add" v-model="title"/>
	</div>
</template>

<script>
// 引入nanoid库生成ID号
import { nanoid } from 'nanoid'
export default {
	name: 'TodoHeader',
/*   //接收从App组件【父组件】传递过来的addTodo方法
  props:['addTodo'], */
  data() {
    return {
      title: '',
    }
  },
  methods: {
    add(){
      // 如果输入框里为空,就跳过下面的代码,并弹窗
      if (!this.title.trim()) return alert('请输入值')
      //将用户的输入包装成一个todo对象
      const todoObj={id:nanoid(),title:this.title,done:false}
      //通知App组件去添加一个todo对象
      //触发自定义事件addTodo,并把子组件中的参数todoObj传给父组件
      this.$emit('addTodo',todoObj)
      //清空输入
      this.title = ''
    }
  },
};
</script>

<style scoped>
    /* 头部样式设置 */
    /* 后代选择器(包含选择器),选择到的是todo-header下面的所有后代input */
    .todo-header input {
		width: 560px;
		height: 28px;
		font-size: 14px;
		border: 1px solid #ccc;
		border-radius: 4px;
    /* 内边距:上下4px,左右7px */
		padding: 4px 7px;
	}

  /* :focus获得焦点,并设置其新样式:例如:用户单击一个input输入框获取焦点,然后这个input输入框的边框样式就会发生改变,和其他的输入框区别开来,表明已被选中。 */
	.todo-header input:focus {
    /* outline 与 border 相似,不同之处在于 outline 在整个元素周围画了一条线;它不能像 border 那样,指定在元素的一个面上设置轮廓,也就是不能单独设置顶部轮廓、右侧轮廓、底部轮廓或左侧轮廓。 */
		outline: none;
    /* 定义边框的颜色 */
		border-color: rgba(82, 168, 236, 0.8);
    /* boxShadow 属性把一个或多个下拉阴影添加到框上 */
    /* 设置inset:内部阴影,不设置inset:外部阴影 */
    /* 【0 0】:不设置X轴与Y轴偏移量 */
    /* 第三个值【如10px,8px】:设置值阴影模糊半径为15px */
		box-shadow: inset 0 0 10px rgba(124, 56, 207, 0.075), 0 0 8px rgba(224, 58, 17, 0.6);
    background-color: bisque;
	}
</style>

TodoList.vue

<template>
	<ul class="todo-main">
		<transition-group
			appear
			name="animate__animated animate__bounce"
			enter-active-class="animate__backInRight"
			leave-active-class="animate__backOutUp"
		>
			<TodoItem
				v-for="todoObj in todos"
				:key="todoObj.id"
				:todo="todoObj"
			/>
		</transition-group>
	</ul>
</template>

<script>
import 'animate.css';
import TodoItem from './TodoItem';
export default {
	name: 'TodoList',
	components: { TodoItem },
	//声明接收App传递过来的数据,其中todos是自己用的,checkTodo和deleteTodo是给子组件TodoItem用的
	props: ['todos'],
};
</script>

<style scoped>
/*main*/
.todo-main {
	/* 左外边距:0px 【盒子贴着盒子】*/
	margin-left: 0px;
	border: 1px solid #ddd;
	border-radius: 2px;
	padding: 0px;
}

.todo-empty {
	height: 40px;
	line-height: 40px;
	border: 1px solid #ddd;
	border-radius: 2px;
	padding-left: 5px;
	margin-top: 10px;
}
</style>

TodoItem.vue

<template>
	<li>
		<label>
			<input type="checkbox" 
              :checked="todo.done"
              @change="handleCheck()"
              />
			<span>{{todo.title}}</span>
		</label>
		<button class="btn btn-danger" @click="handleDelete()">删除</button>
	</li>
</template>

<script>
import pubsub from "pubsub-js";
export default {
	name: 'TodoItem',
  // 声明接受从别的组件中的todoObj对象,todo
  props: ['todo'],
  methods: {
    //勾选or取消勾选【别弄混了:这里的id其实就是上面change事件中的todo.id】
    handleCheck(){
      //change事件触发后,通知App组件将对应的todo对象的done值取反
      // this.checkTodo(id)
      this.$bus.$emit('checkTodo',this.todo.id)
      // console.log(this.todo.id);
    },
    //删除
    handleDelete(){
      if (confirm('Are you sure you want to delete?')) {
        //点击后,发布订阅后通知App组件将对应的todo对象删除,参数
        pubsub.publish('deleteTodo',this.todo.id)
      }
    }
  },
};
</script>

<style scoped>
 /*item*/
 li {
    /* ul无序列表 ol有序列表*/
    /* 列表前面无标记 */
		list-style: none;
    /* height定义了一个li盒子的高度 */
		height: 36px;
    /* 行高:指的是文字占有的实际高度 */
		line-height: 36px;
    /* 当height和line-height相等时,即盒子的高度和行高一样,内容上下居中 */
		padding: 0 5px;
    /* 边框底部:1px的实心线 颜色*/
		border-bottom: 1px solid #c0abc3;
	}

  /* 后代选择器(包含选择器),选择到的是li下面的所有后代label */
	li label {
    /* 左对齐浮动【元素一旦浮动就会脱离文档流(不占位,漂浮)】 */
		float: left;
    /* 鼠标放在label元素上时变成小小手 */
		cursor: pointer;
	}

	li label input {
     /* 垂直居中 */
		vertical-align: middle;
		margin-right: 6px;
		position: relative;
		top: -1px;
	}

   /* 后代选择器(包含选择器),选择到的是li下面的所有后代button */
	li button {
    /* 向右浮动 */
		float: right;
    /* 不为被隐藏的对象保留其物理空间,即该对象在页面上彻底消失,通俗来说就是看不见也摸不到。 */
		display: none;
    /* 上边距为3px */
		margin-top: 3px;
	}

	li:before {
    /* initial:它将属性设置为其默认值。 */
		content: initial;
	}

   /* 结构伪类选择器 选择最后一个li元素 */ 
	li:last-child {
    /* 边框底部没有线 */
		border-bottom: none;
	}

	li:hover{
		background-color: #ddd;
	}
	
  /* 鼠标移动到该元素上时,将button按钮显示出来 */
	li:hover button{
    /*  display:block将元素显示为块级元素 */
		display: block;
	}
</style>

TodoFooter.vue

<template>
	<div class="todo-footer" v-show="total">
		<label>
			<!-- <input type="checkbox" :checked="isAll" @change="checkAll"/> 
      可以用下面这行代码代替-->
      <!--对于type="checkbox",v-model绑定的就是一个布尔值,isAll为false or true  -->
			<input type="checkbox" v-model="isAll"/>
		</label>
		<span>
			<span>已完成{{ doneTotal }}</span> / 全部{{ total }}
		</span>
		<button class="btn btn-danger" @click="clearAllDone">清除已完成任务</button>
	</div>
</template>

<script>
export default {
	name: 'TodoFooter',
  props: ['todos'],
  computed:{
    //总数
    total(){
      return this.todos.length
    },
    // 已完成数
    doneTotal(){
      //此处使用reduce方法做条件统计
      /* return this.todos.reduce(
        // todo:遍历数组todos中的每一个元素
        // 比如:数组遍历时,把数组todos中的每一个元素分别赋值给todo【包含id='001'】
        (pre,todo)=>{
          // console.log('@',pre,todo)
          return pre + (todo.done ? 1 : 0)
        }
      ,0) */
      //简写
      return this.todos.reduce((pre,todo)=>pre + (todo.done ? 1 : 0),0)
    },
    //控制全选框
 /*    isAll(){
       //计算属性简写:isAll属性,只能被读取,不能被修改
      return this.total === this.doneTotal && this.total>0
    } */
    isAll:{
      //get有什么作用?当有人读取isAll时,get就会被调用,且返回值就作为isAll的值
			//get什么时候调用?1.初次读取isAll时。2.所依赖的数据发生变化时。
      get(){
        //全选框是否勾选  【&&:且】
        return this.total === this.doneTotal && this.total>0
      },
      //set什么时候调用? 当isAll被修改时。
      // value就是:v-model绑定的值false【未勾选】 or true【勾选】
      set(value){
        console.log(value)
        this.$emit('checkAllTodo',value)
      }
    },
  },
  methods: {
/*     checkAll(e){
      console.log(e.target.checked);
      // 拿到的是全选或者全不选的布尔值
      this.checkAllTodo(e.target.checked)
    } */

    // 清空所有已完成
    clearAllDone(){
      // this.clearAllTodo()
      this.$emit('clearAllTodo')
    }
  },
};
</script>

<style scoped>
	/*footer*/
	.todo-footer {
		height: 40px;
		line-height: 40px;
		padding-left: 6px;
		margin-top: 5px;
	}

	.todo-footer label {
		display: inline-block;
		margin-right: 20px;
		cursor: pointer;
	}

	.todo-footer label input {
		position: relative;
		top: -1px;
		vertical-align: middle;
		margin-right: 5px;
	}

	.todo-footer button {
		float: right;
		margin-top: 5px;
	}
</style>

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

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

相关文章

哈工大计算机网络课程网络层协议详解之:DHCP协议

哈工大计算机网络课程网络层协议详解之&#xff1a;DHCP协议 文章目录 哈工大计算机网络课程网络层协议详解之&#xff1a;DHCP协议如何获得IP地址&#xff1f;硬编码动态主机配置协议-DHCP&#xff1a;&#xff08;Dynamic Host Configuration Protocol&#xff09; 动态主机配…

设计模式篇(Java):前言(UML类图、七大原则)

编写软件过程中&#xff0c;程序员面临着来自耦合性&#xff0c;内聚性以及可维护性&#xff0c;可扩展性&#xff0c;重用性&#xff0c;灵活性等多方面的挑战&#xff0c;设计模式是为了让程序(软件)&#xff0c;具有更好&#xff1a; 代码重用性 (即&#xff1a;相同功能的…

Web自动化测试平台的设计与落地

目录 前言 一、目标和定位 二、平台特点 三、系统架构 四、相关技术栈 五、UI概览 六、待完善部分 总结&#xff1a; 前言 我最初开始接触Web自动化测试的时候&#xff0c;没有直接的领路人&#xff0c;测试行业知识也远不及如今这么丰富和易获取&#xff0c;当时我对于…

Hello算法学习笔记之搜索

一、二分查找 1.从数组中找到target的索引 注意&#xff1a;while条件是< O&#xff08;logn&#xff09; 二分查找并非适用于所有情况&#xff0c;原因如下&#xff1a; 二分查找仅适用于有序数据。若输入数据无序&#xff0c;为了使用二分查找而专门进行排序&#xff…

视频处理器对LED显示屏的作用

视频处理器在LED显示屏中扮演着重要的角色&#xff0c;其作用如下&#xff1a; 图像和视频信号处理&#xff1a;视频处理器负责对输入的图像和视频信号进行处理和优化&#xff0c;以确保在LED显示屏上呈现出高质量的图像和视频内容。它可以对图像进行去噪、锐化、色彩校正、亮度…

【数据结构】复杂度

目录 &#x1f4d6;什么是数据结构&#xff1f;&#x1f4d6;什么是算法&#xff1f;&#x1f4d6;算法效率&#x1f4d6;时间复杂度&#x1f516;大O的渐进表示法&#x1f516;常见时间复杂度计算举例&#x1f516;面试题&#xff1a;消失的数字 &#x1f4d6;空间复杂度&…

I2C协议应用(嵌入式学习)

I2C协议&应用 0. 前言1. 概念2. 特点&工作原理3. 应用示例代码模板HAL模板 0. 前言 I2C是Inter-Integrated Circuit的缩写&#xff0c;它是一种广泛使用的串行通信协议。它由飞利浦&#xff08;现在是NXP Semiconductors&#xff09;开发&#xff0c;并已成为各种电子…

无迹卡尔曼滤波在目标跟踪中的作用(一)

在前一节中&#xff0c;我们介绍了扩展卡尔曼滤波算法EKF在目标跟踪中的应用&#xff0c;其原理是 将非线性函数局部线性化&#xff0c;舍弃高阶泰勒项&#xff0c;只保留一次项 &#xff0c;这就不可避免地会影响结果的准确性&#xff0c;除此以外&#xff0c;实际中要计算雅各…

软件测试面试试卷,答对90%直接入职大厂

一&#xff0e;填空 1、 系统测试使用&#xff08; C &#xff09;技术, 主要测试被测应用的高级互操作性需求, 而无需考虑被测试应用的内部结构。 A、 单元测试 B、 集成测试 C、 黑盒测试 D、白盒测试 2、单元测试主要的测试技术不包括&#xff08;B &…

Linux 如何刷新 DNS 缓存

Linux 如何刷新 DNS 缓存 全文&#xff1a;如何刷新 DNS 缓存 (macOS, Linux, Windows) Unix Linux Windows 如何刷新 DNS 缓存 (macOS, FreeBSD, RHEL, CentOS, Debian, Ubuntu, Windows) 请访问原文链接&#xff1a;https://sysin.org/blog/how-to-flush-dns-cache/&#…

Elasticsearch:install

ElasticSearch Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。 Elasticsearch结合Kibana、Logstash、Beats&#xff0c;也就是elastic stack(ELK)。被广泛应用在日志分析、实时监控&#xff08;CPU、Memory、Program&#xff09;等领域。 elasticsearch是…

【Linux 驱动篇(一)】字符设备驱动开发

文章目录 一、字符设备驱动简介二、字符设备驱动开发步骤1. 驱动模块的加载和卸载2. 字符设备注册与注销3. 实现设备的具体操作函数3.1 能够对 chrtest 进行打开和关闭操作3.2 对 chrtest 进行读写操作 4. 添加 LICENSE 和作者信息 三、Linux 设备号1. 设备号的组成 一、字符设…

网工内推 | 2023应届生专场,上市公司招网工,CCNP以上认证优先

01 浙江宇视科技有限公司 招聘岗位&#xff1a;IT网络工程师 职责描述&#xff1a; 1、负责公司内部核心网络建设&#xff0c;进行网络架构的规划、设计、调整、性能优化&#xff1b; 2、负责公司网络环境的管理&#xff0c;配置&#xff0c;监控、排错&#xff0c;维护&#…

津津乐道设计模式 - 适配器模式详解(家里电器电源标准不统一的问题都解决了)

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

Servlet 相关内容

1. Servlet 1.1 Servlet概述 Servlet 是 SUN 公司提供的一套规范&#xff0c;名称就叫 Servlet 规范&#xff0c;它也是 JavaEE 规范之一&#xff0c;可以通过API来学习。目前在Oracle官网中的最新版本是JavaEE8&#xff0c;该网址中介绍了JavaEE8的一些新特性。当然&#xff…

【C语言初阶】带你轻松玩转所有常用操作符(2) ——赋值操作符,单目操作符

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,这里是君兮_&#xff0c;今天给大家带来的是有关操作符的第二部分内容&#xff0c;废话不多说&#xff0c;咱们直接开始吧&#xff01; 在正式开始之前&#xff0c;我们还是借助一张思维导图帮助大致简单回忆一下有…

Docker-compose的使用

目录 Docker-compose 简介 docker-compose的安装 docker-compose.yaml文件说明 compose的常用命令 总结 Docker-compose 简介 Docker-compose 是用于定义和运行多容器的 Docker 应用程序的工具。可以使用YAML文件来配置应用程序的服务。&#xff08;通俗讲是可以通过yml文…

LeetCode108-将有序数组转换为二叉搜索树

题目来源 108. 将有序数组转换为二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 题目 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵高度平衡 二叉搜索树。 高度平衡二叉树是一棵满足「每个节点的左右两个子树的高度差的…

智慧地下采矿,“像素游戏”智能呈现

在这个像素世界里&#xff0c;我们需要一个智能地下采矿可视化综合管理平台&#xff0c;来帮助我们管理和监控地下采矿全流程。 图扑软件依托自主研发的 HT for Web 产品&#xff0c;结合三维定制化渲染、动态模拟、物理碰撞、5G、物联网、云计算及大数据等先进技术&#xff0c…

从零开始理解Linux中断架构(8)---执行上下文之CPU上下文

1 CPU上下文的来由 CPU上下文是切换任务到CPU时需要保存和恢复的CPU寄存器。ARM64需要保存的寄存器如下图所示 X19-X29作为CPU上下文的依据是什么? 实际上这里使用了一个隐含的事实:Linux所有的任务切换都是在内核中__switch_to函数中进行的,当前任务通过__…