组件冲突、data函数、组件通信

文章目录

    • 1.组件的三大组成部分 - 注意点说明
    • 2.组件的样式冲突(用 scoped 解决)
    • 3.data是一个函数
    • 4.组件通信
      • 1.什么是组件通信?
      • 2.不同的组件关系 和 组件通信方案分类
    • 5.prop详解
      • prop 校验
        • ①类型校验
        • ②完整写法(类型,非空,默认,自定义)
      • prop & data 单项数据流
    • 6.非父子通信(拓展)- event bus 事件总线
    • 7.非父子通信-provide-inject(拓展)
    • 8.v-model详解(帮助更好的理解v-model应用与组件进行组件通信)
      • v-model原理
      • 表单类组件封装 $ v-model 简化代码
    • 9.sync修饰符
    • 10.ref 和$refs
      • 获取dom元素
      • 获取组件元素
    • 11.Vue异步更新,$nextTick

1.组件的三大组成部分 - 注意点说明

组件的三大组成部分 - 注意点说明👇

①结构 < template >:只能有一个根元素
②样式 < style >:
全局样式(默认):影响所有组件
局部样式:scoped样式下,只作用于当前组件
③逻辑 < script >:el根实例独有,data是一个函数,其他配置项一致
(下面将详细的逐一地学一下②③部分)

2.组件的样式冲突(用 scoped 解决)

默认情况:写在组件中的样式会 全局生效→ 因此很容易造成多个组件之间的样式冲突问题。

scoped原理:

  • 1.给当前组件模板的所有元素,都会被添加上一个自定义属性data-v-hash值(且同一个组件中的hash值是一样的,所以它就可以用不同的hash值区分不同的组件)
    在这里插入图片描述
  • 2.css选择器的后面,被自动处理,添加上了属性选择器
    在这里插入图片描述
  • 最终效果必须是当前组件的元素,才会有这个自定义属性,才会被这个样式作用到

在这里插入图片描述

//BaseOne.vue
<template>
    <div>BaseOne</div>
</template>

<script>
export default{
}
</script>
<style>
/* 默认的style样式,会作用于全局 */
    div {
        border:  3px solid blue;
        margin: 30px;
    }
</style>

//BaseTwo.vue
<template>
    <div>BaseTwo</div>
</template>
<script>
export default{
}
</script>
<style>
</style>

//App.vue
<template>
  <div id="app">
    <BaseOne></BaseOne>
    <BaseTwo></BaseTwo>
  </div>
</template>

<script>
import BaseOne from './components/BaseOne.vue';
import BaseTwo from './components/BaseTwo.vue'
export default{
    name:'App',
    components:{
      BaseOne:BaseOne,
      BaseTwo:BaseTwo
    }

}
</script>

<style>

</style>
效果图如下

在这里插入图片描述

👇加上scoped进行修改

<style scoped>
/* 1.默认的style样式,会作用于全局
   2.加上scoped属性的style样式,只会作用于当前组件👉局部样式
组件应该有着自己独立的样式,推荐加上scoped
 */
    div {
        border:  3px solid blue;
        margin: 30px;
    }
</style>
效果图如下

在这里插入图片描述

3.data是一个函数

①一个组件如果要提供数据,也是通过data
②一个组件的data选项必须是一个函数。👉 保证每一个组件实例,维护独立的一份数据对象。
每次创建新的组件实例,都会新执行一次data函数,得到一个新的对象

<template>
    <div class="base-count">
        <button @click="count--">-</button>
        <span>{{ count }}</span>
        <button @click="count++">+</button>
    </div>
</template>

<script>
export default{
    // data必须是一个函数 → 保证每个组件实例
    data (){
        return{
            count: 999
        }
    }
}
</script>
<style scoped>
.base-count{
    margin: 20px;
}
</style>

图文总结👇
在这里插入图片描述

4.组件通信

1.什么是组件通信?

组件通信,就是指组件与组件之间的数据传递

  • 组件的数据是独立的,无法直接访问其他组件的数据。
  • 想用其他组件的数据 → 组件通信

思考:1.组件之间有哪些关系? 2.对应的组件通信方案有哪几类?

2.不同的组件关系 和 组件通信方案分类

  • 组件关系分类:
    1.父子关系:组件A包裹组件B.那AB就是父子关系
    2.非父子关系:A包裹B和C,所以BC是非父子关系
    在这里插入图片描述
<!-- App.vue -->
<template>
  <div style="border:3px solid #000;margin: 10px;">
    我是App组件
    <!-- 老爹的这个组件,儿子要用 -->
    <!-- 1. 给组件标签,添加属性的方式传值-->
    <Son :title="myTitle"></Son>
  </div>
</template>

<script>

import BaseSon from './components/BaseSon.vue'
export default{
    data () {
      return {
        myTitle:'黑马程序员'
      }
    },
    components:{
      BaseSon:BaseSon,

    }
}
</script>
<style>
</style>

<!-- BaseSon.vue -->
<template>
    <div style="border:3px solid #000;margin: 10px;">
        <!-- 3.渲染使用 -->
        我是组件Son {{ title }}
    </div>
</template>

<script>
export default{
    // 2.通过props进行接受,且props里面的名字要和老爹里面要传过来的东西同名
    props:['title']//3.这边接收完毕,页面中就可以直接渲染使用了
}
</script>
<style>
</style>

在这里插入图片描述

<!-- App.vue -->
<template>
  <div style="border:3px solid #000;margin: 10px;">
    我是App组件
    <!-- 老爹的这个组件,儿子要用 -->
    <!-- 1. 给组件标签,添加属性的方式传值-->
    <Son :title="myTitle" @changeTitle="handelChange"></Son>
  </div>
</template>

<script>

import BaseSon from './components/BaseSon.vue'
export default{
    data () {
      return {
        myTitle:'黑马程序员'
      }
    },
    components:{
      BaseSon:BaseSon,
    },
    methods:{
      //3.提供处理函数,提供逻辑
      handelChange (newTitle) {
        this.myTitle = newTitle
      }
    }
}
</script>
<style>
</style>

<!-- BaseSon.vue -->
<template>
    <div style="border:3px solid #000;margin: 10px;">
        我是组件Son {{ title }}
        <button @click="changeFn">修改titile</button>
    </div>
</template>

<script>
export default{
    props:['title'],
    methods:{
        changeFn () {
            //1.通过$emit,向父组件发送消息通知
            this.$emit('changeTitle','传智教育')
        }
    }
}
</script>
<style>
</style>

图文总结👇在这里插入图片描述

5.prop详解

什么是prop
Prop定义:组件上注册一些自定义属性
prop作用:向子组件传递数据

特点:

  • 可以传递任意数量的prop
  • 可以传递任意类型的prop

写法:1.在父组件中提供一些数据(字符串,对象,布尔值等)
2.然后通过给当前这个组件以添加属性的方式传值
3.传了之后,在子组件内部,就可以通过props接收
4.最终一面当中就可以做渲染了
👇
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

App.vue

<template>
  <div class="app">
    <!-- 父传子 -->
    <UserInfo
     :username="username"
     :age="age"
     :isSingle="isSingle"
     :car="car"
     :hobby="hobby"
     ></UserInfo>
  </div>
</template>

<script>
import UserInfo from './components/UserInfo.vue'
export default {
  data() {
    return {
      username: '小帅',
      age: 28,
      isSingle: true,
      car: {
        brand: '宝马',
      },
      hobby: ['篮球', '足球', '羽毛球'],
    }
  },
  components: {
    UserInfo,
  },
}
</script>

<style>
</style>

UserInfo.vue

<template>
  <div class="userinfo">
    <h3>我是个人信息组件</h3>
    <div>姓名:{{ username }}</div>
    <div>年龄:{{ age }}</div>
    <div>是否单身:{{ isSingle ? 'yes' : 'no' }}</div>
    <div>座驾:{{ car.brand }}</div>
    <div>兴趣爱好:{{ hobby.join('、') }}</div>    <!-- 加上 .join('、') 就可以给三个爱好的文字之间加上顿号 -->
  </div>
</template>

<script>
export default {
  props:['username','age','isSingle','car','hobby']
}
</script>

<style>
.userinfo {
  width: 300px;
  border: 3px solid #000;
  padding: 20px;
}
.userinfo > div {
  margin: 20px 10px;
}
</style>

prop 校验

思考:组件的prop可以乱传吗?(不可以,比如一个百分比数字不可以给它传布尔值)
作用:为组件的prop指定验证要求,不符合要求,控制台就会有错误提示 → 帮助开发者快速发现错误
语法
①类型校验
②非空校验
③默认值
④自定义校验

①类型校验

需要将原来props接收数据的写法改成对象,对象里面就可以写键值对了。值就是对应的类型要求:比如传进来的是Number类型,就写number
在这里插入图片描述

App.vue
<template>
  <div class="app">
    <BaseProgress :w="width"></BaseProgress>
  </div>
</template>

<script>
import BaseProgress from './components/BaseProgress.vue'
export default {
  data() {
    return {
      width: 'abc',
    }
  },
  components: {
    BaseProgress,
  },
}
</script>

<style>
</style>

BaseProgress.vue
<template>
  <div class="base-progress">
    <div class="inner" :style="{ width: w + '%' }">
      <span>{{ w }}%</span>
    </div>
  </div>
</template>

<script>
export default {
  // props: ["w"],
  props:{
    w:Number//Number String Boolean Array Object Function
  }


  // 1.基础写法(类型校验)
  // 2.完整写法(类型、是否必填、默认值、自定义校验)
}
</script>

<style scoped>
省略
</style>

在这里插入图片描述

②完整写法(类型,非空,默认,自定义)

在这里插入图片描述

<script>
export default {
  // props: ["w"]
  //1.基础校验(类型校验)
  // props:{
  //   w:Number//Number String Boolean Array Object Function
  // }
  // 2.完整写法(类型、是否必填、默认值、自定义校验)
  props:{
    w:{
      //对类型有要求
      type:Number,
      required:true,//需要非空
      default:0,//如果希望有一个默认值。而不是必填
      validator (value){//写这样一个方法,这个方法的形参,是可以拿到
                   //你传递过来的prop传值的,拿到传值,就可以对他进行判断
        if (value >=0 && value <=100) {
          return true
        }
        return false
      }
    }
  }
}
</script>

prop & data 单项数据流

共同点:都可以给组件提供数据
区别:

  • data的数据是自己的 → 随便改
  • prop的数据是外部的 → 不能直接改 ,要循环单向数据流
App.vue
<template>
  <div class="app">
    <BaseCount></BaseCount>
  </div>
</template>

<script>
import BaseCount from './components/BaseCount.vue'
export default {
  components:{
    BaseCount
  },
  data(){
    return {
      count:100
    }
  },
  methods:{
    
  }
}
</script>

<style>

</style>

erzi
<template>
  <div class="base-count">
    <button @click="count--">-</button>
    <span>{{ count }}</span>
    <button @click="count++">+</button>
  </div>
</template>

<script>
export default {
  // 1.自己的数据随便修改 (谁的数据 谁负责)
  // 意思就是,打开网页,想加就加,想减就减
  
  // data () {
  //   return {
  //     count: 100,
  //   }
  // },

  // 2.外部传过来的数据(由父组件提供) 不能随便修改
    props:{
      count:Number
    }
}
</script>

<style>
.base-count {
  margin: 20px;
}
</style>

上面的代码,数据由父组件提供,一保存会直接报错(外部数据不能直接改)
需要提供对应的函数

app.vue
<template>
  <div class="app"><!-- 老爹监听 -->
    <BaseCount
    @changeCount="handleChange"
    ></BaseCount>
  </div>
</template>

<script>
import BaseCount from './components/BaseCount.vue'
export default {
  components:{
    BaseCount
  },
  data(){
    return {
      count:666
    }
  },
  methods:{
    handleChange (newCount) {
    this.count = newCount
    }
  }
}
</script>

<style>

</style>

~.vue
<template>
  <div class="base-count">
    <button @click="handleSub">-</button>
    <span>{{ count }}</span>
    <button @click="handleAdd">+</button>
  </div>
</template>

<script>
export default {
  // 1.自己的数据随便修改 (谁的数据 谁负责)
  // 意思就是,打开网页,想加就加,想减就减
  
  // data () {
  //   return {
  //     count: 100,
  //   }
  // },

  // 2.外部传过来的数据(由父组件提供) 不能随便修改

  //单项数据流:父组件的prop更新,会单向的向下流动,影响到子组件
    props:{
      count:Number
    },
    methods:{
      handleAdd(){
        //通过子传父 this.$emit(事件名,参数)
        //告诉老爹改数字,然后在老爹里面需要监听一下
        this.$emit('changeCount',this.count + 1)
      },
      handleSub(){
        this.$emit('changeCount',this.count - 1)
      }
    }
}
</script>

<style>
.base-count {
  margin: 20px;
}
</style>

6.非父子通信(拓展)- event bus 事件总线

作用:非父子组件之间,进行简易消息传递。(复杂场景 → Vuex)
1.创建一个都能访问到的事件总线(空 Vue实例)→ utils/EventBus.js

impprt Vue for 'vue'
const Bus = new Vue()
export default Bus

2.A组件(接收方),监听Bus实例的事件监听事件(订阅消息)

created () {
	Bus.$on('sendMsg',(msg) =>{
		this.msg = msg
	})

3.B组件(发送方),触发Bus实例的事件

Bus.$emit('sendMsg','这是一个消息')

在这里插入图片描述

7.非父子通信-provide-inject(拓展)

provide & inject 作用:跨层级共享数据

1.父组件`provide``提供数据
(provide写成一个函数,在里面return,return就是共享的数据,里面可以写多个数据【简单(string)/复杂(对象)类型】)

2.你在父组件中共享了数据,在孙组件中想要接收,直接写inject,想接收谁就写谁的名字,一旦接收好了,就可以在孙组件的上方直接渲染

3.共享数据的时候,通常会把它包成的一个对象,一复杂类型(响应式)的方式向下共享

在这里插入图片描述

export default {
	provide () {
		return {
			//普通类型【非响应式】
			colour:this.color,
			//复杂类型【响应式】
			userInfo:this.userInto,
		}
	}
}

子/孙组件(无论多少层) inject取值使用(直接写你要接收的属性名就可以了,将来也可以通过this直接访问)

export default {
	inject: ['color','userInfo'],
	created () {
		console,log(this.color,this.userInfo)
	}	
}

注:也可以接收多个数据 {{ xxx }} {{ xxx }} {{ xxx }}

App.vue
<template>
  <div class="app">
    我是APP组件
    <button @click="change">修改数据</button>
    <SonA></SonA>
    <SonB></SonB>
  </div>
</template>
<script>
import SonA from './components/SonA.vue'
import SonB from './components/SonB.vue'
export default {
  provide() {
    return {
      // 简单类型 是非响应式的
      color: this.color,
      // 复杂类型 是响应式的
      userInfo: this.userInfo,
    }
  },
  data() {
    return {
      color: 'pink',
      userInfo: {
        name: 'zs',
        age: 18,
      },
    }
  },
  methods: {
    change() {
      this.color = 'red'
      this.userInfo.name = 'ls'
    },
  },
  components: {
    SonA,
    SonB,
  },
}
</script>
<style>
lue
</style>

~.vue
<template>
  <div class="grandSon">
    我是GrandSon
    {{ color }} -{{ userInfo.name }} -{{ userInfo.age }}
  </div>
</template>

<script>
export default {
  inject: ['color', 'userInfo'],
}
</script>

<style>
lue
</style>

8.v-model详解(帮助更好的理解v-model应用与组件进行组件通信)

v-model原理

原理:v-model本质上是一个语法糖。例如应用在输入框上,就是value属性input事件的合写
作用:提供数据的双向绑定
①数据变,视图跟着变:value
②视图变,数据跟着变@input
注意$event用于在模板中,获取事件的形参
<input v-model='msg' type='text'> =<input :value="msg" + @input="msg = $event.target.value" type=“text”>

<template>
  <div class="app">
    <input v-model="msg1" type="text" />
    <br />
    <input :value="msg2" @input="msg2 = $event.target.value" type="text" > <br><br>
  </div>
</template>

<script>
export default {
  data() {
    return {
      msg1: '',
      msg2:''
    }
  },
}
</script>

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

表单类组件封装 $ v-model 简化代码

1.表单类组件封装 → 实现 子组件 和 父组件数据的 双向绑定
①父传子:数据应该是父组件props传递过来的,v-model拆解 绑定数据
②子传父:监听输入,子传父值给父组件修改
在这里插入图片描述

App.vue
<template>
  <div class="app">
    <!-- 把城市Id传下去 -->
    <BaseSelect
    :cityId="selectId"
    @changeId="selectId= $event"
    >
    </BaseSelect>
  </div>
</template>

<script>
import BaseSelect from './components/BaseSelect.vue'
export default {
  data() {
    return {
      //数据应该由老爹提供
      selectId: '102',
    }
  },
  components: {
    BaseSelect,
  },
  methods: {
    handleChange(e) {
      console.log(e);
      this.selectId = e
    }
    
  }
}
</script>

<style>
</style>

~vue
<template>
  <div>
    <select :value="cityId" @change="handleChange">
      <!--里面不能写 v-model="cityId" 不能修改cityId,子组件是不让改的,所以这里要拆-->
      <option value="101">北京</option>
      <option value="102">上海</option>
      <option value="103">武汉</option>
      <option value="104">广州</option>
      <option value="105">深圳</option>
    </select>
  </div>
</template>

<script>
export default {
  // 在子组件中用props接收
  props:{
    cityId:String
  },
  // 写处理函数
  methods:{
    handleChange (e) {
      this.$emit('changeId',e.target.value)
    }
  }
}
</script>

<style>
</style>

2.父组件v-model 简化代码,实现 子组件 和 父组件数据 双向绑定
核心步骤
①子组件中:props通过value接收,事件触发 input
②父组件中:v-model给组件直接绑数据(:value+@input

通过value进行接收,然后设置给上面的select,通过value往下传递,监听下拉菜单的改变,然后触发事件提交数据时,触发事件提交数据的是`input``
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

App.vue
<template>
  <div class="app">
    <!-- v-model => :value + @input -->
    <BaseSelect
    v-model="selectId"
    >
    </BaseSelect>
  </div>
</template>

<script>
import BaseSelect from './components/BaseSelect.vue'
export default {
  data() {
    return {
      //数据应该由老爹提供
      selectId: '102',
    }
  },
  components: {
    BaseSelect,
  },
}
</script>

~.vue
<template>
  <div>
    <select :value="value" @change="handleChange">
      <!--里面不能写 v-model="cityId" 不能修改cityId,子组件是不让改的,所以这里要拆-->
      <option value="101">北京</option>
      <option value="102">上海</option>
      <option value="103">武汉</option>
      <option value="104">广州</option>
      <option value="105">深圳</option>
    </select>
  </div>
</template>

<script>
export default {
  // 在子组件中用props接收
  props:{
    value:String
  },
  // 写处理函数
  methods:{
    handleChange (e) {
      this.$emit('input',e.target.value)
    }
  }
}
</script>

9.sync修饰符

作用:可以实现 子组件 与 父组件数据 的双向绑定,简化代码
特点:prop属性名,可以自定义,非固定为value
场景:封装弹框类的基础组件,visible属性 true显示 false隐藏
在这里插入图片描述

//father
<BaseDialong :visible.sync = "isShow">
<BaseDialog
	:visible="isShow"
	@updata:visible="isShow = $event"
>

//son
<script>
props:{
	visible:Boolean
},
this.$emit('updata:visible',false)
</script>

10.ref 和$refs

作用:利用ref和¥refs可以用于获取dom元素,或组件实例
特点:查找范围 → 当前组件内(更精确稳定)
①获取dom:1.目标标签-添加ref属性
<div ref="chartRef">我是渲染图表的容器</div>
②恰当时机,通过this.$refs.xxx,获取目标标签
mounted () {
console.log(this.$refs.chartRef)
},

获取dom元素

App.vue
<template>
  <div class="app">
    <div class="base-chart-box">
      这是一个捣乱的盒子
    </div>
    <BaseChart></BaseChart>
  </div>
</template>

~vue
<template>
  <div ref="mychart" class="base-chart-box">子组件</div>
</template>

<script>
import * as echarts from 'echarts'

export default {
  mounted() {
    //const myChart = echarts.init{document.querySelect'base-chart-box'}//这个会找到父组件中的盒子
    //但我们想找当前组件范围内的盒子,用ref
    // 基于准备好的dom,初始化echarts实例
    const myChart = echarts.init(this.$ref.mychart)
    // 绘制图表
}
</script>

如上代码,就算有一个捣乱盒子,图表也不会放错地方
在这里插入图片描述

获取组件元素

在这里插入图片描述
1.目标组件 - 添加ref属性
<BaseFrom ref="baseForm"></BaseForm>
2.恰当时机,通过this.$refs.xxx,获取目标组件,就可以调用组件对象里面的方法
this.$refs.baseFrom.组件方法()

App.vue
<template>
  <div class="app">
    <BaseForm ref="baseFrom"></BaseForm>
    <button @click="handleGet">获取数据</button>
    <button @click="handleReset">重置数据</button>
  </div>
</template>

<script>
import BaseForm from './components/BaseForm.vue'
export default {
  data (){
    return {

    }
}, 
 components: {
    BaseForm,
  },
  methods: {
    handleGet () {
      console.log(this.$refs.baseForm.getValue())
    },
    handleReset () {
      this.$refs.baseForm.resetValues()
    }
  }
}
</script>


~。vue
<template>
  <div class="app">
    <div>
      账号: <input v-model="username" type="text">
    </div>
     <div>
      密码: <input v-model="password" type="text">
    </div>
    <div>
      <button @click="getFormData">获取数据</button>
      <button @click="resetFormData">重置数据</button>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      account: '',
      password: '',
    }
  },
  methods: {
    //方法1:收集表单数据,返回一个对象
    getValues() {
      retyrn () {
        account: this.account,
        password:this.password
      }
    },
    //方法2:重置表单
    resetValues() {
      this.account = ''
      this.password = ''
      console.log('重置表单数据成功');
    },
  }
}
</script>

11.Vue异步更新,$nextTick

需求:编辑标题,编辑框自动聚焦
1.点击编辑,显示编辑框
2.让编辑框,立刻获取焦点

this.isShowEdit = true //显示输入框
this.$refs.inp.focus() //获取焦点

问题:“显示之后”,立刻获取jiajiao点不能成功显示
原因:Vue是 异步更新DOM(提升性能)

想要在DOM更新wan’chwanche那个之后做某件事,可以使用$nextTick
在这里插入图片描述

<template>
  <div class="app">
    <div v-if="isShowEdit">
      <input v-model="editValue" type="text"  ref="inp" />
      <button>确认</button>
    </div>
    <div v-else>
      <span>{{ title }}</span>
      <button @click="handleEdit">编辑</button>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      title: '大标题',
      isShowEdit: false,
      editValue: '',
    }
  },
  methods: {
   handleEdit(){
    //显示输入框(异步dom更新)
    this.isShowEdit = true
    //让输入框获取焦点
    this.$nextTick(()=>{
      console.log(this.$refs.inp)
      this.$refs.inp.focus()
    })
    // setTimeout(() => {
    //   this.$refs.inp.focus()
    // },1000)
    
  }
}
}
</script>

<style>
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计 | SSM 凌云招聘平台(附源码)

1&#xff0c;绪论 人力资源是企业产生效益、创造利润的必不可少的、最重要的资源。人作为人力资源的个体可看作是一个承载着有效知识、能力的信息单元。这样的信息单元可看作是一个为企业产生价值和利润的个体。从而使得这样的信息单元所具有的信息就是一个有价值的信息。 校…

什么是SQL,什么是MYSQL?MYSQL的架构以及SQL执行语句的过程是什么?有哪些数据库的类型?一篇文章带你弄懂!

文章目录 前言一、为什么需要数据库二、数据库的相关概念1.什么是结构化查询语言 (SQL)2.什么是数据库管理系统 (DBMS)3.什么是 MySQL 数据库 三、数据库分类1.关系型数据库&#xff08;SQL&#xff09;2.非关系型数据库&#xff08;NoSQL&#xff09; 四、MYSQL架构1.各组件功…

初识MQRabbitMQ快速入门

一、同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但是你却不能…

「JavaSE」类和对象4

类和对象4 &#x1f349;内部类&#x1f34c;实例内部类&#x1f34c;静态内部类&#x1f34c;局部内部类&#x1f34c;匿名内部类 &#x1f349;总结 &#x1f349;内部类 在 Java 中&#xff0c;我们可以将一个类定义在另一个类或者一个方法的内部&#xff0c;前者称为内部类…

IS-IS:04 DIS

IS-IS 协议只支持两种网络类型&#xff0c;即广播网络和点到点网络。与 OSPF 协议相同&#xff0c; IS-IS 协议在广播网络中会将网络视为一个伪节点 &#xff08; Pesudonde&#xff0c;简称 PSN&#xff09;&#xff0c;并选举出一台DIS &#xff08;Designated IS&#xff09…

探索Pyecharts之美-绘制多彩旭日图的艺术与技巧【第37篇—python:旭日图】

文章目录 引言准备工作绘制基本旭日图调整颜色和样式添加交互功能定制标签和标签格式嵌套层级数据高级样式与自定义进阶主题&#xff1a;动态旭日图数据源扩展&#xff1a;外部JSON文件总结 引言 数据可视化在现代编程中扮演着重要的角色&#xff0c;而Pyecharts是Python中一个…

Tomcat怎么优化

目录 性能方面的优化&#xff1a; 安全方面的优化&#xff1a; 引言&#xff1a;面试官问到的Tomcat怎么优化&#xff0c;这两个方面直接得到他认可&#xff01;&#xff01; 性能方面的优化&#xff1a; 内存优化&#xff1a;-Xms java虚拟机初始化时的最小内存、-Xmx java虚…

操作系统的引入

操作系统 【1】什么是操作系统 操作系统是一种管理的计算机硬件的软件资源的程序。它充当了计算机系统和应用程序之间的接口。使得计算机用户能够地使用计算机系统来完成各种任务。操作系统是负责管理和分配计算机的处理器、内存、硬盘等等硬件资源&#xff0c;同时也提供一些…

Vue3在css中使用v-bind绑定js/ts变量,也可以在scss和less中使用方式

主要介绍Vue3中的新增的v-bind()的常用使用方式&#xff0c;主要包括在css,less,scss中的使用&#xff0c;可以参考官方文档查看&#xff1a;Vue3官方文档 特别提醒 如果你想在scss中或者less中使用&#xff0c;可能会报各种乱七八糟的错误&#xff0c;最快最好用的方式就是单…

Android P 背光机制流程分析

在android 9.0中&#xff0c;相比android 8.1而言&#xff0c;背光部分逻辑有较大的调整&#xff0c;这里就对android P背光机制进行完整的分析。 1.手动调节亮度 1.1.在SystemUI、Settings中手动调节 在界面(SystemUI)和Settings中拖动进度条调节亮度时&#xff0c;调节入口…

[docker] Docker的私有仓库部署——Harbor

一、Docker原生私有仓库—— Registry 1.1 Registry的简单了解 关于Docker的仓库分为私有库和公有仓库&#xff0c;共有仓库只要在官方注册用户&#xff0c;登录即可使用。但对于仓库的使用&#xff0c;企业还是会有自己的专属镜像&#xff0c;所以私有库的搭建也是很有必要的…

那些年与指针的爱恨情仇(一)---- 指针本质及其相关性质用法

关注小庄 顿顿解馋 (≧∇≦) 引言&#xff1a; 小伙伴们在学习c语言过程中是否因为指针而困扰&#xff0c;指针简直就像是小说女主&#xff0c;它逃咱追&#xff0c;我们插翅难飞…本篇文章让博主为你打理打理指针这个傲娇鬼吧~ 本节我们将认识到指针本质&#xff0c;何为指针和…

将Html页面转换为Wordpress页面

问题&#xff1a;我们经常会从html源码下载网站上获得我们想要的网站内容框架&#xff0c;以及部分诸如联系我们&#xff0c;About 等内页&#xff0c;但是在文章的发布上&#xff0c;则远不如Wordpress简便。而Wordpress尽管有各种模板&#xff0c;但修改又比较麻烦。解决方法…

day34WEB 攻防-通用漏洞文件上传黑白盒审计逻辑中间件外部引用

目录 一&#xff0c;白盒审计-Finecms-代码常规-处理逻辑 黑盒思路&#xff1a;寻找上传点抓包修改突破获取状态码及地址 审计流程&#xff1a;功能点-代码文件-代码块-抓包调试-验证测试 二&#xff0c;白盒审计-CuppaCms-中间件-.htaccess 三&#xff0c;白盒审计-Metin…

CVE-2024-23897 Jenkins 任意文件读取漏洞

项目介绍 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。Jenkins是开源CI&CD软件领导者&#xff0c; 提供超过1000个插…

guhub访问

问题 访问不了guhub 解决过程 可以正常访问了 总结 此方法参考微软官方的方法&#xff0c;修改dns服务器网址&#xff0c;由原本的自动分配改为指定微软dns服务器网址

深度强化学习(王树森)笔记02

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

苹果手机突然无服务了,这是怎么回事?

苹果手机无疑是一款备受青睐的智能设备&#xff0c;但有时候我们可能会面临一个令人困扰的情况——苹果手机突然无服务。这种情况可能会在任何时候发生&#xff0c;无论是在使用手机时&#xff0c;刚刚升级系统&#xff0c;或者是突然发现在本应有信号的区域却无法连接到运营商…

Linux——常用命令

1、命令的基本格式 对服务器来讲&#xff0c;图形界面会占用更多的系统资源&#xff0c;而且会安装更多的服务、开放更多的端口&#xff0c;这对服务器的稳定性和安全性都有负面影响。其实&#xff0c;服务器是一个连显示器都没有的家伙&#xff0c;要图形界面干什么&#xff…

Nodejs基础4之fs模块的批量重命名练习、path模块、HTTP协议

Nodejs基础 fs模块fs练习-批量重命名fs练习-批量排序重命名 path模块resolve 解决sep 分隔符parse 方法其他的几个方法 HTTP协议http报文安装fiddler软件配置fiddler使用fiddler 请求报文结构整体请求行请求方法URLHTTP版本号 请求头请求体 响应报文结构整体响应行响应状态码响…