封装一个可以左右滑动的Blazor组件
为什么要封装组件
最近写MAUI Blazor的时候,总是苦于对移动端没有什么好的支持,没有一个能左右滑动的tab切换组件。
既然没有,那就自己封装一个。
简单了解轮播图、tab切换的库之后,决定使用根据Swiper来封装。
Swiper是js的插件,所以需要js与.NET互操作,有以下两点
- 当js中的索引变化时,调用.NET方法改变Blazor中的索引;
- 当Blazor中的索引变化时,调用js方法改变js中的索引。
准备工作
下载Swiper,一个js文件和一个css文件,swiper-bundle.min.js
,swiper-bundle.min.css
。
最好用7的版本,8的版本会有一些兼容问题。
将文件引入index.html
Blazor部分
如官网所示,swiper的结构如下
<div class="swiper">
<div class="swiper-wrapper">
<div class="swiper-slide">slider1</div>
<div class="swiper-slide">slider2</div>
<div class="swiper-slide">slider3</div>
</div>
</div>
所以我们的组件分为两部分,一个外壳,一个是可重复的内容。
分别命名为SwiperTabItems.razor
和SwiperTabItem.razor
SwiperTabItems.razor
@inject IJSRuntime JSRuntime
<div class="@("swiper " + Id)">
<div class="swiper-wrapper">
@ChildContent
</div>
</div>
@code{
[Parameter]
public int Value
{
get => _value;
set
{
if (_value != value)
{
_value = value;
if(AfterFirstRender)
{
UpdateSwiper(value);
}
}
}
}
[Parameter]
public EventCallback<int> ValueChanged { get; set; }
[Parameter]
public RenderFragment? ChildContent { get; set; }
private int _value = 0;
private bool AfterFirstRender;
private string Id = "swiper" + Guid.NewGuid().ToString();
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender && ChildContent is not null)
{
var dotNetCallbackRef = DotNetObjectReference.Create(this);
await JSRuntime!.InvokeVoidAsync("swiperInit", new object[4] { dotNetCallbackRef, "UpdateValue", Id, Value });
AfterFirstRender = true;
}
}
private async void UpdateSwiper(int value)
{
await JSRuntime!.InvokeVoidAsync($"{Id}.slideTo", new object[1] { value });
}
[JSInvokable]
public async Task UpdateValue(int value)
{
_value = value;
if (ValueChanged.HasDelegate)
{
await ValueChanged.InvokeAsync(value);
}
StateHasChanged();
}
public async void Dispose()
{
await JSRuntime!.InvokeVoidAsync($"{Id}.destroy", new object[2] { true, true });
}
}
SwiperTabItem.razor
<div class="swiper-slide">
@ChildContent
</div>
@code {
[Parameter]
public RenderFragment? ChildContent { get; set; }
}
注:
1.id使用guid是为了如果存在多个组件,js的实例化不会重复
2.OnAfterRenderAsync是blazor的一个生命周期,位于渲染之后,将swiper的初始化实例放在这个位置才能正确初始化。firstRender 代表第一次渲染。
js部分
如swiper官网所示,需要初始化实例
<script>
var mySwiper = new Swiper('.swiper', {
autoplay: true,//可选选项,自动滑动
})
</script>
所以我们需要写一个init-swiper.js
文件,包含初始化实例的函数,以供Blazor的调用
init-swiper.js
function swiperInit(dotNetCallbackRef, callbackMethod,id,index) {
console.log('Entered initSwiper!');
let className = "." + id;
window[id] = new Swiper(className, {
observer: true,
observeParents: true,
observeSlideChildren: true,
autoHeight: true,
initialSlide: index,
on: {
slideChangeTransitionStart: function () {
dotNetCallbackRef.invokeMethodAsync(callbackMethod, this.activeIndex);
//alert(this.activeIndex);//切换结束时,告诉我现在是第几个slide
},
}
});
}
将init-swiper.js
引入index.html
使用
<SwiperTabItems @bind-Value="tabs">
<SwiperTabItem>
你的内容1
</SwiperTabItem>
<SwiperTabItem>
你的内容2
</SwiperTabItem>
<SwiperTabItem>
你的内容3
</SwiperTabItem>
</SwiperTabItems>
演示
这个封装的比较简单,如果需要更多的属性,可以看看swiper的文档
封装一个可以左右滑动的Blazor组件的更多相关文章
- 封装一个优雅的element ui表格组件
现在做后台系统用vue + elementUI 的越来越多,那element ui的 el-table 组件肯定也离不开.虽然element ui的table组件很好.但是表格和分页是分离的.每次写表 ...
- 使用vue.js封装一个包含图片的跑马灯组件
初衷: 学习完Vuejs后,来准备练习仿写一下老东家的门户页面,主要是为了熟悉一下常用插件的使用,比如video.js,wow.js,swiper等等:而其中涉及到一个包含图片跑马灯组件,大概长这样( ...
- Vue 2.x折腾记 - (17) 基于Ant Design Vue 封装一个配置式的表单组件
前言 写了个类似上篇搜索的封装,但是要考虑的东西更多. 具体业务比展示的代码要复杂,篇幅太长就不引入了. 效果图 2019-04-25 添加了下拉多选的渲染,并搜索默认过滤文本而非值 简化了渲染的子组 ...
- 小程序封装一个有输入框的modal层组件
其实很简单,就是在modal中添加新的 input <view> <modal class="modal" wx:if="{{!hiddenModal} ...
- Blazor组件自做五 : 使用JS隔离封装Google地图
Blazor组件自做五: 使用JS隔离封装Google地图 运行截图 演示地址 正式开始 1. 谷歌地图API 谷歌开发文档 开始学习 Maps JavaScript API 的最简单方法是查看一个简 ...
- Blazor组件自做六 : 使用JS隔离封装Baidu地图
1. 运行截图 演示地址 2. 在文件夹wwwroot/lib,添加baidu子文件夹,添加baidumap.js文件 2.1 跟上一篇类似,用代码方式异步加载API,脚本生成新的 body > ...
- Blazor组件自做一 : 使用JS隔离封装viewerjs库
Viewer.js库是一个实用的js库,用于图片浏览,放大缩小翻转幻灯片播放等实用操作 本文相关参考链接 JavaScript 模块中的 JavaScript 隔离 Viewer.js工程 Blazo ...
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
Go/Python/Erlang编程语言对比分析及示例 本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...
- Blazor组件自做八 : 使用JS隔离封装屏幕键盘kioskboard.js组件
1. 运行截图 演示地址 2. 在文件夹wwwroot/lib,添加kioskboard子文件夹,添加kioskboards.js文件 2.1 常规操作,懒加载js库, export function ...
- Blazor组件自做三 : 使用JS隔离封装ZXing扫码
Blazor组件自做三 : 使用JS隔离封装ZXing扫码 本文基础步骤参考前两篇文章 Blazor组件自做一 : 使用JS隔离封装viewerjs库 Blazor组件自做二 : 使用JS隔离制作手写 ...
随机推荐
- JS执行机制--同步与异步
单线程JavaScript语言具有单线程的特点,同一个时间只能做一件事情.这是因为JavaScript脚本语言是为了处理页面中用户的交互,以及操作DOM而诞生的.如果对某个DOM元素进行添加和删除,不 ...
- 谁想和我一起做低代码平台!一个可以提升技术,让简历装x的项目
序言 正如文章标题所述,最近一段时间低代码这个概念非常的火,但其实在不了解这个东西的时候觉得它真的很炫酷,从那时就萌生了做一个低代码平台的想法. 但随着时间的变化,现在市面上低代码各个业务方向的平台都 ...
- 跑在笔记本里的大语言模型 - GPT4All
何为GPT4All GPT4All 官网给自己的定义是:一款免费使用.本地运行.隐私感知的聊天机器人,无需GPU或互联网. 从官网可以得知其主要特点是: 本地运行(可包装成自主知识产权) 无需GPU( ...
- selenium web控件的交互进阶
Action ActionChains: 执行PC端的鼠标点击,双击,右键,拖曳等事件 TouchActions: 模拟PC和移动端的点击,滑动,拖曳,多点触控等多种手势操作 动作链接 ActionC ...
- Golang常用语法糖
1.名字由来 语法糖(Syntactic sugar)的概念是由英国计算机科学家彼得·兰丁提出的,用于表示编程语言中的某种类型的语法,这些语法不会影响功能,但使用起来却很方便.语法糖,也称糖语法,这些 ...
- 2021-05-29:最常使用的K个单词II。在实时数据流中找到最常使用的k个单词,实现TopK类中的三个方法: Top
2021-05-29:最常使用的K个单词II.在实时数据流中找到最常使用的k个单词,实现TopK类中的三个方法: TopK(k), 构造方法.add(word),增加一个新单词.topk(),得到当前 ...
- 2021-12-17:长城守卫军问题。 长城上有连成一排的n个烽火台,每个烽火台都有士兵驻守。 第i个烽火台驻守着ai个士兵,相邻峰火台的距离为1。另外,有m位将军, 每位将军可以驻守一个峰火台,每个
2021-12-17:长城守卫军问题. 长城上有连成一排的n个烽火台,每个烽火台都有士兵驻守. 第i个烽火台驻守着ai个士兵,相邻峰火台的距离为1.另外,有m位将军, 每位将军可以驻守一个峰火台,每个 ...
- yaml的读写
yaml文件的读写是真的快,也很简单.代码如下:from ruamel.yaml import YAMLimport os # 读取yaml配置文件def read_yaml(yaml_path): ...
- 最全的git操作命令(持续更新)
当前使用git进行版本管理越来越频繁,但是难免还是有些命令记不全,曾当前闲暇记录一下,免得需要时漫天找寻 目录 一. 配置用户信息 1.git config [配置git 用户信息] 2.git co ...
- 第一单元 .Net 平台介绍
第一单元 .Net 平台介绍 学习编程,电脑基本配置(当然配置越高越好): 内存 :初期学习8 G,后期可能跟不上, 最好16 G以上 硬盘:500 G,5400 转速,至少C盘是固态,全是固态最好 ...