当前位置: 首页 > news >正文

小程序开发——小程序的视图与渲染

 1.视图与渲染过程

 基本概念:

视图层由WXML页面文件和样式文件WXSS共同组成。事件是视图层和逻辑层沟通的纽带,用户操作触发事件后可通过同名的事件处理函数执行相应的逻辑,处理完成后,更新的数据又将再次渲染到页面上。

WXML页面:

WXML是框架设计的一套标签语言,结合基础组件和事件系统可构建出页面的结构。组件是视图的基本组成单元,组件的显示效果是由页面样式文件中定义的样式进行控制的。

<view class="container"><view class="userinfo"><button 	="{{!hasUserInfo &&canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo">获取头像昵称</button><block wx:else><image bindtap="bindViewTap" src="{{userInfo.avatarUrl}}" ></image><text class="userinfo-nickname"> {{userInfo.nickName}} </text></block></view><view class="usermotto"><text class="user-motto">{{motto}} </text></view>
</view>

 button组件简单使用案例

实现效果,如下图所示:

新建Chapter02项目与页面

使用官方文档拷贝示例代码

进入微信官方小程序开发文档,其链接为:                  https://developers.weixin.qq.com/miniprogram/dev/framework/

 选择“组件”→“表单组件”→button一栏

 

由上图可以看到关于button组件所有可设置的属性,以及属性的可选值,还有一些使用的注意事项等。将页面拖动到底部可以看到微信官方的示例代码与演示效果

 

现在仅仅想要一个简单的按钮,将上述wxml里部分代码拷贝,如下述代码所示:

<button type="default" size="{{defaultSize}}" loading="{{loading}}" plain="{{plain}}"disabled="{{disabled}}" bindtap="default" hover-class="other-button-hover"> default </button>
<button type="primary" size="{{primarySize}}" loading="{{loading}}" plain="{{plain}}"disabled="{{disabled}}" bindtap="primary"> primary </button>

 去掉多余的关于loading以及plain等属性的设置,得到精简一点的代码段,并拷贝到刚才新建页面的button.wxml文件中,如下所示:

<button type="default">default</button>
<button type="primary">primary</button>

2.数据绑定

在WXML页面中可以用双花括号里面添加变量名的形式表示动态数据,这称为Mustache语法,形如:{{变量名}}。 WXML 中的动态数据均来自对应JS文件中Page的data属性,分别可以作用于wxml页面的内容、组件属性、控制属性等。除此之外,在双花括号内还可以支持简单的运算以及字符串的拼接等操作。

内容绑定

在上述案例中学习了button组件的基本使用,现在将button里面的文字内容进行简单的内容绑定,如下述代码所示:

<!-- WXML页面代码 -->
<button type="primary">{{btnText}}</button>
<text>{{content}}</text>

上述代码花括号内部的btnText与content就是绑定的变量,需在页面的JS文件中进变量的初始化,在页面加载时便可将数据渲染到WXML中,如下所示:

//JS文件代码
Page({data: {btnText:"按钮文字",content:"这是要显示的内容"}
})

 组件属性绑定

组件的属性也可以使用动态数据,例如组件的id、class等属性值。例如在WXML文件里可添加如下代码:

<view id='{{id}}'> 测试组件属性绑定</view>

与简单绑定一样,需在当前页面对应的JS文件的data属性里添加名为id的变量才能实现正确的组件属性绑定,值得注意的是,组件属性数据最外层的单引号(双引号)不可省略。

控制属性绑定

控制属性也可以使用动态数据,但必须在引号内。如下代码所示:

<!--WXML页面代码-->
<view wx:if='{{condition}}'>测试控制属性绑定</view>

在文件里添加变量condition,暂时初始化为true,如下面代码所示。

//JS文件代码
Page({data: {condition:true}
})

 当更改变量condition的值为false时,view组件将不再显示,可以自行测试

true和false关键字绑定

在双括号内部除了引用data里的变量名之外,还可以直接写入一些关键字进行运算,如布尔类型的关键字true和false。如下面代码所示:

<view wx:if='{{false}}'>关键字绑定测试false</view>
<view wx:if='{{true}}'>关键字绑定测试true</view>

 不可以去掉双花括号直接写成wx:if='false',此时false会被认为是一个字符串,并且转换为布尔值后表示true。

运算绑定

三元运算:三元运算的语法表达式为:条件表达式?表达式1:表达式2。其中问号前面的位置是判断的条件,判断结果为bool型,为true时调用表达式1,为false时调用表达式2。在小程序的页面中三元运算经常这样使用:

<!--WXML页面代码-->
<view hidden='{{result ? true : false}}'>该组件将被隐藏</view>
//JS文件代码
Page({data: {result : false}
})

算数运算:双花括号内部也支持基本的四则运算,如下面代码所示:

<!--WXML页面代码-->
<view> {{a + b}} + {{c}} + d </view>
//JS文件代码
Page({data: {a : 3, b : 4, c : 5}
})
//上述代码最后运算结果为“7+5+d”。

 逻辑判断:逻辑判断也就是支持大于和小于号,形成一个最后值为true或false的表达式。逻辑判断同样可以用于控制组件的显示,代码如下:

<view wx:if="{{length >3}}">当length的值大于3时该组件显示 </view>

字符串运算:字符串运算会用到字符串连接符“+”,这应与算数运算中的+号运算符进行区别,如下面代码所示:

<!--WXML页面代码-->
<view>{{"Hello, " + name}}</view>
<view>{{msg + name}}</view>
//JS文件代码
Page({data: {name:"Toky",msg: "Hi, "}
})

在双花括号内部,若+号两边都是数值,则进行加运算。若+号两边的变量有任意一个是双引号引起来的字符串,则看作字符串连接符。

数据路径运算:数据路径运算即针对这些变量,对json对象,只需要用“.”运算符即可取到其下一层的属性。而数组变量的书写和其他语言的语法基本一致,采用一对中括号的形式,下标从0开始,如下述代码所示:

<!--WXML页面代码-->
<view>{{object.key2}} {{array[1]}}</view>
//JS文件代码
Page({data: {object: { key1: 'Hello ', key2:'Hi' },array: ['Toky','Bob','Nike']}
})
//上述代码可在WXML页面显示“Hi Bob”。

 组合绑定

数组组合:在双花括号内还可以直接进行变量和值的组合,构成新的对象或者数组,如下面代码所示:

<!--WXML页面代码-->
<view wx:for='{{[1,2,x,4]}}'>{{item}}</view>
//JS文件代码
Page({data: { x : 3 }
})

 上述代码最终组合成数组[1,2,3,4]。wx:for与wx:if都是渲染标签,wx:for用于循环一个数组或列表,这个用于循环的数组元素值将默认赋值给item,因此上述代码可在页面依次显示该数组的元素值。值得注意的是,当花括号和引号之间如果有空格,将最终被解析成为字符串,如下述代码所示:

<view wx:for="{{[1,2,3]}} ">{{item}}</view>
<view wx:for="{{[1,2,3]+' '}}">{{item}}</view>

在WXML调试面板可看到最终渲染的WXML代码如图:

 

对象的组合与展开:对象的组合是指在双花括号内部通过key:变量名的形式可以将data里的数据组合到页面中。如下述代码所示:

<!--WXML页面代码-->
<template is="test" data="{{username: value1, password: value2}}"></template>
//JS文件代码
Page({data: {value1 : 'Toky',value2 : '123456'}
})
//最终组合成的对象是{username:Toky,password:123456}

 对象的拆分可利用拓展运算符“…”三个点完成,示例代码如下:

<!--WXML页面代码-->
<template is="objectCombine" data="{{...obj1, ...obj2, e: 5}}"></template>
//JS文件代码
Page({data: {obj1: { a: 1,  b: 2 },obj2: { c: 3,  d: 4 }}
})

最终组合成的对象是 {a: 1, b: 2, c: 3, d: 4, e: 5}。 在展开时,若obj2中的变量与obj1中的变量名相同的情况,后边的变量会覆 盖前面的。

数据绑定综合案例

关于数据绑定的综合案例主要用于测试内容绑定、组件属性绑定、控制属性绑定、关键字绑定与运算绑定,并给按钮绑定了简单的点击事件以实现内容的更新。

 页面WXML代码:案例综合数据绑定,测试多种属性的绑定,并给按钮组件添加了点击事件。在JS逻辑代码中重新渲染了页面的变量,其WXML代码如下:

<!--pages/demo2-2/dataBind.wxml-->
<view class='container'><view class='page-body'><text class='h1'>数据绑定综合案例</text><view class='demo-box'><view class="title">1、内容绑定</view><button type="primary" bindtap="btnClick">
{{btnText}}</button><text>{{content}}</text></view><view class='demo-box'><view class="title">2、组件属性绑定</view><view id='{{id}}'>这是带有id的view1</view></view>
<view class='demo-box'><view class="title">3、控制属性与关键字绑定</view><text class="content">当condition初始化为false时,view不显示</text><view wx:if='{{condition}}'>view2</view><view wx:if='{{false}}'>关键字绑定测试false</view><view wx:if='{{true}}'>关键字绑定测试true</view></view><view class='demo-box'><view class="title">4、运算绑定</view><view hidden='{{result ? true : false}}'>三元运算:result为真时显示</view><view>算术运算: {{a + b}} + {{c}} + d </view><view wx:if="{{length >3}}">逻辑判断:当length的值大于3时该组件显示 </view><view>字符串运算: {{"Hello, " + name}}</view><view>字符串运算: {{msg + name}}</view><view>数据路径运算: {{object.key2}} {{array[1]}}</view> </view> </view></view>

 页面数据:页面数据在JS文件的data属性中进行初始化,全部变量如下所示:

data: {btnText: "按钮文字",content: "该按钮已经绑定btnClick事件",condition: false,a: 3, b: 4, c: 5,object: {key1: 'Hello ', key2: 'Hi'},array: ['Toky', 'Bob', 'Nike'],message1: "这是简单绑定的数据",id: 'testpage02View',msg: "Hi, ",name: "Toky",result: false},

页面点击事件处理函数:按钮点击后需要相应的处理函数执行逻辑代码,其完整代码如下:

// pages/demo2-2/dataBind.js
Page({data: { content: "该按钮已经绑定btnClick事件",//省略其他变量},// 按钮点击事件处理函数btnClick: function() {console.log("按钮被点击")this.setData({content: "这是更新后的内容..."})},
})

 上述代码第8行的this指代page函数,page函数中固有的setData方法用于更新data域中的页面数据。由第9行可以看出,setData里同样是传入一个json对象作为参数,该对象里可以填上多个data中已定义或未定义的变量名,这里的未定义的意思是:当在data属性里未对变量定义和初始化时,该方法依旧可以动态地往data属性里面添加数据。另外,所有的页面数据的值都可以在调试器的AppData面板观察到。

3.渲染标签

条件渲染

指根据绑定表达式的逻辑值来判断是否渲染当前组件。view组件拥有控制是否显示的hidden属性, 代码如下所示:

<!--WXML页面代码-->
<view class="content" hidden="{{flag ? true : false}}">
</view>
//JS文件代码
Page({data: {  flag:false}
})

在上面的代码中,当flag变量的值为true时,view组件及其包含的子组件将不会渲染,当flag变量的值为false时,将view组件渲染输出到页面。

wx:if:在微信小程序的wxml文件中,提供了另一种方式来进行类似的条件渲染。就是使用wx:if来控制是否渲染当前组件,其实在上一节的数据绑定中已经使用过,具体代码如下:

<view wx: if= " ({condition}) "> True </view>

 在上面的代码中,当condition变量的值为true时,view组件将渲染输出,当condition 变量的值为false,view组件将不渲染。 值得注意的是,不能在双括号与引号直接留空格。如下面代码段会导致True恒显示,代码如下:

<view wx:if="{{condition}}  "> True </view>

 看起来wx:if属性与组件的hidden类似,不同的是,控制是否渲染的逻辑变量值刚好相反。wx:if可以更方便地控制,还可以使用wx:elif、wx:else来添加多个分支块,当控制表达式的值为true时渲染一个分支,控制表达式的值为false时渲染另一个分支。如下代码所示:

<!--WXML页面代码-->
<view wx:if="{{length >10}}"> case1 </view>
<view wx:elif="{{length > 5}}">case2 </view>
<view wx:else>case3</view>
//JS文件代码
Page({data: {length:6}
})

以上代码中,当length的值大于10时,在界面中渲染输出的是case1字样,当length 的值大于5且小于10时,在界面中渲染输岀的是case2字样,而当length的值小于等于5或是其他情况时, 在界面中渲染输岀的是case3。

block wx:if  当需要通过一个表达式去控制多个组件时,一种方式是为每个组件都添加一个wx:if控制属性。但更好的方式是使用<block>标签将一个包含多节点的结构块包装起来,然后在<block>标签中添加一个wx:if控制属性即可。如下面代码所示:

<!--WXML页面代码-->
<block wx:if="{{condition}}">
<view> view1</view>
<view> view2 </view>
</block>
//JS文件代码
Page({data: {condition:true}
})

 列表渲染

常用的控制结构还有循环,微信小程序使用wx:for提供循环渲染的控制属性。

wx:for 简单列表渲染

循环对象数组:在组件上使用 wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。默认数组的当前项的下标变量名为 index,数组当前项的变量名默认为 item。如下列代码所示:

<!--WXML页面代码-->
<view wx:for="{{array}}">
{{index}}: {{item.message}}
</view>
//JS文件代码
Page({data: {array: [{ "message": "mes1" }, { "message": "mes2" }, { "message": "mes3" }, { "message": "mes4" }]},}
})

从下图中可看出,默认数组的当前项的下标index从0开始,并依次循环输出数组的条目item,且item也可以是json对象,利用上一节提到的“.”运算符取到下一级的属性。

 

wx:for-item与wx:for-index:在使用wx:for时也可以将数组当前下标和当前元素变量进行重命名,使用 wx:for-item可以指定数组当前元素的变量名,使用wx:for-index可以指定数组当前下标的变量名。如下面代码所示:

<!--WXML页面代码-->
<view>
<view wx:for="{{users}}" wx:for-index="myindex" wx:for-item="user">
<text>{{myindex}}-{{user.name}}-{{user.age}}</text>
</view>
</view>
//JS文件代码
Page({data: {users: [{ name: "Toky", age: 21 }, { name: "Nike", age: 19 }, { name: "Lisa", age: 20 }],}})

 

4.模板与引用

在微信小程序的WXML文件中,如果某些WXML代码需要在多个地方反复使用,这时,可以考虑将这些代码定义为一个模板,然后就可在其他WXML文件中利用关键字直接使用该模板。此外,引用与模板皆针对于WXML文件,在1.4.4节关于WXSS文件的介绍中曾使用import关键字导入公共样式文件。相似的道理,针对JS文件,则可在utils.js或其他JS文件夹中编写公共的业务逻辑,最后利用exports关键字进行导出,如下代码所示:

module.exports = {dateTimePicker: dateTimePicker,getMonthDay: getMonthDay
}

以上js代码用于一些公共类的导出,在其他js逻辑文件里可利用require关键字引入,如下述代码所示:

var dateTimePicker = require('../../../utils/dateTimePicker');

   引用本页面模板

模板可定义在当前页面,也可将项目使用到的所有模板定义到一个统一的WXML文件中,在本页面使用模板的步骤如下:

在Chapter02项目中新建testTemplate页面,定义模板的代码如下:

<!--pages/demo2-4/testTemplate.wxml--><template name="userTemplate"> <!----定义模板--><view><view>姓名:{{item.name}}</view><view>年龄:{{item.age}}</view></view></template><!-- 定义结束 -->

 在未使用该模板时,上面定义模板的WXML代码不会显示任何元素,使用该模板的代码如下所示:

<!--pages/demo2-4/testTemplate.wxml-->
<view>
<block wx:for="{{users}}">
<template is="userTemplate" data="{{item}}"/> <!-- 调用模板,传入对象数据-->
</block>
</view>
Page({data: {users: [{ name: "Toky", age: 21 }, { name: "Nike", age: 19 }, { name: "Lisa", age: 20 }],}
})

 

引用其他位置的模板

在进行模板template的定义时也可以写在单独的一个WXML文件里,这时在其他页面进行引用时不是用关键字include,而是import,二者的作用域不同。import只会引入目标文件中定义的 template,而不会引入目标文件里面再引入的其他template,即不能进行链式引用。

定义模板

在Chapter02项目目录下新建commons目录,再新建templates.wxml,如图

在templates.wxml中定义两个模板,如下述代码所示:

<!-- Chapter02/pages/commons/templates.wxml -->
<template name="template1"><text>{{text}}</text>
</template>
<template name="template2"><text>{{text}}</text>
</template>

 引用

在其他文件中进行引用时首先需要利用import关键字将模板拷贝到当前页面,再进行如上一小节中讲解的模板使用方法,利用is关键字指明模板。代码如下所示:

<!--pages/demo2-4/testTemplate.wxml--><import src="../commons/templates" /><template is="template1" data="{{text: '这是传入模板的需要显示的内容'}}" />

 

引用wxml代码段

模板针对于有数据需要传入的情况,实际上若是只想引用静态的WXML片段直接使用include关键字即可,引用wxml代码段步骤如下:

在commons目录下新建文件footer.wxml,并在footer.wxml中添加如下内容:

<!-- Chapter02/pages/commons/footer.wxml -->
<view>
<text>这是许多页面底部需要显示的内容</text>
</view>

在其他需要该footer作为尾部的页面,利用关键字include进行引用。include 可以将目标文件除了<template/>外的整个代码引入,相当于拷贝到 include 所在的位置。在2.4.1节创建的testTemplate.wxml的底部加上如下代码段:

<!--pages/demo2-4/testTemplate.wxml-->
<include src="../commons/footer" />

 上述代码第二行的include标签是一个单独的闭合标签,与在使用模板时用的template闭合标签是一样的,注意不能将末尾的反斜杠丢掉。

5.九九乘法表案例讲解

 代码详情

九九乘法表WXML代码如下:

<!-- MultiplicationTable/pages/index/index.wxml -->
<view class="jiu-box"><view wx:for="{{arr}}" wx:for-item="i" class="aa"><view wx:for="{{arr}}" wx:for-item="j" class="jiu"><view wx:if="{{i >= j}}" class="jiu-item">{{j}}X{{i}}={{j*i}} </view><view wx:else hidden="{{true}}"></view></view></view>
</view>

九九乘法表WXSS样式代码如下:

/* MultiplicationTable/pages/index/index.wxss */
.aa {line-height: 32px;
}
.jiu-box {width: 720rpx;margin: auto;padding: 28rpx 0;
}
.jiu {display: inline-block;
}
.jiu-item {width: 73rpx;height: 32rpx;
line-height: 32rpx;text-align: center;border: 1px solid #abcdef;font-size: 19rpx;margin-right: 4rpx;
}
.jiu-none {display: none;
}
one {display: inline-block;margin-right: 4rpx;width: 70rpx;height: 32rpx;font-size: 14rpx;text-align: center;border: 1rpx solid #1296db;}

 实现效果

6.小结

本文主要介绍了4部分内容。首先是小程序视图与渲染过程。 第1部分在讲解视图层时首先介绍了WXML页面,组成页面的重要部件是组件。 第2部分讲解数据绑定过程。 第3部分需要学会两个重要的渲染标签,分别是wx:if与wx:for,前者用于条件控制,后者用于循环控制。这两个标签的使用能大大减少WXML页面代码的冗余,具体可通过九九乘法表案例体会。 最后一部分讲解了模板与引用,代码的封装在开发中是尤为重要的,WXML代码的重复利用可通过定义模板实现。同样,WXSS与JS代码也有类似的思想。

相关文章:

小程序开发——小程序的视图与渲染

1.视图与渲染过程 基本概念&#xff1a; 视图层由WXML页面文件和样式文件WXSS共同组成。事件是视图层和逻辑层沟通的纽带&#xff0c;用户操作触发事件后可通过同名的事件处理函数执行相应的逻辑&#xff0c;处理完成后&#xff0c;更新的数据又将再次渲染到页面上。 WXML页面…...

用python实现操作mongodb的插入和查找操作

用python实现操作mongodb的插入和查找操作 import pymongoclient pymongo.MongoClient("mongo://localhost:27017") db client["app"] col db["C1"]# 插入一条数据 #user { # "name": "Sam", # "age":…...

代码审计及示例

简介&#xff1a; 代码安全测试是从安全的角度对代码进行的安全测试评估。 结合丰富的安全知识、编程经验、测试技术&#xff0c;利用静态分析和人工审核的方法寻找代码在架构和编码上的安全缺陷&#xff0c;在代码形成软件产品前将业务软件的安全风险降到最低。 方法&#x…...

【Kotlin精简】第6章 反射

1 反射简介 反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff0c;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性。 1.1 Kotlin反射 我们对比Kotlin和Java的反射类图。 1.1.1 Kotlin反射常用的数据结…...

基于FPGA的电风扇控制器verilog,视频/代码

名称&#xff1a;基于FPGA的电风扇控制器verilog 软件&#xff1a;QuartusII 语言&#xff1a;Verilog 代码功能&#xff1a; 基于FPGA的电风扇控制器 运用 EDA SOPO实验开发系统设计一个基于FPGA的电风扇定时开关控制器,能实现手动和自动模式之间的切换。要求: (1)KI为电…...

【MySQL】区分:等值连接/自连接/自然连接/外连接 以及ON和Where使用

区分&#xff1a;等值连接/自连接/自然连接/外连接 以及ON和Where使用 一、等值连接二、自连接三、自然连接四、外连接1.左外连接2.右外连接3.全外连接 五、using 和 on六、JOIN 关联表中 ON、WHERE 后面跟条件的区别 一、等值连接 等值连接&#xff1a;它是基于两个表之间的相…...

Windows环境下Apache安装部署说明及常见问题解决

一、软件准备 1.1 Python的下载与安装 见博客 链接: Python下载安装 1.2 Pycharm的下载与安装 见博客 链接: pycharm安装 1.3 Mysql的下载与安装 见博客 链接: MySQL安装 1.4 Navicat的下载与安装 可参考软件安装管家。 解释说明:Pycharm是Python的集成编译环境&#xff0c;Nav…...

Linux-安装docker-compose

前言&#xff1a;本文建立在服务器中已经存在docker环境的基础上&#xff0c;总结了安装docker-compose过程&#xff0c;以及安装过程中遇到的问题和解决方案。 一、下载docker-compose 在网上找了两种&#xff0c;一种是github官方的&#xff0c;一种是国内的镜像 gitbub官…...

机器学习实验一:KNN算法,手写数字数据集(使用汉明距离)

KNN-手写数字数据集: 使用sklearn中的KNN算法工具包( KNeighborsClassifier)替换实现分类器的构建,注意使用的是汉明距离; 分段解释代码: import os import pandas as pd from Levenshtein import hamming导入所需的库,包括os用于文件操作,pandas用于数据处理,以及hamm…...

Java零基础入门-赋值运算符

前言 Java是一门广泛被应用的编程语言&#xff0c;它被用于开发各种类型的应用程序&#xff0c;从桌面应用程序到企业级后端系统。对于零基础的人来说&#xff0c;学习Java可能会感到有些困难。本文将帮助那些没有编程经验的人了解Java的赋值运算符。 摘要 本文将介绍Java中…...

xshell+xming显示jmeter的gui页面

1.下载和安装xming&#xff0c;下载地址&#xff1a;https://sourceforge.net/projects/xming/ 2.配置xming 记住这个端口&#xff0c;一会要用到 修改进入xming安装目录修改host文件 此处是远程服务器的ip 3.服务器执行vi /etc/ssh/sshd_config&#xff0c;修改成如图所示…...

el-tree业务

<el-form-item label"选择节点" prop"node_ids"><el-checkboxv-if"regionList.length"v-model"selectAll":disabled"selectDisabled":indeterminate"isIndeterminate":show-checkbox"!selectDisabl…...

警惕Mallox勒索病毒的最新变种malloxx,您需要知道的预防和恢复方法。

导言&#xff1a; 恶意软件的威胁不断进化&#xff0c;其中之一是.malloxx勒索病毒。这种病毒可以加密您的文件&#xff0c;并要求您支付赎金以解锁它们。本文91数据恢复将详细介绍.malloxx勒索病毒&#xff0c;包括如何恢复被加密的数据文件以及如何预防这种威胁。如果受感染…...

linux中断下文之tasklet(中断二)

在申请 GPIO 中断时使用 request_irq,但是request_irq绑定的中断服务程序指的是中断上文。在 Linux 内核中&#xff0c;tasklet 是一种特殊的软中断机制&#xff0c;被广泛用于处理中断下文相关的任务。它是一种常见且有效的方法&#xff0c;在多核处理系统上可以避免并发问题。…...

Mysql事务+redo日志+锁分类+隔离级别+mvcc

事务&#xff1a; 是数据库操作的最小工作单元&#xff0c;是作为单个逻辑工作单元执行的一系列操作&#xff1b;这些操作作为一个整体一起向系统提交&#xff0c;要么都执行、要么都不执行&#xff1b;事务是一组不可再分割的操作集合&#xff08;工作逻辑单元&#xff09;&a…...

Kafka-Java四:Spring配置Kafka消费者提交Offset的策略

一、Kafka消费者提交Offset的策略 Kafka消费者提交Offset的策略有 自动提交Offset&#xff1a; 消费者将消息拉取下来以后未被消费者消费前&#xff0c;直接自动提交offset。自动提交可能丢失数据&#xff0c;比如消息在被消费者消费前已经提交了offset&#xff0c;有可能消息…...

Python 训练集、测试集以及验证集切分方法:sklearn及手动切分

目录 方法一 方法二 需求目的&#xff1a;针对模型训练输入&#xff0c;按照6:2:2的比例进行训练集、测试集和验证集的划分。当前数据量约10万条。如果针对的是记录条数达上百万的数据集&#xff0c;可按照98:1:1的比例进行切分。 方法一&#xff1a;切分训练集和测试集&…...

数据结构,及分类(存储分类、逻辑分类)介绍

一、数据结构&#xff1a; 数据是软件开发的核心。在软件开发过程中基本上就是对数据的新增、删除、修改、查看的操作。 如何合理存储数据&#xff0c;如何有效提升数据操作开发效率&#xff0c;都是软件开发中的重中之重。使用合理的数据结构是非常重要的。 1.1简介&#xff…...

Powershell脚本自动备份dhcp数据库

文章目录 为什么要备份DHCP数据库呢&#xff1f;在PowerShell中自动备份DHCP数据库1&#xff0c;创建备份目录2&#xff0c;判断备份路径是否存在3&#xff0c;备份DHCP数据库4&#xff0c;完整自动备份脚本5&#xff0c;安排定期备份 推荐阅读 为什么要备份DHCP数据库呢&#…...

第十六章总结:反射和注解

.1.1&#xff1a;访问构造方法 反射&#xff1a; 1.class类 2.获取构造方法 3.获取成员属性 4.获取成员方法 注解 1.内置注解 2.反射注解 3 创建Class对象的三种方式 1.使用getClass&#xff08;&#xff09;方法 object str new object&#xff08;&#xff09;…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...