Blazor入门100天 : 自做一个支持长按事件的按钮组件
好长时间没继续写这个系列博客了, 不知道大家还记得我吗? 话不多说,直接开撸.
1. 新建 net8 blazor 工程 b19LongPressButton
至于用什么模式大家各取所需, 我创建的是ssr单工程, App.razor 里面改一下, 加入 @rendermode="RenderMode.InteractiveServer" 这句话, 默认使用ssr模式渲染.
<Routes @rendermode="RenderMode.InteractiveServer" />
2. Components\Pages 下新建组件 LongPressButton.razor
@inherits ComponentBase
<div @onclick="onClick" @oncontextmenu="onContextMenu" @ontouchstart="OnTouchStart" @ontouchend="OnTouchEnd">
@ChildContent
</div>
@code {
[Inject]
private IJSRuntime? JS { get; set; }
[Parameter]
public RenderFragment? ChildContent { get; set; }
bool IsEdit { get; set; } = false;
private Task ValueChangedOnConfirm()
{
IsEdit = false;
return Task.CompletedTask;
}
/// <summary>
/// 获得/设置 启用长按
/// </summary>
[Parameter]
public bool LongPress { get; set; } = true;
/// <summary>
/// 获得/设置 ContextMenu 菜单项回调委托
/// </summary>
[Parameter]
public Func<MouseEventArgs, Task>? OnContextMenu { get; set; }
/// <summary>
/// 获得/设置 长按回调委托, 如果启用长按并且不是触摸设备,则回落到 Click 点击时触发
/// </summary>
[Parameter]
public Func<MouseEventArgs, Task>? OnLongPress { get; set; }
/// <summary>
/// 获得/设置 Click 回调委托
/// </summary>
[Parameter]
public Func<MouseEventArgs, Task>? OnClick { get; set; }
/// <summary>
/// 获得/设置 长按延时
/// </summary>
[Parameter]
public int OnTouchTime { get; set; } = 500;
/// <summary>
/// ContextMenu 菜单项点击时触发
/// </summary>
/// <returns></returns>
Task onContextMenu(MouseEventArgs args)
{
if (OnContextMenu != null)
{
return OnContextMenu.Invoke(args);
}
else
{
return Task.CompletedTask;
}
}
/// <summary>
/// 点击时触发
/// </summary>
/// <returns></returns>
Task onClick(MouseEventArgs args)
{
if (OnClick != null)
{
return OnClick.Invoke(args);
}
else if (OnLongPress != null && !IsTouchDevice)
{
return OnLongPress.Invoke(args);
}
else
{
return Task.CompletedTask;
}
}
/// <summary>
/// 是否触摸设备
/// </summary>
private bool IsTouchDevice { get; set; }
/// <summary>
/// 是否触摸
/// </summary>
private bool TouchStart { get; set; }
/// <summary>
/// 触摸定时器工作指示
/// </summary>
private bool IsBusy { get; set; }
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
IsTouchDevice = await JS!.InvokeAsync<bool>("eval", $"'ontouchstart' in document.documentElement");
}
}
private async Task OnTouchStart(TouchEventArgs e)
{
if (!IsBusy)
{
IsBusy = true;
TouchStart = true;
// 延时保持 TouchStart 状态
await Task.Delay(OnTouchTime);
if (TouchStart)
{
var args = new MouseEventArgs()
{
ClientX = e.Touches[0].ClientX,
ClientY = e.Touches[0].ClientY,
ScreenX = e.Touches[0].ScreenX,
ScreenY = e.Touches[0].ScreenY,
Type = "LongPress"
};
// 弹出关联菜单
if (OnContextMenu != null)
await OnContextMenu(args);
if (OnLongPress != null)
await OnLongPress(args);
//延时防止重复激活菜单功能
await Task.Delay(OnTouchTime);
}
IsBusy = false;
}
}
private void OnTouchEnd()
{
TouchStart = false;
}
}
3. 回到首页 Home.razor 添加组件测试
@page "/"
<PageTitle>Home</PageTitle>
<LongPressButton OnLongPress="TaskOnLongPress" >
<div style="width:200px;height:100px;background-color:gold;">
<p>LongPressButton</p>
</div>
</LongPressButton>
<p>@message</p>
@code {
string message = "No long press";
private Task TaskOnLongPress(MouseEventArgs e)
{
message = e.Type;
StateHasChanged();
return Task.CompletedTask;
}
}
4. 测试

运行程序

普通浏览器模式, 不支持触摸,会自动会落到点击事件, 点击显示为 Click

F12打开开发者工具, 点击模拟手机/平板, 需要F5刷新页面重新读取是否为触摸设备, 点击无反应, 长按显示为


Blazor入门100天 : 自做一个支持长按事件的按钮组件的更多相关文章
- uwp - 做一个相对炫酷的动画按钮/按钮动画
原文:uwp - 做一个相对炫酷的动画按钮/按钮动画 看腻了系统自带的button animation何不尝试下自定义一个较为炫酷的动画顺便提升用户体验.效果图: 动画分为几个部分,分别是:内圆从中心 ...
- 【 D3.js 入门系列 --- 3 】 做一个简单的图表!
前面说了几节,都是对文字进行处理,这一节中将用 D3.js 做一个简单的柱形图. 做柱形图有很多种方法,比如用 HTML 的 div 标签,或用 svg . 推荐用 SVG 来做各种图形.SVG 意为 ...
- 【 D3.js 入门系列 — 3 】 做一个简单的图表!
图1. 柱形图 1. 柱形图 前几章的例子,都是对文字进行处理.本章中将用 D3 做一个简单的柱形图.制作柱形图有很多种方法,比如用 HTML 的 <div> 标签,或在 SVG 上绘制 ...
- VUE2.0+VUE-Router做一个图片上传预览的组件
之前发了一篇关于自己看待前端组件化的文章,但是由于学习和实践的业务逻辑差异,所以自己练习的一些demo逻辑比较简单,打算用vue重构现在公司做的项目,所以在一些小的功能页面上使用vue来做的,现在写的 ...
- 做一个开源的小程序登录模块组件(token)
先了解下SSO 对于单点登陆浅显一点的说就是两种,一种web端的基于Cookie.另一种是跨端的基于Token,一般想要做的都优先做Token吧,个人建议,因为后期扩展也方便哦. 小程序也是呢,做成t ...
- Linux从入门到放弃(为做一个开发+运维的全能性人才而奋斗)
Linux?听说是一个操作系统,好用吗?” “我也不知道呀,和windows有什么区别?我能在Linux上玩LOL吗” “别提了,我用过Linux,就是黑乎乎一个屏幕,鼠标也不能用,不停地的敲键盘,手 ...
- Blazor入门100天 : 身份验证和授权 (2) - 角色/组件/特性/过程逻辑
目录 建立默认带身份验证 Blazor 程序 `角色/组件/特性/过程逻辑 DB 改 Sqlite 将自定义字段添加到用户表 脚手架拉取IDS文件,本地化资源 freesql 生成实体类,freesq ...
- Blazor入门100天 : 身份验证和授权 (6) - 使用 FreeSql orm 管理ids数据
目录 建立默认带身份验证 Blazor 程序 角色/组件/特性/过程逻辑 DB 改 Sqlite 将自定义字段添加到用户表 脚手架拉取IDS文件,本地化资源 freesql 生成实体类,freesql ...
- 用border做一个移动端常见的返回按钮
第一步 .hs1{ float: left; .mt(.25rem); .ml(.12rem); width: .3rem; height: .3rem; border-top: 2px solid ...
- ASP.NET 工作流:支持长时间运行操作的 Web 应用程序
ASP.NET 工作流 支持长时间运行操作的 Web 应用程序 Michael Kennedy 代码下载位置:MSDN 代码库 在线浏览代码 本文将介绍以下内容: 独立于进程的工作流 同步和异步活 ...
随机推荐
- 微服务下使用maven做多环境配置
分享技术,用心生活 前言:很多项目在开发,提测,上线时都会提前手动改一些配置文件来适应对应环境,麻烦不说了,而且也容易出错:生产环境的配置也容易暴露.基于此,我们基于spring cloud alib ...
- Python+Flask接口实现简单的ToKen功能
话不多说,上代码 from flask import request, jsonify from functools import wraps class TokenRequired: @classm ...
- 微服务架构|go-zero 的自适应熔断器
原文链接: go-zero 的自适应熔断器 上篇文章我们介绍了微服务的限流,详细分析了计数器限流和令牌桶限流算法,这篇文章来说说熔断. 熔断和限流还不太一样,限流是控制请求速率,只要还能承受,那么都会 ...
- 当开源项目 Issue 遇到了 DevChat
目录 1. 概述 2. Bug 分析与复现 3. Bug 定位与修复 4. 代码测试 5. 文档更新 6. 提交 Commit 7. 总结 1. 概述 没错,又有人给 GoPool 项目提 issue ...
- Dockcer上传hub和配置国内镜像源
Dockcer上传hub和配置国内镜像源 1.Dockcer上传hub 要将本地的Docker镜像上传到Docker镜像仓库,可以按照以下步骤操作: linux环境 1.创建用户 首先,确保你已经在D ...
- qiankun微前端实践
为什么要使用微前端 微前端架构具备以下几个核心价值: 技术栈无关 主框架不限制接入应用的技术栈,微应用具备完全自主权 独立开发.独立部署 微应用仓库独立,前后端可独立开发,部署完成后主框架自动完成同步 ...
- docker bridge网络类型研究
bridge模式是docker的默认网络模式,使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能.可以使用iptables -t nat -vnL ...
- Python并发编程——paramiko远程控制的模块、病毒攻击原理、dll注入、
文章目录 paramiko模块 作业 攻击原理解析 一.什么是dll 二.为何要有dll 什么是dll注入: 什么时候需要dll注入 dll注入的方法 使用SetWindowsHookEx函数对应用程 ...
- Python面向对象——property装饰器、继承(与python2不同点)、多继承(优缺点、Mixins)、属性查找、多继承带来的菱形问题
文章目录 内容回顾 property装饰器 继承 与python2的差别 多继承 为何要用继承 如何实现继承 属性查找 多继承带来的菱形问题 总结: 作业 内容回顾 1.封装=>整合 人的对象. ...
- 栈和堆的区别、FreeRTOS 中的任务栈
栈和堆的区别.FreeRTOS 中的任务栈 01 堆和栈的概念 堆 功能 堆是一块用于动态分配内存的区域,用于存储程序运行时动态创建的对象.堆的大小可以在程序运行时动态调整. 特点 堆的分配和释放是由 ...