vue3语法

news2024/11/26 8:41:41

vue3教程

//ps 这里是基本写法 一般项目不需要ref 因为需要一直return
这里是根据在不使用ts后缀 来在.vue里面写setup
如下图所示:

在这里插入图片描述

setup

setup是启动页面会自动执行的一个函数
项目里定义的所有变量,都要在setup当中
在setup定义的变量和方法,都需要return出去,否则不能在视图当中使用
!<template>
  <div>
    <div>{{ res}}</div>
    <div @click="btn">点击</div>
  </div>
</template>

<script>
export default {
setup(){
    const res='123'
    /* 点击 */ 
   // function btn(){//第一种用法
   // console.log('点击显示');
    //}
     const btn=()=>{//第二种用法(推荐)
     console.log('点击显示');
     }
    console.log(res);
    return{res,btn}
}
}
</script>

<style>

</style>
页面显示123
打印出来是 '点击显示' 123

ref

  • 组合式api 推荐:
    ref用来操作基本数据类型 数字 字符串
当ref值发生变化,视图值会自动更新
ref可操作基本数据类型,也可操作复杂数据 (对象 数组)
推荐:
ref用来操作基本数据类型 数字 字符串
为什么使用ref呢?
使用ref包裹数据,在数据修改会成为响应式状态。
ref发生变化时,视图会自动更新
!<template>
  <div>
    <div>{{ res}}</div>
    <div>{{obj.name}}</div>
    <div v-for="(item,index) in arr" :key="index">{{item.name}}</div>
    <div @click="btn">点击</div>
  </div>
</template>
<script>
import {ref} from 'vue'//组合式api
export default {
setup(){
const res=ref(123)
const obj=ref({name:'12121',age:'18'})
const arr=ref([{name:'yang'}])
const btn=()=>{
 res.value=343434;
 obj.value.name='000000';
 arr.value[0].name='999999';
}
return{res,btn,obj,arr}
}
}
</script>

<style>

</style>
点击前页面显示
123
12121
yang

点击后页面显示
343434
000000
999999

PS推荐:
ref用来操作基本数据类型 数字 字符串

reactive

  • 定义普通数据类型不能用reactive 用ref
  • reactive定义复杂的数据类型 比如数组 对象
reactive同样为我们的值创建了一个响应式应用

> 定义普通数据类型不能用reactive 用ref

> reactive定义复杂的数据类型 比如数组 对象

> reactive 可响应深层次的数据 比如多维数组

> 返回应该响应式prory对象
> 
> 使用需要引入
!<template>
  <div>
    <div>{{ obj.name}}</div>
    <div>{{ obj.age}}</div>
    <div>{{obj.arr[0].name}}</div>
    <div></div>
    <div @click="btn">点击</div>
  </div>
</template>
<script>
import {reactive} from 'vue'//组合式api
// reactive用来处理数组 对象 复杂数据类型
// 不能直接处理基本的数据 num string

export default {
setup(){
const name='张三'
const obj=reactive({name,
    age:18,
    sex:'男',
    arr:[
        {name:'王五'}
    ]
})
const btn=()=>{
    // reactive改变值不需要加value
    obj.name='李四'
    obj.name=16
    obj.arr[0].name='杨'
}
return{btn,obj}
}
}
</script>

<style>

</style>
点击前页面显示
张三
18
王五

点击后页面显示
16
18PS 

> 定义普通数据类型不能用reactive 用ref

> reactive定义复杂的数据类型 比如数组 对象

toRef

使用toRef是让js进行变化 页面视图不发生变化时进行使用

toRef也可以创建一个响应式数据

ref本质是拷贝粘贴一份数据 脱离了原数据的交互

ref函数将对象中的属性变成响应式数据 修改了响应式数据 
但不会影响原数据 但是会更新视图层

toRef函数本质是引用 修改了响应式数据 
会影响原数据 但是不会更新视图层

需要时引入

* 使用toRef是让js进行变化 页面视图不发生变化时进行使用
!<template>
  <div>
    <div>{{res}}</div>
    <div>{{obj.name}}</div>
    <div></div>
    <div @click="btn">点击</div>
  </div>
</template>
<script>
import {ref,toRef} from 'vue'
export default {
setup(){
const name='张三'
const res=ref(name)//num string 是ref包裹的

const obj={name:'马云',age:'50'}
const res1=toRef(obj,name)//这样是操作name值(toRef)
const btn=()=>{
    console.log(res);
    res.value='李四'//使用ref改变值要加value
    res1.value='张三1111'
    console.log(res1);
}
return{btn,obj,res,res1}
}
}
</script>

<style>

</style>
使用ref包裹的基本数据(num string)值修改视图变化了
但是js打印还是原数据

使用toRef包裹的数据值修改时在js里面打印的发生了变化
但是视图没有变化

综上所述:
ref函数将对象中的属性变成响应式数据 修改了响应式数据 
但不会影响原数据 但是会更新视图层

toRef函数本质是引用 修改了响应式数据 
会影响原数据 但是不会更新视图层

toRefs

toRefs可以与其他响应式交互 更方便处理视图数据
主要作用是如下所示:
用于批量设置多个数据为响应式数据
toRefs可以与其他响应式交互 更方便处理视图数据
需要时引入
!<template>
  <div>
    <div>
        <ul>
            <li>{{name }}</li>
            <li>{{age }}</li>
            <li>{{ a }}</li>
        </ul>
    </div>
    <div @click="btn">点击</div>
  </div>
</template>
<script>
import { reactive,toRefs} from 'vue'
export default {
setup(){
const news=reactive({name:'张三',age:50,a:1})
const btn=()=>{
}
return{btn,...toRefs(news)}
}
}
</script>

<style>

</style>
主要作用是这个🤔
如上所示:
一般我们定义需要写{{news.name}} {{news.age}}才会在视图显示
但是:
使用toRefs后我们...toRefs(XXX)
直接写{{name}} {{age}}即可

computed

计算属性

2一样 均用来监听数据的变化
使用时需引入:
监听数据变化如下所示:
累加效果
!<template>
  <div>
    <div>
        a1<input type="number" v-model="a1"/>
        b1<input type="number" v-model="b1"/>
        总和<input type="number" v-model="sum" /></div>
    <div @click="btn">点击</div>
  </div>
</template>
<script>
import { reactive, computed, toRefs } from "vue";
export default {
  setup() {
    const a1 = ''
    const b1 = ''
    const news = reactive({ a1, b1 })
    // 计算属性使用(数字)
    const sum=computed(()=>{
        return news.a1 + news.b1
    })
    // 
    const btn = () => {};
    return { btn, ...toRefs(news),sum };
  },
};
</script>

<style>
</style>

请添加图片描述

watch

2一样 用来侦听数据变化
使用时引入

单个数据监听变化

//监听单个数据变化
!<template>
  <div>
    <div>
    {{num}}
    </div>
    <div @click="num++">点击</div>
  </div>
</template>
<script>
import {ref, reactive, watch, toRefs } from "vue";
export default {
  setup() {
    const num = ref(0)
    // 监听(watch)变化
    // 监听点击数据发生变化
   watch(num,(newVa,oldVa)=>{
    console.log(newVa,oldVa);
   })
    return { num};
  },
};
</script>

<style>
</style>
PS 重点:
  watch('',(newVa,oldVa)=>{
    console.log(newVa,oldVa);
   },{immediate:true})
  },
{immediate:true}进入页面立即开启监听 默认为false

在这里插入图片描述

多个数据监听变化

!<template>
  <div>
    <div>
    {{num}}----{{num1 }}
    </div>
    <div @click="num++">点击</div>
  </div>
</template>
<script>
import {ref, reactive, watch, toRefs } from "vue";
export default {
  setup() {
    const num = ref(0)
    const num1=ref(1)
    // 监听(watch)变化
    // 监听多个直接放在数组里面来监听
   watch([num,num1],(newVa,oldVa)=>{
    console.log(newVa,oldVa);
   })
    return {num,num1};
  },
};
</script>

<style>
</style>
PS 重点:
  watch('',(newVa,oldVa)=>{
    console.log(newVa,oldVa);
   },{immediate:true})
  },
{immediate:true}进入页面立即开启监听 默认为false

在这里插入图片描述

监听整个reactive响应式数据变化

  • reactive(数组,对象,多维数组)定义

上一个数据是监听不到的 只能得到最新数据

!<template>
  <div>
    <div>
    {{num}}----{{num1.age.num}}
    </div>
    <div @click="num++">点击</div>
    <div @click="num1.age.num++">点击1</div>
  </div>
</template>
<script>
import {ref, reactive, watch, toRefs } from "vue";
export default {
  setup() {
    const num = ref(0)
    const num1=reactive({name:'张三',age:{
        num:1
    }})
    // 监听整个reactive(数组,对象,多维数组)的数据变化
    // 只能监听最新结果 上一个数据是监听不到的
   watch(num1,(newVa,oldVa)=>{
    console.log(newVa,oldVa);//newVa变化 oldVa不变化
   })
    return {num,num1};
  },
};
</script>

<style>
</style>
PS 重点:
  watch('',(newVa,oldVa)=>{
    console.log(newVa,oldVa);
   },{immediate:true})
  },
{immediate:true}进入页面立即开启监听 默认为false

监听某一个reactive的数据变化

  • reactive(数组,对象,多维数组)定义
  • 监听某一个要用方法来写 如下所示:
    在这里插入图片描述

上一次与下一次结果都可以得到

!<template>
  <div>
    <div>
    {{num}}----{{num1.age.num}}
    </div>
    <div @click="num++">点击</div>
    <div @click="num1.age.num++">点击1</div>
  </div>
</template>
<script>
import {ref, reactive, watch, toRefs } from "vue";
export default {
  setup() {
    const num = ref(0)
    const num1=reactive({name:'张三',age:{
        num:1
    }})
    // 监听某一个reactive(数组,对象,多维数组)的数据变化
    // 监听某一个要用方法这种来写
   watch(()=>num1.age.num,(newVa,oldVa)=>{
    console.log(newVa,oldVa);
   },{immediate:true})//进入页面立即开启监听 默认为false
    return {num,num1};
  },
};
</script>

<style>
</style>
PS 重点:
  watch('',(newVa,oldVa)=>{
    console.log(newVa,oldVa);
   },{immediate:true})
  },
{immediate:true}进入页面立即开启监听 默认为false

watchEffect

watchEffect 侦听器

  • 初始化就执行(相当于生命周期created)
watchEffect如果存在的话 在组件初始化当中就会执行一次并收集依赖

watch可以获取到新值与旧值 而watchEffect是拿不到的

watchEffect不需要指定监听的属性 会自动收集 只要我们在回调中引入了响应式属性
当这些属性变更时 这个回调都会执行 而watch只能监听指定属性而做出变更


使用时引入:
!<template>
  <div>
    <div>
    {{num}}----{{num1.age.num}}
    </div>
    <div @click="num++">点击</div>
    <div @click="num1.age.num++">点击1</div>
  </div>
</template>
<script>
import {ref, reactive, watchEffect, toRefs } from "vue";
export default {
  setup() {
    const num = ref(0)
    const num1=reactive({name:'张三',age:{
        num:1
    }})
   const res=watchEffect(()=>{
   console.log(111,'初始化执行');
   const a=num.value
   const b=num1.age.num
   console.log(a,'33333');
   console.log(b,'bbbbbbbb');
   })
   res()//停止监听(输入这个就点击停止监听)
    return {num,num1,res};
  },
};
</script>

<style>
</style>
页面在初始化开始执行以下操作
控制台输出:

111 '初始化执行'
login.vue?4e59:15 0 '33333'
login.vue?4e59:16 1 'bbbbbbbb'

在这里插入图片描述

shallowReative/shallowRef

遇到处理只有点击才会是处理
看点击的变化

了解即可

shallowRef 只处理基本类型数据
shallowReative只处理第一层数据
使用时引入:

shallowReative

点击自增name会变化
num不会变化
因为name是第一层数据( shallowReative只处理第一层数据)
!<template>
  <div>
    <div>{{name}}</div>
    <div>{{age.num}}</div>
    <div @click="age.num++">点击</div>
  </div>
</template>
<script>
import {shallowReactive,shallowRef, toRefs } from "vue";
export default {
  setup() {
    const num=shallowReactive({name:'张三',age:{
        num:1
    }})
    return {...toRefs(num)};
  },
};
</script>

<style>
</style>
这里点击自增不会变化

shallowRef

!<template>
  <div>
    <div>{{num}}</div>
    <div @click="num++">点击</div>
  </div>
</template>
<script>
import {shallowReactive,shallowRef, toRefs } from "vue";
export default {
  setup() {
    // shallowRef处理基本数据(num string)
    const num=shallowRef(1)
    return {num};
  },
};
</script>

<style>
</style>
只处理基本数据(num string)
除了这二种数据类型其
他不能处理
这个仅仅只能处理

shallowRef与ref区别是:

shallowRef仅仅只能处理基本数据(num string)

ref建议处理基本数据(num string )

组件传值(通信)

组件通信

vuex()

packpage.json里面看是否安装
如下所示:

在这里插入图片描述

存储(传值)
ts有Pinia js有vuex
第一步安装
 
> cnpm i vuex@next --save

需要时需引入

> import {useStore} from "vuex";

在这里插入代码片
在这里插入代码片
在这里插入代码片

生命周期

Vue3的setup语法糖直接代替beforeCreate,Created;
Destroy更名为Unmount;其他就是直接加on

 beforeCreate -> 使用 setup()   
 
 created -> 使用 setup()
 
 beforeMount -> onBeforeMount   dom元素在内存中,还未渲染到页面(不可操作dom)
 
 mounted -> onMounted   dom已经渲染到页面,能操作dom了
 
 beforeUpdate -> onBeforeUpdate   数据更改后,页面还未渲染
 
 updated -> onUpdated    数据更改后,页面渲染完成
 
 beforeDestroy -> onBeforeUnmount  组件销毁之前
 
 destroyed -> onUnmounted    组件销毁之后
 
 errorCaptured -> onErrorCaptured (当事件处理程序或生命周期钩子抛出错误时调用)

import {ref,onBeforeMount,onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount,onUnmounted,onErrorCaptured,onRenderTracked,onRenderTriggered} from "vue"
onBeforeMount(()=>{
  console.log('内存中有dom,还未渲染,还不能操作dom')
})
onMounted(()=>{
  console.log('dom结构已渲染到页面,可以操作dom啦')
})
onBeforeUpdate(()=>{
  console.log('数据变化后,页面还未渲染')
})
onUpdated(()=>{
  console.log('数据变化后,页面已经渲染')
})
onBeforeUnmount(()=>{  //组件的v-if可控制组件卸载
  console.log('组件卸载前')
})
onUnmounted(()=>{
  console.log('组件卸载后')
})

新增的钩子函数:

onRenderTracked onRenderTriggered
onRenderTracked直译过来就是状态跟踪,它会跟踪页面上所有响应式变量和方法的状态,也就是我们用return返回去的值,它都会跟踪。只要页面有update的情况,它就会跟踪,然后生成一个event对象,我们通过event对象来查找程序的问题所在。
onRenderTriggered直译过来是状态触发,它不会跟踪每一个值,而是给你变化值的信息

onRenderTracked((e)=>{
  console.log('跟踪',e)
})
//调试钩子函数:onRenderTracked,onRenderTriggered
onRenderTriggered((e)=>{
  console.log('定位变化的',e)//参数能取到变化的属性信息
})

在这里插入图片描述

抽离封装

简称封装罢了。。。。

a页面与b页面的内容包含同样的数据
我们需要把这个相同数据单独放在一个文件里面后缀.js文件

然后分别把这个文件在a页面 b页面进行引入使用即可

3中任何一个组合式api都可以尝试抽离出去在另一个文件
最后只需要回归到setup中即可

抽离前

a页面与b页面的内容是一致的。

a页面

!<template>
    <div class="main">
      <div>{{ name}}</div>
      <div>{{ age}}</div>
      <div>{{arr[0].name}}</div>
      <div></div>
      <div @click="btn">点击</div>
    </div>
  </template>
  <script>
  import {reactive,toRefs} from 'vue'
  export default {
  setup(){
  const name='张三'
  const obj=reactive({name,
      age:18,
      sex:'男',
      arr:[
          {name:'王五'}
      ]
  })
  const btn=()=>{
  }
  return{btn,...toRefs(obj)}
  }
  }
  </script>
  
 <style scoped>
 .main{
 background: rosybrown;
 }
 </style>

b页面

!<template>
    <div class="main">
      <div>{{ name}}</div>
      <div>{{ age}}</div>
      <div>{{arr[0].name}}</div>
      <div></div>
      <div @click="btn">点击</div>
    </div>
  </template>
  <script>
  import {reactive,toRefs} from 'vue'
  export default {
  setup(){
  const name='张三'
  const obj=reactive({name,
      age:18,
      sex:'男',
      arr:[
          {name:'王五'}
      ]
  })
  const btn=()=>{
  }
  return{btn,...toRefs(obj)}
  }
  }
  </script>
  
 <style scoped>
 .main{
 background: rosybrown;
 }
 </style>

抽离后

a页面与b页面的内容是一致的

把一致的内容单独放在public.js文件当中

然后再把这个文件分别引入到a页面与b页面

在这里插入图片描述

公共文件 public.js

import {reactive,toRefs} from 'vue'
const pblic=()=>{
    const name='张三'
    const obj=reactive({name,
        age:18,
        sex:'男',
        arr:[
            {name:'王五'}
        ]
    })
    return obj //返回值
}
export default pblic

a页面

!<template>
    <div class="main">
      <div>{{ name}}</div>
      <div>{{ age}}</div>
      <div>{{arr[0].name}}</div>
      <div></div>
      <div @click="btn">点击</div>
    </div>
  </template>
  <script>
  import {reactive,toRefs} from 'vue'
import pblic from '../config/public'
  export default {
  setup(){
  const obj=pblic()
  const btn=()=>{
    obj.name='2323232'
  }
  return{btn,...toRefs(obj)}
  }
  }
  </script>
  
 <style scoped>
 .main{
 background: rosybrown;
 }
 </style>

b页面

!<template>
    <div class="main">
      <div>{{ name}}</div>
      <div>{{ age}}</div>
      <div>{{arr[0].name}}</div>
      <div></div>
      <div @click="btn">点击</div>
    </div>
  </template>
  <script>
  import {reactive,toRefs} from 'vue'
import pblic from '../config/public'
  export default {
  setup(){
  const obj=pblic()
  const btn=()=>{
    obj.name='2323232'
  }
  return{btn,...toRefs(obj)}
  }
  }
  </script>
  
 <style scoped>
 .main{
 background: rosybrown;
 }
 </style>

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

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

相关文章

chatGTP的全称Chat Generative Pre-trained Transformer

chatGPT&#xff0c;有时候我会拼写为&#xff1a;chatGTP&#xff0c;所以知道这个GTP的全称是很有用的。 ChatGPT全名&#xff1a;Chat Generative Pre-trained Transformer &#xff0c;中文翻译是&#xff1a;聊天生成预训练变压器&#xff0c;所以是GPT&#xff0c;G是生…

DIDL3_模型选择、复杂度、过欠拟合的相关概念

模型选择、复杂度、过欠拟合的概念模型选择训练误差和泛化误差验证数据集和测试数据集K-则交叉验证&#xff08;没有足够多数据时使用&#xff09;过拟合和欠拟合模型容量模型容量的影响估计模型容量控制模型容量数据复杂度处理过拟合的方法&#xff08;1&#xff09;&#xff…

关于最近大热的AI,你怎么看?

AI人工智能&#xff0c;相信大家都不陌生&#xff0c;也都接触过不少。但是最近小编在网上冲浪的时候发现各大媒体又掀起了一阵AI热潮&#xff0c;AI不是很常见了吗&#xff1f;是又有什么新的发展吗&#xff1f; 带着强烈的好奇心&#xff0c;我在地铁上读完了一篇关于Chatgp…

【分享】如何通过集简云将ChatGPT人工智能接入到您的内容平台中?

ChatGPT是一款非常强大的人工智能产品&#xff0c;可以有创造性的回复和创作文字&#xff0c;图片&#xff0c;适用于很多办公场景。这篇文章将介绍如何将ChatGPT接入到您的办公系统中。 目前集简云提供了两个ChatGPT应用: OpenAI(ChatGPT&#xff09;内置&#xff1a;这个是集…

IB化学考什么?这些知识点请收藏

春天来了&#xff0c;IB大考还会远吗&#xff1f;不少学生为IB大考紧张不已。为大家介绍一下IB化学的相关内容。01考试时间和考试形式 2023年IB考试将于2023年4月27日开始&#xff0c;2023年5月19日结束。化学部分的考试分别是在5月11日、12日进行。 IB化学考试包括&#xff1a…

LeetCode刷题--- 61. 旋转链表(快慢指针+闭合为环)

&#x1f48c; 所属专栏&#xff1a;【LeetCode题解&#xff08;持续更新中&#xff09;】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的码仔&#xff0c;专注基础和实战分享 &#xff0c;欢迎…

cors跨域问题

CORS CORS&#xff0c;全称Cross-Origin Resource Sharing,是一种允许当前域&#xff08;domain&#xff09;的资源&#xff08;比如html/js/web service&#xff09;被其他域&#xff08;domain&#xff09;的脚本请求访问的机制&#xff0c;通常由于同域安全策略&#xff08;…

如何设计一个秒杀系统

秒杀系统要如何设计&#xff1f; 前言 高并发下如何设计秒杀系统&#xff1f;这是一个高频面试题。这个问题看似简单&#xff0c;但是里面的水很深&#xff0c;它考查的是高并发场景下&#xff0c;从前端到后端多方面的知识。 秒杀一般出现在商城的促销活动中&#xff0c;指定…

Cosmos 基础 -- Ignite CLI(二)Module basics: Blog

一、快速入门 Ignite CLI version: v0.26.1 在本教程中&#xff0c;我们将使用一个模块创建一个区块链&#xff0c;该模块允许我们从区块链中写入和读取数据。这个模块将实现创建和阅读博客文章的功能&#xff0c;类似于博客应用程序。最终用户将能够提交新的博客文章&#x…

计算机网络学习笔记(一)

网络是由若干接点和连接这些结点的链路组成。 多个网络通过路由器互联起来构成覆盖范围更大的互联网。 普通用户通过ISP接入因特网。 基于ISP的三层结构因特网 相隔较远的两台主机间通信可能需要经过多个ISP。 有电路交换&#xff0c;报文交换&#xff0c;分组交换三种交换方…

【并发编程】LockSupport源码详解

目录 一、前言 1.1 简介 1.2 为什么说LockSupport是Java并发的基石&#xff1f; 二、LockSupport的用途 2.1 LockSupport的主要方法 2.2 使用案例 2.3 总结 三、LockSupport 源码分析 3.1 学习原理前的前置知识 3.1.1 Unsafe.park()和Unsafe.unpark() 3.1.2wait和notify/notify…

MyEclipse技术全面解析——EJB开发工具介绍(一)

MyEclipse v2022.1.0正式版下载1. MyEclipse EJB开发工具Enterprise Java Beans (EJB) 已经成为实现Java企业业务功能和与数据库资源接口的Java EE 5标准&#xff0c;MyEclipse EJB3工具支持Java EE 5简化的基于注释的POJO编程模型&#xff0c;这些工具使开发人员能够在几分钟内…

微信怎么群发消息给所有人?图文教学,快速弄懂

​微信作为很多小伙伴经常使用的工具&#xff0c;无论是学习、工作还是其他方面都会使用到。有些时候&#xff0c;需要将同一条消息发给通讯录里的大多数人&#xff0c;一条一条的转发太慢了&#xff0c;群发消息给所有人是个不错的办法。微信怎么群发消息给所有人&#xff1f;…

广东省基层就业补贴

基层就业补贴链接&#xff1a;https://www.gdzwfw.gov.cn/portal/v2/guide/11440309MB2D27065K4440511108001 一.申请条件&#xff1a; 1、劳动者到中小微企业、个体工商户、社会组织等就业&#xff0c;或到乡镇&#xff08;街道&#xff09;、村居社会管理和公共服务岗位就业…

spring cloud篇——什么是服务熔断?服务降级?服务限流?spring cloud有什么优势?

文章目录一、spring cloud 有什么优势二、服务熔断2.1、雪崩效应2.2、DubboHystrixCommand三、服务降级四、服务限流4.1、限流算法4.2、应用级限流4.3、池化技术4.4、分布式限流4.5、基于Redis 功能的实现限流4.6、基于令牌桶算法的实现4.6.1 、Java实现一、spring cloud 有什么…

GUI swing和awt

GUI&#xff08;Graphical User Interface&#xff0c;简称 GUI&#xff0c;图形用户界面&#xff09;是指采用图形方式显示的计算机操作用户界面&#xff0c;与早期计算机使用的命令行界面相比&#xff0c;图形界面对于用户来说在视觉上更易于接受。Java GUI主要有两个核心库&…

【计算机网络】传输层TCP协议

文章目录认识TCP协议TCP协议的格式字段的含义序号与确认号六个标志位窗口大小确认应答(ACK)机制超时重传机制连接管理机制三次握手四次挥手滑动窗口流量控制拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况总结认识TCP协议 传输控制协议 &#xff08;TCP&#xff0c;T…

多边形网格算法笔记

本文是处理多边形和网格的各种笔记和算法。 推荐&#xff1a;使用 NSDT场景设计器 快速搭建 3D场景。 1、表面简化 下面描述了一种方法&#xff0c;用于减少构成表面表示的多边形数量&#xff0c;同时仍试图保留表面的基本形式。 如果正在为渲染和/或交互环境寻求性能改进&…

【CS224图机器学习】task1 图机器学习导论

前言&#xff1a;本期学习是由datawhale&#xff08;公众号&#xff09;组织&#xff0c;由子豪兄讲解的202302期CS224图机器学习的学习笔记。本次学习主要针对图机器学习导论做学习总结。1.什么是图机器学习&#xff1f;通过图这种数据结构&#xff0c;对跨模态数据进行整理。…

增减序列(差分)

分析&#xff1a;要想把整个数组变为同一个数&#xff0c;我们可以根据差分的思想来做。 差分定义&#xff1a;b[1]a[1] b[2]a[2]-a[1] ...... b[i]a[i]-a[i-1] 由定义可知&#xff0c;可以把b[2]~b[n]全部变为0&#xff0c;那么整个数组就一样了。现在问题转换为如何用最少的…