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

uni-app(HBuilderX)搭建小程序流程(请求封装,下拉刷新,底部加载等)

uni-app 是一个跨平台的前端框架,用于开发多端应用。uni-app 提供了一个统一的 API,允许开发者编写一次代码,最终部署到多个平台,极大地提高了开发效率。在编写小程序的时候和原生微信开发者工具语法略有区别。

目录

一、请求工具封装

1、不封装的请求示例

2、在文件结构中新建

3、请求工具封装

4、请求工具封装优化(可选)

5、统一管理接口

6、页面中引入对应的请求函数

 二、点击跳转页面报错MiniProgramError{"errMsg":"navigateTo:fail timeout"}

 三、滚动底部发请求和下拉刷新


一、请求工具封装

网络请求官网: 

网络请求:   uni.request(OBJECT) | uni-app官网

uni-app 中进行网络请求时,可以通过封装请求工具来简化和统一请求的逻辑。封装后的请求工具可以处理常见的请求配置、错误处理、响应数据处理等,使得网络请求的管理更加清晰和高效。

1、不封装的请求示例

uni.request({url: 'https://www.example.com/request',  // 目标 URL 地址data: {text: 'uni.request'  // 请求发送的数据(可以是 GET 请求的查询参数,或 POST 请求的请求体)},header: {'custom-header': 'hello'  // 自定义请求头,向服务器发送附加的头部信息},success: (res) => {console.log(res.data);  // 请求成功时,打印服务器响应的数据this.text = 'request success';  // 更新组件的文本内容为 'request success'}
});
  • url:请求的目标地址。https://www.example.com/request 是一个示例 URL,表示请求发送到 https://www.example.com/request 这个接口。这个地址是服务器上公开的接口,uni.request 会向该地址发送 HTTP 请求。

  • data:请求中发送的数据。在这个例子中,data: { text: 'uni.request' } 表示发送一个包含字段 text 和值 'uni.request' 的对象。

    • 如果是 GET 请求,data 会被编码为查询字符串,如 ?text=uni.request
    • 如果是 POST 请求,data 会作为请求体发送。
  • header:请求头部信息。在这个例子中,设置了一个自定义请求头 'custom-header': 'hello',它将作为请求的一个头部传递给服务器。这通常用于身份验证、内容类型设置等场景。

  • success:这是请求成功后的回调函数。在请求成功并收到服务器响应后,会执行 success 函数。

    • res 是返回的响应对象,包含了服务器返回的数据。
    • console.log(res.data):打印服务器响应的数据,通常是 JSON 格式的数据。
    • this.text = 'request success':这行代码将组件的 text 属性更新为 'request success',通常会用于更新页面显示的内容(例如,页面上的文本会显示为 'request success')。

2、在文件结构中新建

3、请求工具封装

src/utils/api/api.js中:

// src/utils/api.jsconst baseURL = "http://localhost:8082/api";  // 确保你的基础 URL 正确// 请求封装函数
const request = (url, method = 'GET', data = {}) => {return new Promise((resolve, reject) => {uni.request({url: baseURL + url,method: method,data: data,success(res) {if (res.statusCode === 200) {resolve(res.data);  // 返回数据} else {reject(res);  // 如果不是 200,返回错误信息}},fail(err) {reject(err);  // 请求失败时}})});
};export { request };

4、请求工具封装优化(可选)

// src/utils/api.jsconst baseURL = "http://localhost:8082/api";  // 确保你的基础 URL 正确// 请求封装函数
const request = (url, method = 'GET', data = {}, showLoading = true) => {// 请求拦截器:可以在这里添加请求头、token等信息const token = uni.getStorageSync('token'); // 假设你存储了tokenconst headers = {'Authorization': token ? `Bearer ${token}` : '', // 如果有token,自动添加到请求头'Content-Type': 'application/json'  // 默认发送 JSON 格式的数据};// 在请求开始时,显示加载中(如果需要)if (showLoading) {uni.showLoading({title: '加载中...',mask: true});}return new Promise((resolve, reject) => {uni.request({url: baseURL + url,method: method,data: data,header: headers,  // 请求头success(res) {uni.hideLoading();  // 请求完成后关闭加载提示if (res.statusCode === 200) {resolve(res.data);  // 成功时返回数据} else {// 处理非 200 状态码的响应const errorMessage = res.data?.message || '请求失败';uni.showToast({title: errorMessage,icon: 'none'});reject(res);  // 返回错误信息}},fail(err) {uni.hideLoading();  // 请求失败时也关闭加载提示// 网络请求失败时的错误处理uni.showToast({title: '网络错误,请稍后再试',icon: 'none'});reject(err);  // 返回错误信息}});});
};export { request };

5、统一管理接口

src/utils/api/apiMethod.js中:

// src/utils/api/apiMethod.js
import { request } from '@/utils/api.js'; // 封装 getLunbo 请求
export const getLunbo = () => {return request('/getlunbo');
};// 封装 getGoods 请求
export const getGoods = () => {return request(`/getgoods?pageindex=${pageIndex}`);
};

6、页面中引入对应的请求函数

 二、点击跳转页面报错MiniProgramError{"errMsg":"navigateTo:fail timeout"}

	<div class="nav-item" @click="goToShoplist"><span class="iconfont icon-ziyuan"></span><span>商品列表</span></div>
const goToShoplist=()=> {// UniApp页面跳转uni.navigateTo({url: '/pages/shoplist/shoplist'  // 跳转到 shoplist 页面});
}

 绑定跳转事件后,点击报错:

这个问题通常是由于小程序页面栈已满导致的。uni.navigateTo 是用于跳转到一个非 tabBar 页面,如果页面栈已经有很多页面,可能会超时,因为小程序的页面栈有大小限制。

navigateTo:fail timeout 错误表明跳转超时,可能是因为页面栈已经很满,无法再添加新页面。以下是可能的解决方法:

const goToShoplist = () => {// 使用 uni.redirectTo 跳转,替换当前页面uni.redirectTo({url: '/pages/shoplist/shoplist'  // 跳转到 shoplist 页面});
};

如果你频繁进行页面跳转,可能需要通过 uni.reLaunchuni.redirectTo 来清理页面栈,避免栈过多造成超时。

三、滚动底部发请求和下拉刷新

 此模板用的 插件市场:全端通用的精美的商品列表 - DCloud 插件市场

本人根据需求略作修改 ,完整代码如下:

<template><view class="content"><scroll-view refresher-enabled@refresherrefresh="refresherrefresh":refresher-triggered="isTriggered"class="scroll-view" scroll-y="true" @scrolltolower="onReachBottom"style="height: 100vh;"><view class="t-goods-list" v-if="goodsList&&goodsList.length>0"  ><view class="t-goods-item" v-for="(item,index) in goodsList" :key="index" @click="clickItem(index)"><image class="t-goods-img" :src="item.goodsPic"></image><view class="t-goods-name"><text>{{item.goodsName}}</text></view><view class="t-goods-desc"><text>{{item.goodsDesc}}</text></view><view class="t-goods-tags" v-if="item.tags && item.tags.length>0"><view class="t-tag" v-for="(tag,idx) in item.tags" :key="idx":style="[tag.type === 'hot'?{'border-color':'#f499a8',color:'#d00a2b'}:{'border-color':'#999999',color:'#000000'},{'max-width': item.tags.length>1?'148rpx':'100%'}]"><text>{{tag.name}}</text></view></view><view class="t-goods-price"><text class="t-rmb">¥</text><text class="t-p1">{{item.goodsPrice}}</text><text class="t-p2">¥{{item.goodsOriginPrice}}</text></view><view class="t-rate"><view><text>{{item.rateNum}}人评价</text></view><view class="t-rate-percent"><text>{{item.ratePercent}}好评</text></view></view></view></view><view class="t-empty" v-else-if="isInit"><image src="/static/goods.png"></image><view class="t-empty-desc">没有商品哦~</view></view><view class="t-loading-more" v-if="isLoading || isNoMore && goodsList && goodsList.length>0"><image src="../../static/loading.png" v-if="isLoading"></image><view class="t-loading-desc" v-if="isLoading || isNoMore">{{isLoading?'加载中...':(isNoMore?'没有更多数据了':'')}}</view></view></scroll-view></view>
</template><script setup>
import { ref , reactive, onMounted } from 'vue';  // 引入 ref 和 onMounted
import { getLunbo , getGoods } from '@/utils/apiMethod.js';// 商品列表的数据状态
const goodsList = ref([]);
const newGoodsList = ref([]);
const pageNo = ref(1);
const pageSize = ref(10);
const isNoMore = ref(false);
const isLoading = ref(false);
const isInit = ref(false);
const isTriggered=ref(false)// 页面加载时获取商品数据
onMounted(() => {loadGoods();
});const refresherrefresh = () => {isTriggered.value = true;  // 表示下拉刷新触发console.log('拉拉拉');  // 打印日志// 重置页码为 1,准备重新加载数据pageNo.value = 1;loadGoods()setTimeout(()=>{isNoMore.value = false;  // 主动关闭加载更多的标志,表示可以继续加载更多isTriggered.value = false;  },1000)};// 页面滑动到底部加载更多数据
const onReachBottom = () => {if (isNoMore.value) return;console.log('原来的pageNo.value',pageNo.value);isLoading.value = true;setTimeout(async() => {pageNo.value += 1;console.log('新的pageNo.value',pageNo.value);const res = await getGoods(pageNo.value)console.log('请求商品数据',res.message);newGoodsList.value = res.message.map(item => {return {       goodsPic: item.img_url,  goodsName: item.title,goodsDesc: item.zhaiyao,tags: [{ name: '限时直降300元', type: 'hot' },{ name: '赠积分', type: 'default' }],goodsPrice: item.sell_price,goodsOriginPrice: item.sell_price,rateNum: 1068,ratePercent: '99%',};});console.log('newData',newGoodsList.value);goodsList.value = [...goodsList.value, ...newGoodsList.value];isLoading.value = false;if (res.message.length==0) {isNoMore.value = true;}}, 1500);
};// 页面初始化加载商品数据
const loadGoods = () => {isLoading.value = true;setTimeout(async() => {const res = await getGoods(pageNo.value)console.log('请求商品数据',res.message);goodsList.value  = res.message.map(item => {return {       goodsPic: item.img_url,  goodsName: item.title,goodsDesc: item.zhaiyao,tags: [{ name: '限时直降300元', type: 'hot' },{ name: '赠积分', type: 'default' }],goodsPrice: item.sell_price,goodsOriginPrice: item.sell_price,rateNum: 1068,ratePercent: '99%',};});console.log('处理后的商品列表',goodsList.value);isInit.value = true;isLoading.value = false;if (!goodsList.value || goodsList.value.length < pageSize.value) {isNoMore.value = true;}}, 1500);
};// 商品点击事件
const clickItem = (index) => {console.log("当前点击的商品下标是" + index);
};
</script><style lang="less" scoped>.content {box-sizing: border-box;min-width: 100vw;min-height: 100vh;background-color: #f2f3f5;padding-bottom: 80rpx;.t-goods-list {padding-top: 18rpx;box-sizing: border-box;width: 690rpx;margin: 0 auto;display: flex;flex-direction: row;justify-content: space-between;align-items: center;flex-wrap: wrap;.t-goods-item {box-sizing: border-box;width: 336rpx;height: 630rpx;background-color: #ffffff;border-radius: 20rpx;overflow: hidden;margin-bottom: 18rpx;position: relative;.t-goods-img {width: 100%;height: 340rpx;}.t-goods-name {font-size: 28rpx;color: #000000;line-height: 30rpx;-webkit-line-clamp: 2;display: -webkit-box;text-overflow: ellipsis;overflow: hidden;-webkit-box-orient: vertical;padding: 0rpx 18rpx;box-sizing: border-box;word-break: break-all;}.t-goods-desc {font-size: 24rpx;color: #9e9e9e;line-height: 26rpx;-webkit-line-clamp: 1;display: -webkit-box;text-overflow: ellipsis;overflow: hidden;-webkit-box-orient: vertical;padding: 0rpx 18rpx;box-sizing: border-box;margin-top: 16rpx;word-break: break-all;}.t-goods-tags {padding: 0rpx 18rpx;box-sizing: border-box;margin-top: 16rpx;.t-tag {font-size: 20rpx;border-radius: 4rpx;border: 1rpx solid;box-sizing: border-box;padding: 3rpx 5rpx;-webkit-line-clamp: 1;display: -webkit-box;text-overflow: ellipsis;overflow: hidden;-webkit-box-orient: vertical;float: left;word-break: break-all;&:not(:last-child) {margin-right: 8rpx;}}}.t-goods-price {padding: 0rpx 18rpx;box-sizing: border-box;display: flex;flex-direction: row;justify-content: flex-start;align-items: center;position: absolute;width: 100%;bottom: 70rpx;left: 0rpx;width: 100%;.t-rmb {font-size: 26rpx;color: #000000;}.t-p1 {font-size: 32rpx;color: #000000;margin-left: 4rpx;font-weight: bold;}.t-p2 {font-size: 20rpx;color: #999999;margin-left: 10rpx;text-decoration: line-through;}}.t-rate {padding: 0rpx 18rpx;box-sizing: border-box;display: flex;flex-direction: row;justify-content: flex-start;align-items: center;position: absolute;width: 100%;bottom: 30rpx;left: 0rpx;width: 100%;font-size: 20rpx;color: #999999;.t-rate-percent {margin-left: 8rpx;}}}}}.t-empty {width: 100%;height: 100%;background-color: #fff;display: flex;flex-direction: column;justify-content: center;align-items: center;image {width: 320rpx;height: 320rpx;}.t-empty-desc {padding-bottom: 30rpx;padding-top: 20rpx;font-size: 28rpx;color: #999999;}}.t-loading-more {box-sizing: border-box;display: flex;flex-direction: row;justify-content: center;align-items: center;width: 100%;height: 60rpx;image {width: 36rpx;height: 36rpx;-webkit-animation: spin 1s 0s step-end infinite;animation: spin 1s 0s step-end infinite;margin-right: 12rpx;}.t-loading-desc {font-size: 28rpx;color: #999999;}@-webkit-keyframes spin {0% {-webkit-transform: rotate(0deg);transform: rotate(0deg);}8% {-webkit-transform: rotate(30deg);transform: rotate(30deg);}16% {-webkit-transform: rotate(60deg);transform: rotate(60deg);}24% {-webkit-transform: rotate(90deg);transform: rotate(90deg);}32% {-webkit-transform: rotate(120deg);transform: rotate(120deg);}40% {-webkit-transform: rotate(150deg);transform: rotate(150deg);}48% {-webkit-transform: rotate(180deg);transform: rotate(180deg);}56% {-webkit-transform: rotate(210deg);transform: rotate(210deg);}64% {-webkit-transform: rotate(240deg);transform: rotate(240deg);}73% {-webkit-transform: rotate(270deg);transform: rotate(270deg);}82% {-webkit-transform: rotate(300deg);transform: rotate(300deg);}91% {-webkit-transform: rotate(330deg);transform: rotate(330deg);}100% {-webkit-transform: rotate(1turn);transform: rotate(1turn);}}@keyframes spin {0% {-webkit-transform: rotate(0deg);transform: rotate(0deg);}8% {-webkit-transform: rotate(30deg);transform: rotate(30deg);}16% {-webkit-transform: rotate(60deg);transform: rotate(60deg);}24% {-webkit-transform: rotate(90deg);transform: rotate(90deg);}32% {-webkit-transform: rotate(120deg);transform: rotate(120deg);}40% {-webkit-transform: rotate(150deg);transform: rotate(150deg);}48% {-webkit-transform: rotate(180deg);transform: rotate(180deg);}56% {-webkit-transform: rotate(210deg);transform: rotate(210deg);}64% {-webkit-transform: rotate(240deg);transform: rotate(240deg);}73% {-webkit-transform: rotate(270deg);transform: rotate(270deg);}82% {-webkit-transform: rotate(300deg);transform: rotate(300deg);}91% {-webkit-transform: rotate(330deg);transform: rotate(330deg);}100% {-webkit-transform: rotate(1turn);transform: rotate(1turn);}}}
</style>

 重点讲一下我添加的下拉刷新功能:

<scroll-view> 是一个可滚动的视图组件,可以容纳大量内容并允许在内容溢出时滚动查看。在 uni-app 中,<scroll-view> 组件支持下拉刷新和上拉加载等功能。 

属性与事件的解释:
  1. refresher-enabled:

    用途: 如果你希望在用户下拉时触发刷新事件,必须将这个属性设置为 true
  2. @refresherrefresh="refresherrefresh":

    用途: 当用户拉动屏幕时触发下拉刷新,你需要提供一个事件处理函数(例如 refresherrefresh)来处理刷新逻辑。
  3. :refresher-triggered="isTriggered":

    用途: 你可以通过 isTriggered 的值来控制刷新动画的显示与隐藏。一般情况下,当数据加载完成后,需要将 isTriggered 设置为 false,从而结束下拉刷新动画。

 设置refresherrefresh事件和isTriggered属性控制:

const isTriggered=ref(false)// 表示下拉动画
const refresherrefresh = () => {isTriggered.value = true;  // 表示下拉刷新触发console.log('拉拉拉');  // 打印日志// 重置页码为 1,准备重新加载数据pageNo.value = 1;loadGoods()setTimeout(()=>{isNoMore.value = false;  // 主动关闭加载更多的标志,表示可以继续加载更多isTriggered.value = false;  },1000)};

相关文章:

uni-app(HBuilderX)搭建小程序流程(请求封装,下拉刷新,底部加载等)

uni-app 是一个跨平台的前端框架&#xff0c;用于开发多端应用。uni-app 提供了一个统一的 API&#xff0c;允许开发者编写一次代码&#xff0c;最终部署到多个平台&#xff0c;极大地提高了开发效率。在编写小程序的时候和原生微信开发者工具语法略有区别。 目录 一、请求工具…...

【Super Tilemap Editor使用详解】(一):创建图块集

1、在场景中创建瓦片地图之前&#xff0c;我们需要先创建一个图块集供地图使用。 可以在“Project”面板中创建&#xff1a; 也可以在Assets“” 菜单中创建&#xff1a; 2、创建成功之后&#xff0c;“Atlas Texture”是空的&#xff0c;我们需要选择一个图集。 3、选中插件中…...

驱动---1.DAC8552实现三角波输出

最近开始进行新项目的研发&#xff0c;考虑用DAC做一个前级输出&#xff0c;选择了DAC8552这个器件的一个模块&#xff0c;用了野火的指南者做主控&#xff0c;芯片是STM32F103VET6&#xff0c;主频是72MHz。 一、器件手册重要信息提取 1.DAC8552具有十六位的分辨率、双通道输…...

PHP中GD库的使用

由于我要用到php的验证码 <?php session_start();// 生成验证码 $random_code substr(md5(uniqid(mt_rand(), true)), 0, 6);// 将验证码保存到 session 中 $_SESSION[captcha] $random_code;// 创建图片 $font 6; $image_width 100; $image_height 40;// 创建图像 $…...

【ChArUco Marker】标定板检测

目录 1.ChArUco介绍2.源码分析&#xff08;opencv 4.5.4&#xff09;3.ChAruco板创建&#xff08;opencv 4.5.4&#xff09;4.Charuco板检测&#xff08;opencv 4.5.4&#xff09;ChArUco检测源码&#xff08;不使用标定参数&#xff09; 5.ChArUco姿态估计&#xff08;opencv …...

Kafka | RabbitMQ | RocketMQ | ActiveMQ 的区别和入门案例

springboot&#xff0c;vue&#xff0c;springcloudalibaba课程视频&#xff0c;有需要可以看看 <!-- springboot&#xff0c;springboot整合redis&#xff0c;整合rocketmq视频&#xff1a; --> https://www.bilibili.com/video/BV1nkmRYSErk/?vd_source14d27ec13a473…...

TensorBoard

1、TensorFlow的TensorBoard TensorBoard是TensorFlow的一个组件&#xff0c;它提供了一个交互式的界面&#xff0c;用于可视化TensorFlow程序的训练过程和模型结构。 使用TensorBoard&#xff0c;你可以&#xff1a; 可视化训练过程中的各种指标&#xff0c;如损失函数、准…...

C# 中的异步编程:提升应用程序响应性和性能

C#中的异步编程&#xff08;Asynchronous Programming&#xff09;。异步编程是现代应用程序开发中非常重要的一个方面&#xff0c;它允许程序在等待长时间运行的操作&#xff08;如I/O操作、网络请求等&#xff09;时继续执行其他任务&#xff0c;从而提高应用程序的响应性和性…...

前端框架 React 与 Vue3对比 —— 技术选型

在进行前端框架React与Vue3的技术选型对比时&#xff0c;我们可以从以下几个方面进行综合考虑&#xff1a; 1. 性能比较 • Vue3 通过 Vite 打包工具实现了快速的开发和构建&#xff0c;同时使用了响应式系统和 Proxy 技术来提高数据响应速度。在大部分测试用例中&#xff0c;…...

虚拟机与Xshell5和Xftp4连接与虚拟机克隆

虚拟机与Xshell5和Xftp4连接与虚拟机克隆 虚拟机与Xshell5和Xftp4连接 虚拟机与Xshell5连接 下载Xshell5后启动出现如下界面&#xff0c;点击新建 新建会话输入虚拟机命名&#xff0c;如master&#xff0c;主机输入虚拟机IP&#xff0c;xxx.xxx.xxx.xxx然后确认&#xff0c;…...

华为USG系列防火墙 RESTCONF NAT配置 Python实现

目录 前言 文档下载 开启RESTCONF接口 Python 实现SNAT增删改查 查看nat映射列表 查看私网地址池 查看源地址池&#xff08;公网&#xff09; 查看nat映射规则 创建nat映射规则 创建私网地址池 创建源地址池 创建nat映射规则 修改NAT映射规则 删除NAT映射规则 …...

qemu安装arm64架构银河麒麟

qemu虚拟化软件&#xff0c;可以在一个平台上模拟另一个硬件平台&#xff0c;可以支持多种处理器架构。 一、安装 安装教程&#xff1a;https://blog.csdn.net/qq_36035382/article/details/125308044 下载链接&#xff1a;https://qemu.weilnetz.de/w64/2024/ 我下载的是 …...

深入解析 Spring 框架:核心特性与应用价值

1.什么是spring? Spring 是一个开源的 Java 应用框架&#xff0c;由 Pivotal Software 提供支持。它为开发基于 Java 的企业级应用提供了一整套基础设施支持。Spring 框架的核心功能是依赖注入&#xff08;Dependency Injection, DI&#xff09;&#xff0c;它帮助开发者实现…...

protobuf 报文编解码工具

QT实现的 protobuf 反序列化 & 序列化工具&#xff0c;版本号V1.2 下载链接&#xff1a;protobuf报文编解码工具资源-CSDN文库 源码github&#xff1a;ProtobufTool 使用说明: 1. 点击“加载proto文件”按钮&#xff0c;从本地选择 .proto文件 2. 选择消息名称&#xff…...

Milvus向量数据库06-RAG检索增强

Milvus向量数据库06-RAG检索增强 文章目录 Milvus向量数据库06-RAG检索增强1-学习目标2-参考网址3-执行过程记录1-到底什么是RAGRAG 的基本流程&#xff1a;为什么 RAG 优于传统的基于检索的方法&#xff1a;示例流程&#xff1a; 2-RAG和Elasticsearch对比3-RAG和向量数据库之…...

Unity3D下采集camera场景并推送RTMP服务实现毫秒级延迟直播

技术背景 好多开发者&#xff0c;希望我们能够分享下如何实现Unity下的camera场景采集并推送rtmp服务&#xff0c;然后低延迟播放出来。简单来说&#xff0c;在Unity 中实现采集 Camera 场景并推送RTMP的话&#xff0c;先是获取 Camera 场景数据&#xff0c;通过创建 RenderTe…...

标记数据集生成模型助力无数据情况下的大模型指令微调

在构建大模型应用时&#xff0c;通常有两种方式来改进效果&#xff0c;一种是构建外部知识库&#xff0c;利用RAG来完成。但RAG并不是万能的&#xff0c;对于特定领域的LLM应用&#xff0c;以及无需示例&#xff0c;就能完成特定任务等场合就需要进行微调。然而&#xff0c;微调…...

第六届地博会世界酒中国菜助力广州龙美地标美食公司推动地标发展

第六届知交会暨地博会&#xff1a;世界酒中国菜助力广州龙美地标美食公司推动地标产品创新发展 2024年12月9日至11日&#xff0c;第六届粤港澳大湾区知识产权交易博览会暨国际地理标志产品交易博览会在中新广州知识城盛大启幕。本届盛会吸引了全球众多知识产权领域的专业人士和…...

vue响应式原理

对于响应式原理&#xff0c;我们先了解vue是一个MVVM结构的框架&#xff1b;也就是数据层、视图层、数据-视图层&#xff1b;响应式的原理就是实现当数据更新时&#xff0c;视图层也要相应的更新&#xff0c;基于响应式原理我们可以使数据驱动视图的实现变得简单而高效 一、响…...

SwiftUI 列表(或 Form)子项中的 Picker 引起导航无法跳转的原因及解决

概述 在 SwiftUI 的界面布局中&#xff0c;列表&#xff08;List&#xff09;和 Form 是我们秃头码农们司空见惯的选择。不过大家是否知道&#xff1a;如果将 Picker 之类的视图嵌入到列表或 Form 的子项中会导致导航操作无法被触发。 从上图可以看到&#xff1a;当在 List 的…...

使用Allure作为测试报告生成器(Java+Selenium)

背景 JAVA项目中原先用Jenkinsseleniumselenium grid来日常测试UI并记录。 问题 当某一个testSuite失败时&#xff0c;当需要确认UI regression issue还是selenium test case自身的问题&#xff0c;需要去jenkins中查log&#xff0c;一般得到的是“Can not find element xxx…...

【论文阅读】处理器芯片敏捷设计方法:问题与挑战

作者&#xff1a;包云岗老师 包云岗老师是计算机体系结构方向的大牛&#xff0c;推动了体系结构方面的开源事业! 欢迎对本栏目感兴趣的人学习"一生一芯"~ 学习体会&#xff1a; 已有的软硬件生态系统和开发成本制约了对新结构的探索。但目前仍在几种路线上做尝试~ 1…...

系统内核自动处理 TCP 连接(自动发送 RST 数据包来重置连接)

使用原始套接字发送了一个 SYN 数据包后&#xff0c;对方发送了 SYN,ACK 数据包&#xff0c;但系统仍然会自动发送 RST 数据包。这通常是因为操作系统内核在处理 TCP 连接时的行为。 原因分析 内核处理 TCP 连接&#xff1a; 即使你使用了原始套接字来发送和接收数据包&#x…...

VLDB 2024 | 时空数据(Spatial-temporal)论文总结

VLDB 2024于2024年8月26号-8月30号在中国广州举行。 本文总结了VLDB 2024有关时空数据&#xff08;time series data&#xff09;的相关论文&#xff0c;主要包含如有疏漏&#xff0c;欢迎大家补充。 &#x1f31f;【紧跟前沿】“时空探索之旅”与你一起探索时空奥秘&#xf…...

以ATTCK为例构建网络安全知识图

ATT&CK&#xff08;Adversarial Tactics, Techniques, and Common Knowledge &#xff09;是一个攻击行为知识库和模型&#xff0c;主要应用于评估攻防能力覆盖、APT情报分析、威胁狩猎及攻击模拟等领域。本文简单介绍ATT&CK相关的背景概念&#xff0c;并探讨通过ATT&a…...

Qt初识_对象树

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Qt初识_对象树 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 什么是对象树 为什么要引…...

规范秩相关信息搜集Day2

系列博客目录 文章目录 系列博客目录1.A Survey on Tensor Techniques and Applications in Machine Learning2.有没有研究低秩矩阵有利于分类的计算机方面的论文呢3.Image classification based on low-rank matrix recovery and Naive Bayes collaborative representatio 基于…...

【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2024年最新的方法,实测有效)

文章目录 前言一、前置条件1、已安装Visual Studio Code&#xff0c;并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号]&#xff0c;2、在Visual Studio Code扩展中搜索Unity&#xff0c;并安装3、同时注意这个插件下面的描述&#xff0c;需要根…...

交换瓶子(图论 贪心)

1224. 交换瓶子 - AcWing题库 把每一个瓶子看成一个点&#xff0c;从每个瓶子向他应该在的那个位置的瓶子连一条边 通过这个方式&#xff0c;我们就可以连出n条边 观察可以发现这些图有特点&#xff1a; n个点 连成n条边 因为每个点会指向它应该在的位置的那个点&#xff…...

汽车升级到底应不应该设置“可取消“功能

最近&#xff0c;汽车OTA&#xff08;Over-the-Air&#xff09;升级频频成为车主讨论的热点。有些车主反映&#xff0c;一些升级增加了实用功能&#xff0c;而另一些却让体验变得复杂甚至带来不便。于是&#xff0c;大家不禁发问&#xff1a;汽车升级功能究竟应不应该允许“可取…...

Mac电脑钓鱼到拿下核心权限

目录 一. 前言 二. PKG后门制作阶段 2.1 环境准备 2.2 制作过程 2.3 成功上线 三 . 浏览器密码抓取 四. 权限维持 1. 手动权限维持 2. MSF自动化维持 五. 参考文章 一. 前言 攻防对抗强度和难度日益演进,传统的渗透测试思路成本逐渐提高,钓鱼已经成为当下攻击者最常…...

Docker多架构镜像构建踩坑记

背景 公司为了做信创项目的亮点&#xff0c;需要将现有的一套在X86上运行的应用系统迁移到ARM服务器上运行&#xff0c;整个项目通过后端Java&#xff0c;前端VUEJS开发通过CICD做成Docker镜像在K8S里面运行。但是当前的CICD产品不支持ARM的镜像构建&#xff0c;于是只能手工构…...

docker 架构详解

Docker架构是基于客户端-服务器&#xff08;C/S&#xff09;模式的&#xff0c;包含多个关键组件&#xff0c;以确保容器化应用的高效构建、管理和运行。以下是对Docker架构的详细解析&#xff1a; Docker 架构概述 Docker 架构采用客户端-服务器&#xff08;C/S&#xff09;…...

05-标准库开发-STM32-IIC协议

七、STM32中IIC协议 概述 Inter-Integrated Circuit (IIC)&#xff0c;也常称为I2C&#xff08;I squared C&#xff09;&#xff0c;是一种同步、串行、半双工通信总线协议。它主要用于连接低速外围设备到处理器或微控制器上&#xff0c;如MPU6050姿态传感器、OLED显示屏、存…...

vue 封装全局过滤器

1.找到utils下创建fifilter.js 一些常用的过滤方法 export const filters {//url解码urlCode: value > {if (!value) return let v decodeURIComponent(value)let bigIndex v.lastIndexOf(/)let endIndex v.lastIndexOf(.)let url v.substring(bigIndex 1, endIndex)…...

【PlantUML系列】流程图(四)

目录 目录 一、基础用法 1.1 开始和结束 1.2 操作步骤 1.3 条件判断 1.4 并行处理 1.5 循环 1.6 分区 1.7 泳道 一、基础用法 1.1 开始和结束 开始一般使用start关键字&#xff1b;结束一般使用stop/end关键字。基础用法包括&#xff1a; start ... stopstart ...…...

MATLAB中的合并分类数组

目录 创建分类数组 串联分类数组 创建具有不同类别的分类数组 串联具有不同类别的数组 分类数组的并集 此示例演示了如何合并两个分类数组。 创建分类数组 创建分类数组 A&#xff0c;其中包含教室 A 中的 25 个学生的首选午餐饮料。 rng(default) A randi(3,[25,1]); …...

流编辑器sed(stream editor)

一.sed简介 sed是一种流编辑器&#xff0c;处理时&#xff0c;把当前处理的行存储在临时缓冲区中&#xff0c;称为模式空间&#xff0c;接着用sed命令处 理缓冲区中的内容&#xff0c;处理完成后&#xff0c;把缓冲区的内容送往屏幕。接着处理下一行&#xff0c;这样不断重复&…...

R语言的数据结构--矩阵

【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言医学数据分析实践-R语言的数据结构-CSDN博客 矩阵是一个二维数组&#xff0c;矩阵中的元素都具有相…...

使用 Python 爬取某网站简历模板(bs4/lxml+协程)

使用 Python 爬取站长素材简历模板 简介 在本教程中&#xff0c;我们将学习如何使用 Python 来爬取站长素材网站上的简历模板。我们将使用requests和BeautifulSoup库来发送 HTTP 请求和解析 HTML 页面。本教程将分为两个部分&#xff1a;第一部分是使用BeautifulSoup的方法&am…...

19 go语言(golang) - 通过反射手动实现json序列化

一、json 在 Go 语言中&#xff0c;JSON 序列化和反序列化通常通过标准库 encoding/json 来实现。这个包提供了简单易用的接口来将 Go 数据结构转换为 JSON 格式字符串&#xff08;序列化&#xff09;&#xff0c;以及从 JSON 字符串解析出 Go 数据结构&#xff08;反序列化&a…...

Scala:隐式转换

隐式转换的定义 //隐式转换&#xff1a;编译器自动滴&#xff0c;偷偷滴&#xff0c;把数据A->B object test04 {def main(args: Array[String]): Unit {val i:Int1//把Int类型&#xff0c;转化成Double类型//Int -> Double//隐式转换失败val b:Double1//隐式转换失败v…...

UVM之寄存器模型生成

1.采用python脚本生成寄存器模型 首先用excel表格做好寄存器描述 然后编写脚本生成.ralf文件 &#xff08;1&#xff09;首先通过openpyxl读取EXCEL表格&#xff0c; workbook openpyxl.load_workbook(reg.xlsx) # 返回一个workbook数据类型的值 &#xff08;2&#xff…...

PL/SQL批量生成数据

在PL/SQL中生成大量模拟数据&#xff0c;特别是当你需要生成大量记录&#xff08;如1亿条&#xff09;时&#xff0c;有几种常见的方式可以提高生成数据的效率和性能。以下是一些常用的方法和最佳实践&#xff1a; 1. 使用PL/SQL块批量生成数据 PL/SQL块可以通过循环生成大量…...

Xcode模拟器运行报错:The request was denied by service delegate

Xcode模拟器运行报错&#xff1a;The request was denied by service delegate 造成的原因: &#xff08;1&#xff09;新的苹果M系列芯片的Mac电脑 &#xff08;2&#xff09;此电脑首次安装启动Xcode的应用程序 &#xff08;3&#xff09;此电脑未安装Rosetta 2 解决方法: …...

2024小迪安全基础入门第十课

目录 一、传输格式&数据-类型&编码&算法 1. 传输格式&#xff1a; 2. 传输数据&#xff1a; 3. 影响与渗透测试&#xff1a; #传输格式 #传输数据 二、密码存储&混淆-不可逆&非对称性 1. 密码存储&#xff1a; 2. 密码存储的影响&#xff1a; 3.…...

Redisson分布式限流器

Redisson分布式限流器 一、使用1.1、方法1.2、示例 二、原理2.1、设置限流器2.2、获取令牌 三、总结 最近有需求在做分布式限流&#xff0c;调研的限流框架大概有&#xff1a; 1、spring cloud gateway集成redis限流,但属于网关层限流 2、阿里Sentinel,功能强大、带监控平台 …...

xvisor调试记录

Xvisor是一种开源hypervisor,旨在提供完整、轻量、移植且灵活的虚拟化解决方案,属于type-1类型的虚拟机,可以直接在裸机上启动。 启动xvisor步骤: 1、搭建riscv编译环境 首先从github上下载riscv-gnu-toolchain很费劲,建议直接从国内的源下载 git clone https://gitee…...

Android问题记录 - Inconsistent JVM-target compatibility detected for tasks

文章目录 前言开发环境问题描述问题分析解决方案补充内容最后 前言 前段时间升级Android Studio后修复了一堆问题&#xff0c;详情请看&#xff1a;Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0&#xff08;持续更新&#xff09;。我以为问题已经全部解决了…...

【Python系列】使用 `psycopg2` 连接 PostgreSQL 数据库

???欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…...