未找到

未发布 MailBee.NET Objects显示HTML/纯文本邮件教程(二):在桌面应用程序中显示
by Harriet666 keys 分享 1502445139738
MailBee.NET Objects是一款为创建、发送、接收以及处理电子邮件而设计的健壮、功能丰富的.NET控件。几行代码便可为应用程序添加E-Mail支持,简单高效。具备“必需”以及独特的功能,这些控件帮助开发人员简单快速地将复杂的电子邮件功能添加到他们的应用程序中。
 
MailBee.NET Objects介绍和试用点击查看>>>
 
本文主要介绍了在桌面应用程序中显示HTML/纯文本邮件的代码示例。目前MailBee.NET Objects在线订购享75折优惠正在进行中,欢迎您下载试用版进行运用!
如果你需要在桌面应用程序中以纯文本控件(如Memo)显示HTML消息,则应将HTML文本转换为纯文本。
C#
msg.Parser.HtmlToPlainMode = HtmlToPlainAutoConvert.IfNoPlain;
VB.NET
msg.Parser.HtmlToPlainMode = HtmlToPlainAutoConvert.IfNoPlain
 
上面的代码将邮件转换为纯文本。然后你可以显示如下的纯文本正文(假设textBox1是表单上的文本控件):
C#
textBox1.Text += msg.BodyPlainText;
VB.NET
textBox1.Text += msg.BodyPlainText
未发布 图表编辑器TMS Diagram Studio更新至v4.14,支持RAD Studio 10.2 Tokyo
by Harriet666 keys 分享 1508403820628

TMS Diagram Studio是一款功能强大的图表控件,专为您的应用程序添加示意图和流程图表。

TMS Diagram Studio点击下载>>>


v4.14
  • 改进:更改handle检测的顺序。
  • 修复:预览/打印错误。
  • 修复:TDiagramButtons控件显示所有类别,而不考虑DiagramCategories属性的值。
v4.13
  • 新增:支持RAD Studio 10.2 Tokyo
v4.12
  • 修复:RoundRect块在使用GDI或GDIPlus/Direct2D时显示不同
  • 修复:使用Direct2D导出到位图不包含背景图像
V4.11
  • 修复:链接不与块一起移动
v4.10
  • 新增:TCustomDiagramBlock.CornerRadius属性,用于在使用圆弧形状时对圆角进行微调
  • 改进:在一次性清除或删除许多图表对象时提高性能
  • 修复:预览位图横向定位
  • 修复:移动具有线路的组将导致组成员错位
  • 修复:图形工具栏在设计时的高度不正确
v4.9.1
  • 修复:C ++ Builder 2007标题未正确生成。

未发布 .NET Core、Xamarin、.NET Standard和.NET Framework四者之间的区别
by Harriet666 keys 分享 1507866121963
前段时日微软(Microsoft)正式发布了.NET Core 2.0,在很多开发社区中反响不错。但还是有一些开发者发出了疑问,.NET Core、Xamarin、.NET Standard和.NET Framework之间有哪些不同呢?本文就为大家简单描述一下这四者之间的区别。
 
.NET Core

.NET Core是免费、跨平台的,是托管框架的开源实现。它支持4种类型的应用程序:控制台、ASP.NET Core、云和通用Windows平台(UWP)。Windows Forms和Windows Presentation Foundation(WPF)并不包含在.NET Core中。

从技术上讲,.NET Core仅支持控制台应用程序。ASP.NET Core和UWP是以.NET Core为基础构建的应用程序模型。

与.NET Framework不同,.NET Core没有作为Windows组件考虑。因此,更新是以NutGet包的形式,而不是通过Windows Update。由于.NET Core运行时安装成了App-Local,而应用程序升级是通过包管理器完成的,所以应用程序可以关联特定的.NET Core版本以及单独升级。
 
.NET Standard

托管框架的每一种实现都有一套自己的基类库。基类库(BCL)包含诸如异常处理、字符串、XML、I/O、网络和集合这样的类。

.NET Standard是一项实现BCL的规范。由于.NET实现需要遵循这项规范,所以应用程序开发人员就不用担心每一种托管框架实现的BCL不同。

框架类库(FCL),如WPF、WCF、ASP.NET,不包含在BCL中,因此,也就不包含在.NET Standard中。

.NET Standard与.NET实现之间的关系就和HTML规范与浏览器之间的关系一样。后者是前者的实现。

因此,.NET Framework、Xamarin和.NET Core,每一种托管框架都实现了.NET Standard中的BCL。随着计算机工业不断推出新的硬件和操作系统,将来还会出现新的.NET托管框架。该标准让应用程序开发人员知道,他们可以依赖于一套始终如一的API。

每个.NET版本都对应一个.NET Standard版本。

API一致,将应用程序移植到不同的托管实现以及提供工具都会更简单。

.NET Standard被定义为一个单独的NuGet包,因为所有的.NET实现都必须支持它。工具变得简单了,因为对于特定的版本,它们有一套相同的API。你还可以针对多个.NET实现构建一个库项目。

你还可以构建特定平台API的.NET Standard封装器。
 
.NET Standard vs 可移植类库

可移植类库做的不是同一件事吗?

可移植类使用多个平台均都支持的通用API。因此,支持的平台越多,可用的API就越少,而且,对于特定的平台组合,很难知道到底支持哪些API。对于一个新平台,已有的PCL必须重新编译。PCL还需要微软针对每个平台创建一个新的框架实现分支。

由于.NET Standard确定了API,而不是一个实现,所以不需要重新编译应用程序。任何新发布的.NET实现都实现了必须的库。应用程序不需要重新编译就可以运行在新的硬件平台或操作系统上。从理论上讲,在调用API时可能会捕获到NotSupportedException异常,但那种情况应该很少见。
 
小结
  • .NET Standard是一项API规范,每一个特定的版本,都定义了必须实现的基类库。
  • .NET Core是一个托管框架,针对构建控制台、云、ASP.NET Core和UWP应用程序进行了优化。每一种托管实现(如Xamarin、.NET Core或.NET Framework)都必须遵循.NET Standard实现BCL。
  • .NET Framework用于构建桌面应用程序和运行在互联网信息服务器(IIS)上的ASP.NET应用程序。它是第一个托管框架。
  • Xamarin则是一个用于构建iOS、Android、macOS和桌面应用程序的框架。
【慧都十四周年庆预热开启!全场满额送七级豪礼,AppleMac笔记本电脑、iwatch、iPad等您来拿!】

活动时间:10月1日-10月31日

未发布 HTML5文档查看器PrizmDoc v12.2发布,为Viewing客户端添加了新功能。
by Harriet666 keys 分享 1489721400738

PrizmDoc v12.2最新版点击下载>>>

PrizmDoc是最快速、最有品质的HTML5文档查看器,提供安全的、全定制化的查看和协作功能。它通过一个简单部署的机制减少成本,降低安全风险和提高生产率。同时,它是基于服务器的查看器,消除了不必要的许可和下载。

PrizmDoc发布v12.2新版本,为Viewing客户端和PrizmDoc服务器添加了新功能。

未发布 【示例教程】使用Leadtools对身份证进行识别和表单模板创建
by Harriet666 keys 分享 1511426850168
使用Leadtools的表单识别功能可以对固定格式的表单很方便的进行批量识别,生活中常见的身份证、驾驶证、发票等都可以识别出准确的结果。另外通过表单匹配的功能同时也能实现对表单进行自动分类。本篇教程以身份证识别为例,介绍整个识别和创建的流程。
 
Leadtools 19总套包下载>>>
 

1、模板创建

1.1制作空白表单
通过photoshop对拍摄到的身份证进行处理,仅保留公共部分的内容和字段,对于身份证照片和个人具体信息都进行清除,结果如下图
 
1.2使用leadtools表单编辑器编辑模板
打开leadtools开发包安装目录:C:\LEADTOOLS 19\Shortcuts\Forms Recognition & Processing\.NET Class Libraries\Forms (Structured & Unstructured)\Forms Recognition & Processing\Master Forms Editor
运行其中的可执行程序,点击NEXT.,选择载入主表单数据集,载入默认路径,选择professional引擎,进入主界面
 
添加中文语言支持
 
添加身份证主表单
 
向身份证表单添加图像,选择刚才已经制作好的空白图片
 
添加完成后,可以在主界面的右侧对模板进行编辑
下图是可以在模板中添加的识别类型,本例中,我们主要使用文本和图片两个类型
 
点击相应的识别类型,在模板上拖动为需要识别的区域,如下图,然后保存即可。
 
添加后可以看到左下角的信息栏里面有添加的字段的详细信息,可以对字段的名称,位置等,进行进一步的修改,最后点击保存按钮,这样我们就完成了表单的创建。
 
创建表单过程:

 
 

2、识别表单

直接在该演示程序的菜单中点击如下按钮即可打开识别程序
单独打开识别程序的目录为:C:\LEADTOOLS 19\Shortcuts\Forms Recognition & Processing\.NET Class Libraries\Forms (Structured & Unstructured)\Forms Recognition & Processing
 
打开后的节目如下,同样先附加中文语言包
 
点击菜单按钮,选择一个身份证图片进行识别
 
识别完成后会弹出识别结果界面,可以看到身份证上所有的信息都已经被准确的识别出来了,
 
以下为识别过程
未发布 Oracle再次被曝漏洞,影响33万用户
by Harriet666 keys 分享 1517562136241

来自ERPScan公司的安全专家们发现了这个编号为CVE-2018-2636的漏洞。这个漏洞来自Oracle MICROS系统内的销售点(Point-of-Sale)终端,可能被利用来从硬件内无需验证地读取敏感资料。

ERPScan发布的漏洞分析内这样写道:“CVE2018-2636标记了一个Oracle MICROS系统内的文件夹遍历时暴露出的漏洞。如果公司内部有人得到了某个关键文件夹的路径,他就能从一台终端中偷取许多关键的资料,包括服务日志以及一些包含着用户名和密码的信息,甚至可以使用这些密码去连接数据库,获得更多关于服务器端之类的信息。”

“攻击者们能够获得数据库用户名以及哈希过后的密码,将密码暴力破解然后获得数据库内部商业资料的所有权限。而且还有许多不同的利用这个漏洞的攻击方式,导致整个MICROS系统处在危险之中。”

Oracle的MICROS系统在世界范围内拥有超过330000的现金注册用户,涵盖了许多食物卖场(200000+)以及酒店(30000)。

研究者还解释道,对一个本地攻击者来说要获取到MICROS销售点终端的URL路径是很简单的。

例如,他可以找到一个商场的电子秤或者其他使用RJ45点硬件,将其连接到Raspberry PI(树莓派),然后扫描整个内部网络。另一个选项是可以通过这些暴露在因特网上的设备来定位。截止本稿完成之时,共有139个MICROS销售点系统暴露在因特网上,其中大多数位于美国及加拿大。

Oracle33

这并不是MICROS首次遭到质疑,2016年时就曾经有黑客通过客户售后支持中心入侵MICROS系统。

分析报告最后总结道:“如果你想保护你的系统免受网络攻击的危害,你必须持续地保持更新,安装所有安全补丁。在这个案例中,特指Oracle在2018年1月的更新。”

未发布 MailBee.NET Objects发送电子邮件(SMTP)教程八:使用多个SMTP服务器发送邮件
by Harriet666 keys 分享 1496655901549
MailBee.NET Objects是一款为创建、发送、接收以及处理电子邮件而设计的健壮、功能丰富的.NET控件。几行代码便可为应用程序添加E-Mail支持,简单高效。具备“必需”以及独特的功能,这些控件帮助开发人员简单快速地将复杂的电子邮件功能添加到他们的应用程序中。
 
 
本文主要介绍了如何使用使用多个SMTP服务器发送邮件的代码示例。目前MailBee.NET Objects在线订购享75折优惠正在进行中,欢迎您下载试用版进行运用!
 
当开发人员不确定他将用于发送电子邮件的SMTP服务器是否可靠(例如,有时服务器崩溃)时,使用多个SMTP服务器则非常有用。例如,当使用单个SMTP服务器发送消息时,如果此SMTP服务器崩溃,则MailBee无法发送消息。但是,在使用多个SMTP服务器时,如果一个SMTP服务器崩溃,MailBee会根据这些服务器的优先级别尝试使用其他SMTP服务器。
 
因此,使用多个SMTP服务器增加了邮件发送成功的可靠性。MailBee.NET Objects允许开发人员管理SMTPSERVER对象的集合,存储在SMTP.SmtpServers的SMTP对象的属性。开发人员应调用SMTP.SmtpServers.Add方法向集合添加一个新的SmtpServer对象实例。这个方法有五个重载。第一个重载允许添加直接SmtpServer对象,如下所示:
C#:

SmtpServer smtp_srv = new SmtpServer();

smtp_srv.Name = "mail.domain.com";
smtp_srv.AccountName = "john_doe";
smtp_srv.Password = "secret";

oMailer.SmtpServers.Add(smtp_srv);

VB.NET:
Dim smtp_srv As SmtpServer =  New SmtpServer() 
 
smtp_srv.Name = "mail.domain.com"
smtp_srv.AccountName = "john_doe"
smtp_srv.Password = "secret"
 
oMailer.SmtpServers.Add(smtp_srv)
 
SMTP.SmtpServers.Add方法的下一次重载允许通过指定的服务器名称或相应的IP地址添加新的SMTP服务器,如下所示:
C#:

oMailer.SmtpServers.Add("127.0.0.1");
oMailer.SmtpServers.Add("smtp.company.com");

VB.NET:
oMailer.SmtpServers.Add("127.0.0.1")
oMailer.SmtpServers.Add("smtp.company.com")
 
此外,开发人员可以指定SMTP服务器的端口号和优先级。默认优先级为0(即最高),默认端口号为25。以下代码将两个具有不同优先级的SMTP服务器添加到集合中:
C#:

oMailer.SmtpServers.Add("127.0.0.1", 33, 1);
oMailer.SmtpServers.Add("smtp.company.com", 37, 2);

VB.NET:
oMailer.SmtpServers.Add("127.0.0.1", 33, 1)
oMailer.SmtpServers.Add("smtp.company.com", 37, 2)

此外,SMTP.SmtpServers.Add方法的以下重载允许通过指定的服务器名称(或相应的IP地址)、登录名和密码将SMTP服务器添加到集合中,如下所示:
C#:

oMailer.SmtpServers.Add("127.0.0.1", "dan_brown", "password");
oMailer.SmtpServers.Add("smtp.company.com ", "john_doe", "secret");

VB.NET:
oMailer.SmtpServers.Add("127.0.0.1", "dan_brown", "password")
oMailer.SmtpServers.Add("smtp.company.com ", "john_doe", "secret")
 
以上就是本次教程的全部内容,接下来会有更多相关教程,敬请关注!您也可以在评论者留下你的经验和建议。

试用、下载、了解更多产品信息请点击"咨询在线客服"   

未发布 扫描识别工具Dynamic Web TWAIN使用教程:如何自定义扫描设置
by Harriet666 keys 分享 1512380145488
Dynamic Web TWAIN是一个专为Web应用程序设计的TWAIN扫描识别控件。你只需在TWAIN接口写几行代码,就可以用兼容TWAIN的扫描仪扫描文档或从数码相机/采集卡中获取图像。
 
本文为你介绍Dynamic Web TWAIN中如何自定义扫描设置,欢迎收藏。
 
Dynamic Web TWAIN最新版免费下载>>>
 
我们上一节介绍了三种使用Dynamic Web TWAIN的方法:属性、方法和事件。Dynamic Web TWAIN的所有内置属性、方法和事件的完整列表可在我们的在线API文档中找到,以供参考。本文将更详细地介绍Dynamic Web TWAIN的功能:在开始扫描之前,您可以设置如何扫描文档,并更改扫描仪内置用户界面中的所有设置。以虚拟扫描器为例:
image017
 
您可能希望以相同的方式扫描您的所有归档文档。使用Dynamic Web TWAIN,您可以在JavaScript代码中自定义所有这些设置。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DWObject.SelectSource();
/* You should customize the settings after opening a source */
DWObject.OpenSource(); 
/* Hide the User Interface of the scanner */               
DWObject.IfShowUI = false;    
/* Use the document feeder to scan in batches */     
DWObject.IfFeederEnabled = true; 
/* Scan in Simplex mode (only 1 side of the page) */    
DWObject.IfDuplexEnabled = false;   
/* Scan pages in GRAY */ 
DWObject.PixelType = EnumDWT_PixelType.TWPT_GRAY;
/* Scan pages in 200 DPI */
DWObject.Resolution = 200;  
/* Start scanning */           
DWObject.AcquireImage();

本次教程到此结束,希望能对Dynamic Web TWAIN的用户带来帮助,接下来还会有更多的相关教程,敬请期待!

未发布 GIS软件开发工具包TatukGIS Developer Kernel更新至 v11.4.0-Unstable4
by Harriet666 keys 分享 1494493928347
GIS定制开发首选控件,帮您轻松搞定高效、优质、实惠的GIS解决方案

TatukGIS Developer Kernel(DK)是一个用于开发自定义地理信息系统(GIS)应用程序以及解决方案的综合性软件开发工具包(SDK)。众所周知,构建一个庞大的地理信息系统需要花费大量的金钱和人力,而TatukGIS却是同类产品中性价比最高的控件,TatukGIS Developer Kernel DK因其功能强大,价格适中,已被超过 50个国家的个人、公司、以及政府等客户用来实现其地理信息系统解决方案。根据不同地首选开发环境,本产品分别以五个独立产品的形式提供(即VCL、.NET/WPF、ActiveX、Compact Framework和ASP.NET),各个产品使用相同的框架、应用程序编程接口(API)技术。
 
Version: 11.4.0-Unstable4

新功能:

  • [DK-9224]通过将最小值最大值映射到0..255(Core),以便更好地显示16位像素数据。
  • [DK-9137]实现Params.Pixel.RedMapZones、GrenMapsZones等,允许高于255并正确映射16位图像(Core)。

修复:

  • [DK-9220] TGIS_ControlLegendForm - 使用“应用”按钮两次会覆盖最后一节参数(DK,NDK)。
  • [DK-9211] TGIS_LayerPixel.Locate - 没有正确设置_nativesVals为64位(4波段)图像(Core)。
未发布 【示例教程】使用leadtools的WCF接口功能实现从web端上传Dicom影像文件
by Harriet666 keys 分享 1517903663716
Leadtools 19总套包下载>>>
 
leadtools为web端提供了wcf接口来供用户可以登录pacs系统,检索,查看以及上传影像。本篇博客讲解如何创建一个网页来实现上传功能,通过WCF进行dicom文件的上传时,是将dicom文件转换为base64数据流,分段进行传输。
 
本篇博客运行的前提是已经部署完成Leadtools HTML5 Web Viewer,可以正常浏览。参考https://www.evget.com/article/2018/2/6/27757.html
 
在部署完成后,将下面的代码复制到一个HTML文件中,即可运行进行测试。另外需要添加html文件所需的jquery.min.js到同文件夹路径下。
<head>
    <meta charset="UTF-8">
head>

<form onsubmit="return false;">
    <input type="hidden" name="file_base64" id="file_base64">
    <input type="file" id="fileup" multiple="multiple">
    <input type="submit" value="submit" onclick="$.post('./uploader.php', $(this).parent().serialize());">
    <div>
        <div id="msg">div>
    div>
form>
<script src="scripts/jquery.min.js">script>
<script>

    $(document).ready(function () {
        authcookie = login();
        document.cookie = "authcookie=" + authcookie;
        $("#fileup").change(function () {
            getauthcookie("authcookie");
            filelist = this.files;
            file = filelist[fileindex];
            upload(file);
        });
    });
    var authcookie;//保存authcookie
    var filelist;//上传文件列表
    var file;//当前上传文件
    var tempfile = "";//临时文件名称
    var position = 0;
    var size = 40000;//分段大小
    var done = false;
    var fileindex=0;//当前上传文件序列号

    function upload(tempfile) {
        if(position==0)
            done=false;
        var reader = new FileReader();
        if (file.size > position + 40000)
            reader.readAsArrayBuffer(file.slice(position, position + 40000));
        else 
            reader.readAsArrayBuffer(file.slice(position, file.size));
        reader.onload = function (e) {
            if (e.target.readyState === 2) {
                var base64string = base64ArrayBuffer(e.target.result);
                var data = {
                    authenticationCookie: authcookie,
                    dicomData: base64string,
                    fileName: tempfile,
                    status: position==0?"start":"append"
                };
                tempfile = senddata(JSON.stringify(data));
                if (!done) {
                    position += 40000;
                    upload(tempfile);
                    if (position+40000>file.size)
                        done = true;
                }
                else {
                    var data = {
                        authenticationCookie: authcookie,
                        dicomData: "",
                        fileName: tempfile,
                        status: "done"
                    };
                    tempfile = senddata(JSON.stringify(data));
                    position = 0;
                    $("#msg").html($("#msg").html()+"第"+(fileindex+1)+"个文件已经上传完成

"); fileindex += 1; if (fileindex < filelist.length) { file = filelist[fileindex]; upload(tempfile); } else { fileindex = 0; $("#msg").html($("#msg").html() + "文件全部已经上传完成

"); } } } }; } function senddata(data) { var result; $.ajax({ type:"post", url: "http://localhost/MedicalViewerService19/StoreService.svc/UploadDicomImage", data: data, contentType: "application/json", dataType: "json", success: function(data){result= data}, async: false }); return result; } function login() { var auth; var logininfo = { userName: "a", password: "a", userData: "" }; $.ajax({ type: "post", url: "http://localhost/MedicalViewerService19/AuthenticationService.svc/AuthenticateUser", data: JSON.stringify(logininfo), contentType: "application/json", dataType: "text", success: function (data) { auth= data }, async: false }); return auth; } function query() { } function getauthcookie() { document.cookie.split(";").forEach(function (val, index) { var index = val.indexOf("="); if ($.trim(val.substring(0, index)) == "authcookie") { authcookie = $.trim(val.substring(index + 1, val.length)); } }); return ""; } function base64ArrayBuffer(arrayBuffer) { var base64 = ''; var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; var bytes = new Uint8Array(arrayBuffer); var byteLength = bytes.byteLength; var byteRemainder = byteLength % 3; var mainLength = byteLength - byteRemainder; var a, b, c, d; var chunk; // Main loop deals with bytes in chunks of 3 for (var i = 0; i < mainLength; i = i + 3) { // Combine the three bytes into a single integer chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2]; // Use bitmasks to extract 6-bit segments from the triplet a = (chunk & 16515072) >> 18; // 16515072 = (2^6 - 1) << 18 b = (chunk & 258048) >> 12; // 258048 = (2^6 - 1) << 12 c = (chunk & 4032) >> 6; // 4032 = (2^6 - 1) << 6 d = chunk & 63; // 63 = 2^6 - 1 // Convert the raw binary segments to the appropriate ASCII encoding base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d]; } // Deal with the remaining bytes and padding if (byteRemainder == 1) { chunk = bytes[mainLength] a = (chunk & 252) >> 2; // 252 = (2^6 - 1) << 2 // Set the 4 least significant bits to zero b = (chunk & 3) << 4; // 3 = 2^2 - 1 base64 += encodings[a] + encodings[b] + '=='; } else if (byteRemainder == 2) { chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1]; a = (chunk & 64512) >> 10; // 64512 = (2^6 - 1) << 10 b = (chunk & 1008) >> 4; // 1008 = (2^6 - 1) << 4 // Set the 2 least significant bits to zero c = (chunk & 15) << 2 // 15 = 2^4 - 1 base64 += encodings[a] + encodings[b] + encodings[c] + '='; } return base64; } script>

6


 近期热门 - 点击最多
  1. python基于asyncio实现 Redis 的异步操作哈希数据写入 / 读取、发布订阅消息中间件
  2. Node.js 打印vite react+go项目目录树
  3. Angular入门:用Signals状态管理和Bootstrap基础样式实现的用户登录注册实例教程
  4. 用Gitea搭建免费Git服务器自定义Actions配置CI/CD自动化部署和测试流水线
  5. FastAPI+SQLModel+PostgreSQL+React+Vite全栈项目文件结构说明环境搭建与初始化指南
  6. React结合vite使用vue3,在纯typescript的react hooks中使用vue
  7. valtio基于Proxy代理比redux\zustand更简洁的react状态管理库
  8. React Native为http网络请求添加timeout超时异常处理: 用XMLHttpRequest替换fetch发送的区别
  9. React Native使用fetch发送http登陆验证请求失败:无法读取set-cookie并显示network request failed
  10. 克服Redux的缺点在React/Native中使用消息队列,pubsub-js更加简洁的组件间通信和状态传递方法

  全端社区 - 最新回复
  1. python基于asyncio实现 Redis 的异步操作哈希数据写入 / 读取、发布订阅消息中间件
  2. Angular入门:用Signals状态管理和Bootstrap基础样式实现的用户登录注册实例教程
  3. 用Gitea搭建免费Git服务器自定义Actions配置CI/CD自动化部署和测试流水线
  4. FastAPI+SQLModel+PostgreSQL+React+Vite全栈项目文件结构说明环境搭建与初始化指南
  5. Node.js 打印vite react+go项目目录树
  6. valtio基于Proxy代理比redux\zustand更简洁的react状态管理库
  7. Windows与Mac通过git ssh和rsync实现文件共享互传
  8. Windows与Mac通过git ssh和scp实现文件共享互传
  9. React结合vite使用vue3,在纯typescript的react hooks中使用vue
  10. 使用PubSub-JS时ReactNative在后台运行一段时间唤醒后,组件无法scribe到publish的事件,typescript实现一个事件订阅发布组件

  开源的 OurJS
OurJS开源博客已经迁移到 OnceOA 平台。

  关注我们
扫一扫即可关注我们:
OnceJS

OnceOA