【三十天精通Vue 3】第五天 Vue 3指令详解

news/2024/11/30 12:42:20/

请添加图片描述

✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: 三十天精通 Vue 3

文章目录

  • 引言
    • 一、Vue 3 指令概述
      • 1.1 指令的简介
      • 1.2 指令的分类
      • 1.3 指令的语法
    • 二、Vue 3 基本指令
      • 2.1 组件指令
        • 2.1.2 指令对象中的指令
      • 2.2 实例指令
      • 2.3 全局指令
    • 三、Vue 3 交互指令
      • 3.1 事件指令
      • 3.2 响应式指令
      • 3.3 动画指令
    • 四、Vue 3 路由指令
      • 4.1 路由概述
      • 4.2 路由声明
      • 4.3 路由守卫
      • 4.4 路由参数
    • 五、Vue 3 状态指令
      • 5.1 状态概述
      • 5.2 状态声明
      • 5.3 状态守卫
    • 六、Vue 3 插件指令
      • 6.1 插件概述
      • 6.2 插件声明
      • 6.3 插件使用
    • 七、Vue 3 指令的常见问题及解决方案
      • 7.1 指令的命名问题
      • 7.2 指令的兼容性问题
      • 7.3 指令的编译问题

引言

Vue 3 指令是 Vue 3 新引入的一个概念,它可以让开发者更加灵活地构建 Vue 组件。相比于 Vue 2 的指令,Vue 3 指令更加简洁、易读,同时也更加强大。今天将介绍 Vue 3 指令的概述、基本指令、交互指令、路由指令、状态指令、插件指令以及指令的常见问题及解决方案。

一、Vue 3 指令概述

1.1 指令的简介

指令是一段可执行的代码,它可以通过 Vue 实例或组件传递给其他组件或实例。指令可以修改或查询组件的属性、处理事件、设置动画效果等等。

1.2 指令的分类

Vue 3 指令可以根据其作用类型进行分类,包括:

  • 基本指令:用于修改或查询组件的属性,如 v-model:key: 等。
  • 交互指令:用于处理组件与用户的交互事件,如 onMouseEnteronMouseLeave:hover 等。
  • 路由指令:用于管理路由,如 router-linkrouter-view<router-link> 等。
  • 状态指令:用于管理组件的状态,如 v-model:key: 等。
  • 插件指令:用于注册插件,如 register-pluginuse-plugin 等。

1.3 指令的语法

Vue 3 指令的语法比较简单,通常使用小写字母和下划线组成,例如 v-bindv-on@ 等。指令的参数可以是任何数据类型,包括字符串、数字、对象等。指令的返回值可以是任何数据类型,包括函数、对象等。

例如,以下代码是一个简单的组件指令示例:

<template>  <div v-bind:style="{ backgroundColor: color }">  <p>Hello Vue!</p>  </div>  
</template>  

在上面的代码中,v-bind 指令用于将 color 变量绑定到组件模板中,:style 修饰符用于将 color 变量传递给组件的 style 属性。

二、Vue 3 基本指令

2.1 组件指令

在组件模板中使用的指令通常以 v- 开头,例如 v-modelv-showv-else 等。这些指令可以修改组件的模板属性,例如 <input> 组件中的 value 属性。

以下是一个简单的示例,展示了如何在组件模板中使用 v-model 指令绑定表单输入的值到组件的 value 属性上:

<template>  <div>  <input type="text" v-model="inputValue" />  <p>Input value: {{ inputValue }}</p>  </div>  
</template>  

在上面的代码中,v-model 指令将 inputValue 属性与表单输入框的值进行绑定。当用户在表单输入框中输入文本时,inputValue 属性的值也会自动更新。

2.1.2 指令对象中的指令

在组件指令对象中使用的指令通常以 : 开头,例如 :: 等。这些指令可以修改组件的属性或实例的属性。

以下是一个简单的示例,展示了如何在组件指令对象中使用 : 指令来设置组件的 id 属性:

export default {  data() {  return {  id: ''  };  },  mounted() {  this.id = this.$route.params.id;  },  beforeDestroy() {  this.id = '';  }  
};  

在上面的代码中,: 指令将 id 属性与组件的 $route.params.id 进行绑定。当组件实例加载时,this.id 的值自动设置为路由参数的值。当组件实例销毁时,this.id 的值自动设置为空字符串。

2.2 实例指令

实例指令是用于实例对象上的数据传递和处理事件等的指令。实例指令通常使用小写字母和下划线组成,例如 v-on@ 等。

例如,以下代码是一个简单的实例指令示例:

new Vue({  el: '#app',  data: {  message: 'Hello Vue!',  },  methods: {  reverseMessage() {  this.message = this.message.split('').reverse().join('')  }  },  template: `<div v-on:click="reverseMessage">Reverse Message</div>`  
})  

在上面的代码中,v-on 指令用于监听组件实例上的 click 事件,:click 修饰符用于将 click 事件传递给组件实例,reverseMessage 方法用于将组件实例中的 message 数据进行反转。

2.3 全局指令

Vue 3 中的全局指令是用于管理整个应用程序的状态和事件的一种机制。在 Vue 3 中,全局指令可以覆盖组件中的指令,使其成为应用程序级别的指令。以下是一个简单的示例:

import { defineComponent, ref } from 'vue'const MyComponent = defineComponent({  name: 'MyComponent',  props: {  value: {  type: String,  default: ''  }  },  setup() {  const inputRef = ref('default value')return {  inputValue: inputRef.value,  handleInputChange(event) {  inputRef.value = event.target.value  }  }  }  
})export default MyComponent  

在上面的代码中,defineComponent 函数被用来定义 MyComponent 组件。组件中使用了 ref 指令来创建一个响应式的 inputRef 变量,该变量用于监听用户输入。

在组件的 setup 函数中,使用了 defineProperties 指令来定义应用程序级别的属性 value。这个属性会被整个应用程序共享,因此所有的组件都可以访问和修改它。

最后,在组件中使用了 handleInputChange 指令来处理用户输入的变化,该指令将更新 inputRef 变量的值。

在 Vue 3 中,全局指令还可以通过 export default 关键字在模块中定义,以便在整个应用程序中共享。例如,以下代码定义了一个名为 GlobalComponent 的全局组件:

import { defineComponent, ref } from 'vue'const GlobalComponent = defineComponent({  name: 'GlobalComponent',  components: {  default: MyComponent  },  setup() {  const inputRef = ref('default value')return {  inputValue: inputRef.value,  handleInputChange(event) {  inputRef.value = event.target.value  }  }  }  
})export default GlobalComponent  

在上面的代码中,defineComponent 函数被用来定义 GlobalComponent 组件。这个组件使用了 ref 指令来创建一个响应式的 inputRef 变量,该变量用于监听用户输入。组件中还使用了 components 指令将 MyComponent 组件作为组件加载器引入。

在 Vue 3 中,全局指令可以通过 export 关键字在模块中定义,以便在整个应用程序中共享。例如,以下代码定义了一个名为 GlobalComponent 的全局组件:

import { defineComponent, ref } from 'vue'const GlobalComponent = defineComponent({  name: 'GlobalComponent',  components: {  default: MyComponent  },  setup() {  const inputRef = ref('default value')return {  inputValue: inputRef.value,  handleInputChange(event) {  inputRef.value = event.target.value  }  }  }  
})export default GlobalComponent  

在上面的代码中,defineComponent 函数被用来定义 GlobalComponent 组件。组件中使用了 ref 指令来创建一个响应式的 inputRef 变量,该变量用于监听用户输入。组件中还使用了 components 指令将 MyComponent 组件作为组件加载器引入。

三、Vue 3 交互指令

3.1 事件指令

事件指令是用于在组件中触发事件的一种指令。在 Vue 2 中,我们通常使用 $emit 指令来触发事件,而在 Vue 3 中,我们则可以使用 @event 指令来触发事件。使用 @event 指令可以更加方便地绑定事件处理程序,并且可以通过组件的 data 对象进行事件数据的传播和处理。

下面是一个使用 @event 指令触发事件的示例:

<template>  <div @click="handleClick">点击我</div>  
</template><script>  
export default {  data() {  return {  eventData: "Hello, event data!"  };  },  methods: {  handleClick() {  this.$emit("event", this.eventData);  }  }  
};  
</script>  

在上面的示例中,我们使用 @event 指令触发了一个名为 “event” 的事件,并且在组件的 data 对象中定义了一个名为 “eventData” 的数据对象。在事件处理程序中,我们使用 $emit 指令触发了该事件,并将事件数据传递到了事件处理程序中。

3.2 响应式指令

响应式指令是用于在组件中实现响应式数据的指令。在 Vue 2 中,我们通常使用 datacomputed 指令来定义响应式数据,而在 Vue 3 中,我们则可以使用 watch 指令来实现响应式数据的管理。

例如,我们可以使用 watch 指令来监听组件中的数据变化,并在数据变化时自动更新组件的视图。下面是一个使用 watch 指令监听组件中数据变化的示例:

<template>  <div>  <p v-text="message"></p>  </div>  
</template><script>  
export default {  data() {  return {  message: "Hello, world!"  };  },  watch: {  message() {  this.$emit("update");  }  }  
};  
</script>  

在上面的示例中,我们定义了一个名为 “message” 的数据对象,并且在组件的 watch 指令中定义了一个名为 “message” 的响应式变量。当该变量的值发生变化时,我们使用 $emit 指令触发了一个名为 “update” 的事件,以便在更新组件的视图时进行必要的清理和重置操作。

3.3 动画指令

动画指令是用于在组件中实现动画效果的一种指令。在 Vue 2 中,我们通常使用 v-show 指令来实现组件的显示和隐藏动画,而在 Vue 3 中,我们则可以使用 @transition 指令来实现组件的动画效果。

例如,我们可以使用 @transition 指令来实现一个淡入淡出的动画效果:

<template>  <div @click="toggle">点击我切换样式</div>  
</template><script>  
export default {  data() {  return {  isOpen: false  };  },  methods: {  toggle() {  this.isOpen = !this.isOpen;  }  },  transition: {  name: "open"  }  
};  
</script>  

在上面的示例中,我们定义了一个名为 “open” 的动画效果,并且在组件的 transition 指令中定义了一个名为 “open” 的动画效果名称。当组件的 isOpen 属性发生变化时,我们使用 toggle 方法实现了一个淡入淡出的动画效果。

四、Vue 3 路由指令

4.1 路由概述

Vue 3 中的路由是用于管理应用程序中的页面切换的指令。它允许我们在应用程序中创建动态的页面切换,并且可以通过简单的 URL 来管理页面的导航。Vue 3 中的路由由三个主要组件组成:路由声明、路由守卫和路由参数。

4.2 路由声明

路由声明是用于定义路由的指令。在 Vue 3 中,我们可以使用 router 指令来声明路由。使用 router 指令可以定义路由的根路径、路由的子路径、路由的参数等。例如,以下代码段将定义一个名为 index 的路由,该路由包含一个名为 home 的子路由,该子路由包含一个名为 index 的参数:

<template>  <div>  <a @click="goHome">Home</a>  <a @click="goAbout">About</a>  </div>  
</template><script>  
import { Router } from "vue-router";export default {  name: "App",  components: {  Home,  About  },  router: Router,  
};  
</script>  

4.3 路由守卫

路由守卫是用于验证路由是否被授权访问的指令。在 Vue 3 中,我们可以使用 router-link 指令来创建路由链接,并且可以使用 router-link-active 指令来设置链接的样式。例如,以下代码段将创建一个名为 index 的路由,该路由包含一个名为 home 的子路由,该子路由包含一个名为 index 的参数,并且将在点击链接时激活链接:

<template>  <div>  <a @click="goHome" router-link-active="activeLink">Home</a>  <a @click="goAbout" router-link-active="activeLink">About</a>  </div>  
</template><script>  
import { Router } from "vue-router";export default {  name: "App",  components: {  Home,  About  },  router: Router,  
};  
</script>  

4.4 路由参数

在 Vue 3 中,我们可以使用 router-link 指令来创建路由链接,并且可以使用 router-link-active 指令来设置链接的样式。例如,以下代码段将创建一个名为 index 的路由,该路由包含一个名为 home 的子路由,该子路由包含一个名为 index 的参数,并且将在点击链接时激活链接:

<template>  <div>  <a @click="goHome" router-link="/home/index" router-link-active="activeLink">Home</a>  <a @click="goAbout" router-link="/about/index" router-link-active="activeLink">About</a>  </div>  
</template><script>  
import { Router } from "vue-router";export default {  name: "App",  components: {  Home,  About  },  router: Router,  
};  
</script>  

五、Vue 3 状态指令

5.1 状态概述

在 Vue 3 中,状态管理是通过 Vuex 实现的。Vuex 是一个用于 Vue 应用程序的状态管理库。Vuex 允许我们在组件之间共享状态,并在组件之间进行状态的更新和获取。在 Vue 3 中,我们还可以使用其他状态管理库,例如清虚。

5.2 状态声明

在 Vue 3 中,我们可以使用 v-model 指令来声明响应式状态。v-model 指令绑定在表单控件上,它可以与 Vuex 或清虚状态管理库进行集成。例如,以下代码段将创建一个名为 quantity 的状态,该状态与表单控件绑定:

<template>  <div>  <input type="number" v-model="quantity" />  <button @click="incrementQuantity">Increase</button>  <button @click="decrementQuantity">Decrease</button>  </div>  
</template><script>  
import { store } from "vuex";  
import { incrementQuantity, decrementQuantity } from "vuex-methods";export default {  name: "QuantityInput",  data() {  return {  quantity: 10  };  },  methods: {  incrementQuantity() {  this.quantity++;  },  decrementQuantity() {  this.quantity--;  }  },  mounted() {  this.updateQuantity();  },  beforeDestroy() {  this.updateQuantity();  },  computed: {  quantity() {  return this.$store.state.quantity;  }  },  watch: {  quantity() {  this.updateQuantity();  }  }  
};function updateQuantity() {  this.$store.commit("updateQuantity", this.quantity);  
}export default {  name: "QuantityInput",  data() {  return {  quantity: 10  };  },  methods: {  incrementQuantity() {  this.quantity++;  },  decrementQuantity() {  this.quantity--;  }  },  mounted() {  this.updateQuantity();  },  beforeDestroy() {  this.updateQuantity();  },  computed: {  quantity() {  return this.$store.state.quantity;  }  },  watch: {  quantity() {  this.updateQuantity();  }  }  
};export default {  name: "QuantityInput",  data() {  return {  quantity: 10  };  },  methods: {  incrementQuantity() {  this.quantity++;  },  decrementQuantity() {  this.quantity--;  }  },  mounted() {  this.updateQuantity();  },  beforeDestroy() {  this.updateQuantity();  },  computed: {  quantity() {  return this.$store.state.quantity;  }  },  watch: {  quantity() {  this.updateQuantity();  }  }  
};

5.3 状态守卫

在 Vue 3 中,你可以使用状态守卫来保护组件状态。状态守卫是一种机制,它可以确保组件中的状态只能被实例化一次。例如,如果你有一个包含状态的组件,并且想要确保该状态只能被实例化一次,你可以使用以下代码:

export default {  data() {  return {  myValue: ''  }  },  setup() {  const instance = thisfunction createInstance() {  if (instance.myValue === '') {  // 如果实例化过一次,则返回一个新的实例  return new Vue({  el: '#app',  data: {  myValue: '初始值'  }  })  }// 否则返回原来的实例  return instance  }return {  createInstance,  instance  }  }  
}

在这个例子中,myValue 状态只能在组件实例化一次之后才能被更新。这是因为 createInstance 函数会返回一个新的组件实例,而这个实例只会被实例化一次。每次组件重新渲染时,都会使用相同的实例,而不是新的实例。

除了保护状态之外,状态守卫还可以用于管理组件中的状态。例如,你可以使用 watch 方法来监听状态的变化,并在状态变化时执行相应的方法。例如:

export default {  data() {  return {  myValue: ''  }  },  setup() {  const instance = thisfunction createInstance() {  if (instance.myValue === '') {  // 如果实例化过一次,则返回一个新的实例  return new Vue({  el: '#app',  data: {  myValue: '初始值'  }  })  }// 否则返回原来的实例  return instance  }return {  createInstance,  instance  }  },  watch: {  myValue: function (value) {  // 执行相应的方法  }  }  
}

在这个例子中,myValue 状态的变化会触发 watch 方法中的函数,并在状态变化时执行相应的方法。

六、Vue 3 插件指令

6.1 插件概述

在 Vue 3 中,插件可以看作是一个可重复使用的代码块,它包含了一些功能或组件,可以与其他组件或代码块进行集成。插件指令可以让我们在组件中加载插件,并在组件中使用该插件。

6.2 插件声明

要使用插件指令,我们需要先声明一个插件。在 Vue 3 中,我们可以使用 importexport 关键字来声明一个插件。

使用 import 关键字声明的插件可以被其他组件或代码块所使用。例如,以下代码块中,我们使用 import 关键字来声明一个名为 my-plugin 的插件:

import myPlugin from '@/plugins/my-plugin';export default {  name: 'MyComponent',  plugins: [myPlugin],  
};  

使用 export 关键字声明的插件则只能被当前组件所使用。例如,以下代码块中,我们使用 export 关键字来声明一个名为 my-plugin 的插件:

export default {  name: 'MyComponent',  plugins: [myPlugin],  
};  

在声明插件时,我们需要指定插件的名称和导出该插件的对象。例如,以下代码块中,我们使用 name 选项来指定插件的名称,并使用 export 关键字来导出该插件的对象:

export default {  name: 'my-plugin',  // 插件的代码块  
};  

在 Vue 3 中,我们可以使用 provideinject 选项来指定插件的依赖项和注入的值。例如,以下代码块中,我们使用 provide 选项来指定插件的依赖项,并使用 inject 选项来指定插件的注入值:

export default {  name: 'my-plugin',  provide() {  return {  // 依赖项  };  },  inject(context) {  // 注入的值  },  
};  

6.3 插件使用

在 Vue 3 中,我们可以使用 import来加载插件。例如,以下代码块中,我们使用 import 关键字来加载一个名为 my-plugin 的插件:

import myPlugin from '@/plugins/my-plugin';export default {    name: 'MyComponent',    plugins: [myPlugin],    
};    

在加载插件时,我们需要将插件的代码块作为参数传递给插件指令。例如,以下代码块中,我们使用插件指令来加载一个名为 my-plugin 的插件,并将其注入到组件中:

<template>    <div>    <button @click="handleClick">Click me</button>    </div>    
</template><script>    
import { defineComponent } from 'vue';export default {    name: 'MyComponent',    data() {    return {    plugins: [    {    name: 'my-plugin',    // 插件的代码块    },    ],    };    },    methods: {    handleClick() {    // 插件中的方法    },    },    
};    
</script>    

在这个例子中,我们使用 import 关键字来加载一个名为 my-plugin 的插件,并将其注入到组件中。然后,我们在组件的 methods 选项中定义了一个名为 handleClick 的方法,该方法调用了该插件中的方法。

除了使用 import 关键字来加载插件之外,我们还可以通过 require 关键字来加载插件。例如,以下代码块中,我们使用 require 关键字来加载一个名为 my-plugin 的插件:

<template>    <div>    <button @click="handleClick">Click me</button>    </div>    
</template><script>    
import { defineComponent } from 'vue';export default {    name: 'MyComponent',    data() {    return {    plugins: [    {    name: 'my-plugin',    // 插件的代码块    },    ],    };    },    methods: {    handleClick() {    // 插件中的方法    },    },    
};    
</script>    

在这个例子中,我们使用 require 关键字来加载一个名为 my-plugin 的插件,并将其注入到组件中。然后,我们在组件的 methods 选项中定义了一个名为 handleClick 的方法,该方法调用了该插件中的方法。

无论我们使用 import 还是 require 关键字来加载插件,插件的代码块都会被视为组件,我们可以在组件中使用 v-model 指令来绑定插件中的方法。例如,以下代码块中,我们使用 v-model 指令来绑定插件中的方法:

<template>    <div>    <button @click="handleClick">Click me</button>    <input v-model="pluginValue" />    </div>    
</template><script>    
import { defineComponent } from 'vue';export default {    name: 'MyComponent',    data() {    return {    plugins: [    {    name: 'my-plugin',    // 插件的代码块    },    ],    };    },    methods: {    handleClick() {    // 插件中的方法    },    },    
};    
</script>    

在这个例子中,我们使用 v-model 指令来绑定插件中的方法,该方法会在组件的 data 选项中声明一个 plugins 对象,该对象中包含了该组件所需要使用的插件。

七、Vue 3 指令的常见问题及解决方案

7.1 指令的命名问题

在 Vue 3 中,指令的命名空间采用了双冒号命名法,例如 v-model@click 等。在使用指令时,我们需要将指令的参数和属性名用冒号分隔开来,例如 v-model:value@click:preventDefault 等。

有些开发者可能会使用传统的单冒号命名法,例如 v-model-value@click-preventDefault 等。但在 Vue 3 中,这种命名方式是不兼容的,会导致指令编译失败。因此,我们建议使用双冒号命名法来编写 Vue 3 中的指令。

7.2 指令的兼容性问题

在 Vue 3 中,我们可以选择使用 Vue 2 中的指令,也可以选择使用 Vue 3 中的新指令。对于 Vue 2 中的指令,我们可以在 Vue 3 中使用 v-bindv-model 等新指令进行替换。例如,以下代码块中,我们使用 v-bind 替换了 Vue 2 中的 v-bind:

<template>      <div>      <button @click="handleClick">Click me</button>      <input v-model="value" />      </div>      
</template><script>      
import { defineComponent } from 'vue';export default {      name: 'MyComponent',      data() {      return {      value: '',      };      },      methods: {      handleClick() {      this.value = 'Hello Vue 3!';      },      },      
};      
</script>      

对于 Vue 3 中的新指令,例如 @click@change 等,我们可以在 Vue 2 中使用 v-model 指令进行替换。例如,以下代码块中,我们使用 v-model 替换了 Vue 3 中的 @click:

<template>      <div>      <button @click="handleClick">Click me</button>      <input v-model="value" />      </div>      
</template><script>      
import { defineComponent } from 'vue';export default {      name: 'MyComponent',      data() {      return {      value: '',      };      },      methods: {      handleClick() {      this.value = 'Hello Vue 3!';      },      },      
};      
</script>      

对于 Vue 3 中的新指令,例如 @keyup@change 等,我们可以在 Vue 2 中使用 @input 指令进行替换。例如,以下代码块中,我们使用 @input 指令替换了 Vue 3 中的 @keyup:

<template>      <div>      <button @click="handleClick">Click me</button>      <input v-model="value" @input="handleInput" />      </div>      
</template><script>      
import { defineComponent } from 'vue';export default {      name: 'MyComponent',      data() {      return {      value: '',      };      },      methods: {      handleClick() {      this.value = 'Hello Vue 3!';      },      handleInput(event) {      this.value = event.target.value;      },      },      
};      
</script>      

7.3 指令的编译问题

在 Vue 3 中,指令的编译过程已经发生了变化。具体来说,Vue 3 中的指令编译器不再是一个插件,而是内置在 Vue 实例中。因此,当你使用 Vue 3 时,你需要显式地调用 compile 方法来编译指令。

下面是一个简单的例子:

import { compile } from 'vue'function MyDirective() {  return {  bind: function() {  console.log('Binding to element')  },  update: function() {  console.log('Updating element')  }  }  
}const directive = compile(MyDirective)new Vue({  el: '#app',  data: {  message: 'Hello Vue!'  },  methods: {  printMessage() {  console.log(`The message is: ${this.message}`)  }  },  directives: [directive]  
})  

在上面的例子中,我们首先定义了一个自定义指令 MyDirective。然后,我们使用 compile 方法将指令编译为一个渲染函数。最后,我们创建了一个 Vue 实例,并将其传递给 el 属性。在实例中,我们定义了一个数据对象 message,以及一个方法 printMessage。最后,我们向实例中添加了一个指令 MyDirective,并将其传递给 directives 属性。

在 Vue 3 中,指令的编译过程是由内置的 compile 方法完成的。该方法接受一个指令定义对象,并将其转换为一个渲染函数。在渲染函数中,指令定义中的 bindupdate 方法将被调用,以绑定和更新指令所应用的元素的值。

需要注意的是,在 Vue 3 中,指令的编译过程不再是一个插件。这意味着指令的编译结果直接内置在 Vue 实例中,因此不需要使用 register 方法进行注册。
在这里插入图片描述


http://www.ppmy.cn/news/41607.html

相关文章

Akka定时任务schedule()方法

Akka定时任务schedule()方法 文章目录Akka定时任务schedule()方法什么是Akka定时任务schedule()方法&#xff1f;如何使用Akka定时任务schedule()方法&#xff1f;如何在actor外部获取Scheduler对象为什么需要提供一个隐式的ExecutionContext对象&#xff0c;用于执行定时任务&…

DNS服务器解析故障处理记录之arp_cache neighbor table overflow

过程背景 收到反馈 dns 解析异常&#xff0c;手动 dig 客户端响应超时&#xff1a; dig test.com ip# 省略部分 ; (1 server found) ;; global options: cmd ;; connection timed out; no servers could be reached过一段时间后 dig 恢复正常&#xff0c;dns 服务在故障过程中…

Delphi TdxBarManager通过代码生成菜单

procedure TForm6.btn1Click(Sender: TObject); var ABar:TdxBar; ABarItem:TdxBarItem; ABarSubItem:TdxBarSubItem; ABarItemLink:TdxBarItemLink; ABarButton:TdxBarButton; begin Self.dxBarManager1.Style:bmsOffice11; //设置样式 bmsFlat|bmsOffice…

gnome换回纵向切换工作区

效果&#xff1a; 思路 最新的debian / ubuntu中用的gnome 4.x&#xff0c;工作区切换变成了左右切换&#xff0c;习惯了上下&#xff0c;真的很不舒服。 而且优化选项里也把设置开关取消掉了&#xff0c;解决方案是使用Vertical overview这个扩展&#xff1a; ## 安装扩展管…

2.30、守护进程(1)

2.30、守护进程&#xff08;1&#xff09;1.终端是什么2.进程组是什么3.会话是什么4.进程组、会话、控制终端之间的关系5.进程组、会话操作有哪些函数①pid_t getpgrp(void);②pid_t getpgid(pid_t pid);③int setpgid(pid_t pid, pid_t pgid);④pid_t getsid(pid_t pid);⑥pid…

前端必备技能——TypeScript与JavaScript区别

TypeScript与JavaScript区别 文章目录TypeScript与JavaScript区别[TOC](文章目录)前言一、什么是JavaScript?二、什么是TypeScript?TypeScript增加了什么&#xff1f;TypeScript的应用三、JavaScript与TypeScript的区别总结前言 TypeScript逐渐成为前端工程师必备的技能之一…

2.3-6循环链表

原理的单链表和循环单链表的区别&#xff1a; 初始化循环单链表时&#xff0c;使头节点next指针指向头节点。 判断循环单链表是否为空。 对比&#xff1a; 单链表&#xff1a;if(L->next NULL) 双链表&#xff1a;if(L->nextL) 判断循环单链表的结点p是否为表尾结点…

「 操作系统 」聊聊进程调度算法

「 操作系统 」聊聊进程调度算法 图文并茂&#xff01;谈谈进程调度那些算法 Cone 进程调度/页面置换/磁盘调度算法 xiaolinCoding 图解经典的进程调度算法 飞天小牛肉 文章目录「 操作系统 」聊聊进程调度算法一、进程调度的定义二、非抢占式调度算法先到先服务 FCFS最短作业优…