前端框架---Vue2学习教程(上)

从HTML到现在一路跟过来的小伙伴们,坚持固然不容易,但我相信大家已经学到了不少,那么我们开始马不停蹄的进入前端的框架吧,下面讲的是Vue2,大家继续加油鸭!!!!

Vue2

Vue2官方文档地址,喜欢阅读文档的小伙伴可以点击进入官网。

1、Vue2 简介

Vue是什么?
官网的Vue的解释如下:
Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

Vue的两个特性:

1、数据驱动视图

  • 数据的变化会驱动视图自动更新
  • 好处:程序员只管把数据维护好,那么页面结构会被vue自动渲染出来

2、双向数据绑定

在网页中,form表单负责采集数据,Ajax负责提交数据

  • js数据变化,会被自动渲染到页面上
  • 页面上表单采集的数据发生变化,会被vue自动获取到,并更新到js数据中

注意:数据驱动视图和双向数据绑定的底层原理是MVVM(Model数据源、View视图、ViewModel就是vue的实例)

学了JS的小伙伴应该都知道,有很多操作都是基于DOM元素进行的,需要获取DOM元素,Vue则不需要获取DOM元素就可以对DOM元素进行操作,下面我们就进入Vue的正式学习吧!

1.1、Vue Devtools

在使用 Vue 时,推荐在你的浏览器上安装 Vue Devtools。它允许你在一个更友好的界面中审查和调试 Vue 应用。
在这里插入图片描述

1.2、安装引入Vue2

命令行运行
npm install vue@^2

或者引入Vue2

<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>

2、插值表达式

插值表达式 {{ }} 是一种Vue的模版语法

作用:利用表达式进行插值,渲染到页面中

​ 语法:{{表达式}}

​ 注意点:(1) 使用的数据必须存在

​ (2)支持的是表达式,而非语句

​ (3)不能在标签属性中使用{{}}插值

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><!--构建用户界面 基于数据渲染页面--><!-- 2 准备dom --><div id="app">{{ info}}-{{arr}}</div></body><!-- 1 引入Vue --><script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script><script>// 3 创建vue实例new Vue({// 元素el: '#app',// 数据data: {info: 'hello vue',arr: [1, 2, 3],},})</script>
</html>

data中的数据最终会被添加到实例上

① 访问数据:“实例.属性名”

② 修改数据:“实例.属性名” = “值”

3、Vue指令

Vue 会根据不同的指令,针对标签实现不同的功能
指令:带有 v-前缀 的特殊标签属性, 不同的指令,完成不同的功能

3.1、v-if、v-else、v-else-if

v-if 作用:控制元素显示隐藏(条件渲染)

语法:v-if = “表达式” 表达式值true显示,false隐藏

v-else、v-else-if 作用:辅助v-if进行判断渲染

语法:v-else v-else-if = “表达式”

注意:需要紧挨着 v-if 一起使用

原理:基于条件判断,是否创建移除元素节点

场景:要么显示,要么隐藏,不频繁切换的场景

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><div id="app"><p v-if="score > 90">A</p><p v-else-if="score >=80">B</p><p v-else="score >60">C</p></div></body><script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script><script>new Vue({el: '#app',data: {},})</script>
</html>

浏览器页面只显示了一个A
在这里插入图片描述控制台查看元素,只创建了一个满足条件的p元素
在这里插入图片描述

3.2 v-show

作用:控制元素显示隐藏

语法:v-show = “表达式” 表达式值true显示,false隐藏

原理:切换 display:none / block控制显示隐藏

场景:频繁切换显示隐藏的场景

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><div id="app"><div v-show="5  ==  3">456</div><div v-show="5  ==  5">654</div></div></body><script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script><script>new Vue({el: '#app',},})</script>
</html>

浏览器页面只显示了654
在这里插入图片描述浏览器控制台查看元素,发现两个div都存在,只是具有不同的样式
在这里插入图片描述这里就可以看出来,v-if与v-show都可以控住元素的显示和不显示,但是也存在区别:
v-if控制元素显示与隐藏,通过js创建dom元素或删除元素
v-show通过css的display显示与隐藏

区分:频繁切换元素显示与隐藏用v-show,其余可以用v-if

3.3、 v-on

作用:注册事件 = 添加监听 + 提供处理逻辑

语法:

① v-on:事件名 = “内联语句” => 简写: @事件名 = "内联语句 "

② v-on:事件名=“methods中的函数名” => 简写: @事件名 = “methods中的函数名”

​ 调用函数时不传递参数,事件对象($event)就是默认的第一个形参

​ v-on 调用参数,当涉及到参数传递时 ,改写为 事件名 = “methods中的函数名(参数1,参数2)”

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><!-- 2 准备dom --><div id="app"><p>{{ num }}</p><button v-on:click="num++">+1</button><button @click="num--">-1</button><button @click="fn">按钮</button><button @click="fn2(10,$event)">按钮2</button></div></body><!-- 1 引入Vue --><script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script><script>// 3 创建vue实例new Vue({// 元素el: '#app',// 数据data: {num: 0,},// 方法methods: {//  fn: function() {}fn(e) {// 调用方法不传递任何参数,默认第一个形参就是事件对象console.log(e)console.log(this) // 指向vue实例this.num += 10console.log('按钮被点击')// TODO},fn2(x, e) {// 传递参数,实参通过$event console.log(x, e)},},})</script>
</html>

3.4、v-for

作用:基于数组循环,多次渲染整个元素

遍历数组语法:v-for = “(item,index) in 数组“

​ item 表示每一项 index 表示下标

​ 当参数只有一个时,可以省略括号

v-for 中的 key

语法:key属性 = “唯一标识”

key的作用:给元素添加的唯一标识,便于vue进行列表项的正确排序复用

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><!-- 2 准备dom --><div id="app"><a href="https://www.baidu.com">百度</a><a v-bind:href="link">京东</a><a :href="link" :x="10" y="20">京东</a><ul><li v-for="(item, index) in arr" :key="item.id">{{index}}-{{ item.bookName }}</li></ul><ul><li v-for="i in 8">{{i}}</li></ul></div></body><!-- 1 引入Vue --><script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script><script>// 3 创建vue实例new Vue({// 元素el: '#app',// 数据data: {link: 'http://www.jd.com',arr: [{id: 1,bookName: '活法',author: '稻盛和夫',},{id: 2,bookName: '羊脂球',author: 'somebody',},{id: 3,bookName: '钢铁如何炼成的',author: 'somebody',},],}})</script>
</html>

在这里插入图片描述

注意点:1.key的值只能是字符串数字类型

​ 2.key的值必须具有唯一性

​ 3.推荐使用id作为key的唯一值,不推荐使用index作为key

4.v-for 不建议与 v-if 一起使用,v-for优先级更高,消耗性能

3.5、 v-bind

作用:动态的设置html的标签属性 -> src、url、title ……

语法:v-bind:属性名 = “表达式” —> 简写 :属性名 = “表达式”

对于样式控制的增强

(1)、操作class

​ 语法::class = “对象/数组”

​ ①对象 --> 键就是类名,值是布尔值。如果值是true,有这个类,否则没有这个类

<div class='box' :class='{类名1:布尔值,类名2:布尔值}'></div>

​ ②数组 --> 数组中所有的类,都会添加到盒子上,本质就是一个class列表

<div class='box' :class='[类名1,类名2,类名3]'></div>

(2)、操作style

​ 语法::style = ‘样式对象’

<div class='box' :style='{css属性名1: css属性值,css属性名2: css属性值}'></div>
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>.theme {background-color: black;}.box {font-size: 30px;font-weight: 700;}.active {border: 2px dashed pink;}</style></head><body><!-- 2 准备dom --><div id="app"><divclass="box"style="width: 100px; height: 100px; background-color: red"></div><!-- 1 行内式 :style="样式对象" --><div:style="{width:'100px',height:'100px', backgroundColor: 'blue'}"></div><!-- 2 :class="['类名','类名']" --><div class="box" :class="[activeClass]" :style="styleObj">div</div><div class="box" :class="['active']" :style="styleObj">div</div><div class="box" :class="activeClass" :style="styleObj">div</div><div class="box" :class="'active'" :style="styleObj">div</div><div :class="['box', activeClass]" :style="styleObj">div1111</div><!-- <div class="box active" :style="styleObj">div</div> --><div>-----------------</div><!-- 3 :class="{类名1: 布尔值,类名2:布尔值}" --><div :class="{active: false}">div</div><div :class="{theme: bool}">div区域</div></div></body><!-- 1 引入Vue --><script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script><script>// 3 创建vue实例new Vue({// 元素el: '#app',// 数据data: {info: 'hello vue',arr: [1, 2, 3],// 样式对象styleObj: {width: '200px',height: '200px',backgroundColor: 'red',},activeClass: 'active',bool: true,},})</script>
</html>

3.6、v-on

作用:注册事件 = 添加监听 + 提供处理逻辑

语法:

① v-on:事件名 = “内联语句” => 简写: @事件名 = "内联语句 "

② v-on:事件名=“methods中的函数名” => 简写: @事件名 = “methods中的函数名”

​ 调用函数时不传递参数,事件对象($event)就是默认的第一个形参

​ v-on 调用参数,当涉及到参数传递时 ,改写为 事件名 = “methods中的函数名(参数1,参数2)”

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><!-- 2 准备dom --><div id="app"><p>{{ num }}</p><button v-on:click="num++">+1</button><button @click="num--">-1</button><button @click="fn">按钮</button><button @click="fn2(10,$event)">按钮2</button></div></body><!-- 1 引入Vue --><script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script><script>// 3 创建vue实例new Vue({// 元素el: '#app',// 数据data: {num: 0,},// 方法methods: {//  fn: function() {}fn(e) {// 调用方法不传递任何参数,默认第一个形参就是事件对象console.log(e)console.log(this) // 指向vue实例this.num += 10console.log('按钮被点击')// TODO},fn2(x, e) {// 传递参数,实参通过$event console.log(x, e)},},})</script>
</html>

3.7、v-model

作用:给表单元素使用,双向数据绑定 —> 可以快速获取或设置表单元素内容

​ 数据变化 —> 视图自己更新

​ 视图变化 —> 数据自动更新

语法:v-model = “变量”

原理: v-model本质上是一个语法。例如应用在输入框上,就是 value属性和input事件的和写。

<template><div id='app'><input v-model='msg' type='text'><input :value='msg' @input='msg = $event.target.value' type='text'></div>
</template>

注意:$event用于在模版中,获取事件的形参

应用于其他表单元素

v-model会根据控件类型自动选取正确的方法来更新元素

输入框 input:text -----> :value + @input

文本域 textarea -----> :value + @input

复选框 -----> :checked + @change

单选框 -----> :checked + @change

下拉菜单 -----> :value + @change

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><!--v-model 双向绑定 用于表单元素--><div id="app">用户名 <input type="text" v-model="username" /> 密码<input type="text" v-model="pwd" /><!--v-model="数据" 等价于 :value="数据" + @input="数据=$event.target.value"--><input type="text" :value="username" @input="fn" /><input type="checkbox" name="" id="" v-model="checked" /><!-- <inputtype="checkbox"name=""id="":checked="checked"@change="checked = $event.target.checked"/> --><button @click="login">登录</button></div><script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script><script>new Vue({el: '#app',data: {username: 'zs',pwd: '',checked: true,},methods: {fn(e) {this.username = e.target.value},login() {console.log(this.username, this.pwd)},},})</script></body>
</html>

3.8、指令修饰符

通过 “.” 指明一些指令后缀,不同后缀封装了不同的处理操作 --> 简化代码

① 按键修饰符

​ @keyup.enter ----> 键盘回车监听

​ @keyup.esc -------> 键盘esc监听

② v-model修饰符

​ v-model.trim ----> 去除首位空格

​ v-model.number ------> 转数字

​ v-model.lazy ------------> 失去焦点,才收集数据

③ 事件修饰符

​ @事件名.stop —> 阻止冒泡

​ @事件名.prevent ----> 阻止默认行为

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><div id="app"><!-- 按键修饰符.enter 只有按下Enter才触发 --><input type="text" @keyup.enter="fn" /><!-- 指令修饰符 .trim 去掉首尾空格 .number转数字 --><input type="text" v-model.trim="username" /><input type="text" v-model.number="age" /><!-- 事件修饰符 .stop阻止冒泡--><div @click="fa"><div @click.stop="son">son</div><a href="https://www.baidu.com" @click.stop.prevent="handleClick">百度</a></div></div><script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script><script>new Vue({el: '#app',data: {username: '',age: 0,},methods: {fn(e) {console.log(e)console.log('ok')},fa() {console.log('father')},son() {console.log('son')},handleClick() {alert('6666')},},})</script></body>
</html>

4、计算属性 computed

概念:基于现有的数据,计算出来的新属性

优势:依赖的数据变化,才自动重新计算;计算属性,自带缓存效果

语法:①声明在 computed 配置项中,一个计算属性对应函数

​ ②使用起来和普通属性一样使用 {{计算属性名}}

computed:{计算属性名(){基于现有的数据,编写求值逻辑return 结果}
}

计算属性完整写法

计算属性默认简写,只能访问,不能修改

如果要修改,需要写计算属性的完整写法

computed:{计算属性名:{get(){一段代码逻辑(计算逻辑)return 结果}set(修改的值){一段代码逻辑(修改逻辑)}}
}
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><!-- 2 准备dom --><div id="app"><p>计算属性 {{ avegeScore }}</p><p>计算属性 {{ avegeScore }}</p><p>计算属性 {{ avegeScore }}</p><p>方法 {{ avegeScore2() }}</p><p>方法 {{ avegeScore2() }}</p><p>方法 {{ avegeScore2() }}</p><button @click="avegeScore  = 100">按钮</button></div></body><!-- 1 引入Vue --><script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script><script>// 3 创建vue实例new Vue({// 元素el: '#app',// 数据data: {v: 0,arr: [{id: 1,name: 'zs',score: 80,},{id: 2,name: 'ls',score: 85,},{id: 3,name: 'wangwu',score: 78,},],},// 计算属性-本质是一个函数computed: {// 不能与data中数据同名// arr() {//   return 1// },/* avegeScore() {console.log('computed')const sum = this.arr.reduce((current, next) => {return current + next.score}, 0)return (sum / this.arr.length).toFixed(2)}, */// 计算属性完整用法// avegeScore: {//  设置值走set//   set(newV) {//     this.v = newV//   },//   使用计算属性走get//   get() {//     // const sum = this.arr.reduce((current, next) => {//     //   return current + next.score//     // }, 0)//     // return (sum / this.arr.length).toFixed(2)//     return this.v//   },// },},methods: {avegeScore2() {console.log('methods')const sum = this.arr.reduce((current, next) => {return current + next.score}, 0)return (sum / this.arr.length).toFixed(2)},},})</script>
</html>

computed 计算属性 VS methods 方法

(1)、computed 计算属性:

作用:封装了一段对于数据的处理,求得一个结果。

语法:写在computed配置项中;作为属性,直接使用 ----> this.计算属性 {{ 计算属性 }}

缓存特性(提升性能):计算属性会对计算出来的结果缓存,再次使用直接读取缓存,依赖项变了,会自动重新计算 —> 并再次缓存

(2)、methods 方法:

作用:给实例提供一个方法,调用以处理业务逻辑

语法:写在methods配置中;作为方法,需要调用 --> this.方法名() {{ 方法名() }} @事件名=‘方法名’

5、侦听器 watch

作用:监视数据变化,执行一些业务逻辑 或 异步操作

语法:

① 简单写法 --> 简单类型数据,直接监视

watch:{数据属性名(newValue,oldvalue){一些业务逻辑 或 异步操作},'对象.属性名'(newValue,oldValue){一些业务逻辑 或 异步操作}
}

② 完整写法 --> 添加额外配置项

​ (1)deep:true , 对复杂类型深度监视

​ (2)immediate:true , 初始化立刻执行一次handler方法

watch:{数据属性名:{deep:true,immediate:true,handler(newValue){一些业务逻辑 或 异步操作}}	
}

watch的应用

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><div id="watch-example"><p>Ask a yes/no question:<input v-model="question" /></p><p>{{ answer }}</p></div><!-- 1 引入Vue --><script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script><script src="https://cdn.jsdelivr.net/npm/axios@0.12.0/dist/axios.min.js"></script><script src="https://cdn.jsdelivr.net/npm/lodash@4.13.1/lodash.min.js"></script><script>new Vue({el: '#watch-example',data: {question: '',answer: 'I cannot give you an answer until you ask a question!',},watch: {question() {this.fn()},},// 生命周期钩子函数 vue应用执行的时候自动帮我们调用created() {this.fn = _.debounce(this.getAnswer, 500)},methods: {async getAnswer() {if (this.question.indexOf('?') === -1) {this.answer = 'Questions usually contain a question mark. ;-)'return}this.answer = 'Thinking...'// 发请求const {data: { answer },} = await axios.get('https://yesno.wtf/api')this.answer = answer},},})</script></body>
</html>

后面我们接着讲Vue的生命周期以及后面的内容!!!

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

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

相关文章

装机打不开BIOS怎么办?如何进入Windows10的BIOS页面,如何关闭快速启动

电脑有快速启动&#xff0c;想进去BIOS页面非常困难&#xff0c;在临开机的页面&#xff0c;按触发按键不管用。 然后我看到了一种新的进入BIOS的方式&#xff1a; &#xff08;1&#xff09;win8以上的系统&#xff0c;按住shift&#xff0c;然后鼠标点击重启&#xff0c;再…

蓝桥杯2024/1/26笔记-----基于PCF8591的电压采集装置

功能实现要求&#xff1a; 每次建好工程文件夹&#xff0c;里边包含User&#xff08;放工程文件&#xff0c;mian.c&#xff0c;可以在这里写如同我这个文章的文本文档&#xff09;、Driver&#xff08;存放底层文件如Led.c&#xff0c;Led.h等&#xff09; 新建的工程先搭建框…

推荐一款Linux、数据库、Redis、MongoDB统一管理平台!

官方演示 状态查看 ssh 终端 文件操作 数据库操作 sql 编辑器 在线增删改查数据 Redis 操作 Mongo 操作 系统管理 账号管理 角色管理 资源管理 一.安装 1.下载安装包 cd /opt wget https://gitee.com/dromara/mayfly-go/releases/download/v1.7.1/mayfly-go-linux-amd64.zi…

CES 2024:AI赋能机器人,国产机器人更亮眼

原创 | 文 BFT机器人 一年一度的国际消费电子展(CES)又与我们见面了。作为全球消费电子和科技创新的盛会&#xff0c;CES每年都吸引着无数目光。今年&#xff0c;AI赋能机器人成为展会的一大亮点&#xff0c;而国产机器人更是凭借其创新技术和实用功能&#xff0c;成为全场焦点…

使用QT实现播放gstreamer的命令(二)

一、前言 上一篇文章写到了&#xff0c;如何快速使用C来执行gstreamer的命令&#xff0c;如何在QT中显示gstreamer的画面&#xff0c;原文如下&#xff1a; https://blog.csdn.net/Alon1787/article/details/135107958 二、近期的其他发现&#xff1a; 1.gstreamer的画面显示在…

蓝桥杯AT24C02问题记录

问题1&#xff1a;从这个图片上可以看出这两个在IIC的.c文件里延时时间不一样&#xff0c;第一张图使用了15个_nop_(); 12M晶振机器周期是 1/12M*121uS&#xff1b;nop()要延时1个指令周期。延时时间不对会对时序产生影响&#xff0c;时序不对&#xff0c;则AT24C02有没被使用…

关于Spring Boot和MyBatis常见的十道面试题

拦截器和过滤器有什么区别&#xff1f; 拦截器&#xff08;Interceptor&#xff09;和过滤器&#xff08;Filter&#xff09;都是用于在请求道道目标资源的之前或之后进行处理的组件。主要区别有以下几点&#xff1a; 依赖对象不同&#xff1a;过滤器是来时Servlet&#xff0…

IDEA安装MyBatisX插件

IDEA工具在开发人员中经常使用&#xff0c;从dao层到xml文件对应的查看很费劲&#xff0c;这时候就有相应的插件工具出现了MyBatisX。他的好处如下&#xff1a; mapper and xml can jump back and forth mybatis.xml,mapper.xml prompt mapper and xml support auto prompt lik…

Netty核心——Reactor下篇(十)

任务队列中的Task有3种典型使用场景 用户程序自定义的普通任务 比如有一个非常耗时长的业务 异步执行提交该Channel对应的NioEventLoop的TaskQueue中 用户自定义定时任务 该任务提交到scheduleTaskQueue中 非当前Reactor线程调用Channel的各种方法 例如在推送系统的业务线程…

大数据StarRocks(八):资源隔离实战

前言 自 2.2 版本起&#xff0c;StarRocks 支持资源组管理&#xff0c;集群可以通过设置资源组&#xff08;Resource Group&#xff09;的方式限制查询对资源的消耗&#xff0c;实现多租户之间的资源隔离与合理利用。在 2.3 版本中&#xff0c;StarRocks 支持限制大查询&#…

酒鬼酒2024年展望:稳发展动能,迈入恢复性增长轨道

文 | 琥珀酒研社 作者 | 渡过 最近几个月来&#xff0c;白酒估值回落到近十年来低位&#xff0c;反映出了整个白酒行业的市场低迷和虚弱现状。不管是头部企业五粮液、泸州老窖&#xff0c;还是区域酒企口子窖、金种子酒等&#xff0c;最近都通过“回购”或“增持”&#xff0…

常用直线检测算法

概述 在计算机视觉领域&#xff0c;我们经常需要做一些特殊的任务&#xff0c;而这些任务中经常会用到直线检测算法&#xff0c;比如车道线检测、长度测量等。– 资料 直线检测算法汇总_技术挖掘者的博客-CSDN博客_直线检测算法 直线检测算法博文中缺失的几个源码(Hough_lin…

联想乐商店更新安卓APK错误处理

当你点击“重新提交”&#xff0c;联想开放平台会卡死 其实他们的网页是有BUG的。HTTP GET appDetail请求会有个服务器内部错误 联系了联想客服&#xff0c;他们的绕过去方案是&#xff0c;你要选择“已上架” 然后再更新版本就可以了

【Python机器学习系列】建立XGBoost模型预测心脏疾病(完整实现过程)

一、引言 前文回顾&#xff1a; 一文彻底搞懂机器学习中的归一化与反归一化问题 【Python机器学习系列】一文彻底搞懂机器学习中表格数据的输入形式&#xff08;理论源码&#xff09; 【Python机器学习系列】一文带你了解机器学习中的Pipeline管道机制&#xff08;理论源码…

【Python】03快速上手爬虫案例三:搞定药师帮

文章目录 前言1、破解验证码2、获取数据 前言 提示&#xff1a;通过用户名、密码、搞定验证码&#xff0c;登录进药师帮网站&#xff0c;然后抓取想要的数据。 爬取数据&#xff0c;最终效果图&#xff1a; 1、破解验证码 使用药师帮测试系统&#xff1a;https://dianrc.ysb…

2024 高级前端面试题之 HTML 「精选篇」

该内容主要整理关于 HTML 的相关面试题&#xff0c;其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 HTML模块精选篇 1. 如何理解HTML语义化2. H5的新特性有哪些3. 说一下 HTML5 Drag API4. iframe有那些缺点5. 如何实现浏览器内多个标签页之间的通信6. 简述一下s…

Elasticsearch:如何为 Elastic Stack 配置 AI Assistant

了解并安装 Elastic AI Assistant Elastic 推出了 Observability AI Assistant&#xff0c;这是一款利用生成式 AI 来增强你的 Observability 体验的强大工具。 该 AI 助手由 OpenAI 或 Azure OpenAI 服务的连接器提供支持&#xff0c;可带来上下文洞察和聊天功能&#xff0c;…

104.乐理基础-五线谱-中音谱号、次中音谱号

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;103.乐理基础-五线谱-低音谱号-CSDN博客 上一个内容练习答案&#xff1a; 常用的谱号就是下图所示的四个&#xff0c;其中高音谱号与低音谱号已经在上一个内容和上上一个内容中写过了&#xff0c;音乐中百分之九十…

【C++历练之路】探秘C++三大利器之一——多态

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#x1f354;: 在计算机科学的广袤领域中&#xff0c;C多态性是一门令人着迷的技术艺术&#xff0c;它赋予我们的代码更强大的灵活性和可维护性。想象一下&#xff0c;你正在构建一个程序&#xff0c;需要适应不断…

python3.8 安装缺少ssl、_ctypes模块解决办法

问题 安装pyhton3.8安装默认不依赖ssl 运行Flask项目时报错&#xff1a; Traceback (most recent call last):File "/usr/local/python3/bin/flask", line 8, in <module>sys.exit(main())File "/usr/local/python3/lib/python3.8/site-packages/flask…