useCallback 和 useMemo 是 React 函数组件开发中非常重要的两个函数, 分别用于缓存方法和变量, 可以避免不必要的渲染, 提升性能。 为什么要缓存? React 函数组件就是一个 TypeScript/JavaScript 函数,当组件状态变化时, React 会重新调用这个函数进行渲染, 如果不使用缓存的话, 会导致函数组件內定义的函数和变量都会被重新定义和初始化, 从而导致错误的更新和渲染。 比如下面的代码: import { useEffect, useState } from 'react'; export function MyComp() {... 阅读全文

React 组件既然有状态, 就肯定需要根据状态的进行交互和同步, 在 React Hooks 使用 useEffect 和 useLayoutEffect 函数进行同步。 吐槽一点, Effect 虽然是被用作同步的, 但是 Effect 本身的字面意思和同步没有任何关系, 导致很多中文文档中都翻译成 效应 , 副作用 之类的, 感觉有点儿不伦不类, 至少和同步不搭边。 这一点, React 官方也没有一个说法, 至今没有一个 信达雅 的中文翻译。 useEffect useEffect 的函数定义是这样的: function useEffect( effect: ... 阅读全文

最近打算在微信上写点儿 Web 应用, 想法很简单, 就是通过微信直接发送地址, 在微信的 Webview 中直接运行,不安装。 想法是好的, 然而没想到的是现在 (2023 年 3 月) 微信的 Webview 的版本居然还是 Chrome/86 , 而当前主流的版本已经是 Chrome/110 了, 差了 20 多个版本, 于是忍不住在 V2EX 发了一片吐槽的帖子: 2023 年又发现了一个 “IE6” ,那就是安卓版微信内置的 Webview , 得到了好多网友的回复。 更加没想到的是, 支付宝/钉钉等阿里系软件内嵌的 Webview 居然更低的 Chrome/69 ,... 阅读全文

之前一直使用 Angular 作为前端开发的基础框架, 虽然 Angular 一直是一个非常优秀的框架, 现在也是, 甚至未来也会是, 但是鉴于目前国内 (中国大陆) 的现状, 再掌握一个流行的前端框架是很有必要的, 在认真对比了 React 和 Vue 之后, 选择了 React 作为前端基础框架。 在我看来, React 的优势主要有: 生态好 主流的 IDE , 不管是 VSCode 及其衍生产品, 还是 JetBrains 家族的 IDE 及其衍生产品, 都内置 React 支持, 而 Angular 和 Vue 则都需要安装插件才行。TypeScr... 阅读全文

Ubuntu 升级到 Ubuntu 22.04 之后, 系统自带的 Wi-Fi 热点功能就不能用了, 共享的热点无法连接, 应该是 wpa_supplicant-2.10 导致的 (https://blog.incompetent.me/2022/07/27/workaround-ubuntu-22-04-hotspot-stops-working/) , 目前最容易的做法就是将这个包降级至 wpa_supplicant-2.9 , 然后就一切正常, 记录如下。 添加降级所需的旧的存储库 使用 nano 编辑 /etd/apt/source.list 文件: sudo nano /... 阅读全文

Ryujinx 模拟器安装与初始化 Ryujinx 是一个开源的任天堂 Switch 模拟器,由 gdkchan 创建, 用 C# 编写。 这个模拟器的目标是提供出色的准确性和性能, 一个用户友好的界面, 以及一致的构建。 为什么要装这个 Ryuginx 模拟器呢, 原因如下: 上面说了, Ryujinx 是用 C# 编写的, 作为一个多年使用 C# 程序的程序员, 倍感亲切, 肯定要支持一下; Ryujinx 适配了 Mac M1 芯片, 这更要体验一下了; 任天堂的游戏评价很高, 一直想体验一下, 至于为什么不买个 Switch 则不在本文讨论范围内。 Ryu... 阅读全文

后端技术 后端技术主要还是 .NET 为主, 估计我也很难全面转向其它的技术方向, 毕竟接触 .NET 20 年了, 太熟悉了, 很难舍弃。 我维护的 .NET 项目均升级到了最新的 .NET 7 , 本来以为是常规升级, 但是由于 .NET 7 默认启用了 nullable 检查, 为了适应这个新特性, 许多代码都需要进行相应的修改, 程序的健壮性会增加不少, 随后会专门针对这个特性再写一篇。 前端技术 前端框架 前端一直用的是 Angular , 可以说是很棒的框架, 但是由于目前国内的现状, Angular 可以说是后继无人, 因此不得不寻找替代的前端技术框架, 基本上就... 阅读全文

记录2022年11月26日感染新冠奥密克戎病毒的流水帐以及广州琶洲方仓医院的一些见闻, 供大家参考。 如果你能看 Twitter 的话, 可以直接看这个主题贴。 2022年11月26日15点25分,收到12320的电话,初筛阳性,感觉轻微发烧,没有测体温, 这是要准备去方仓医院隔离了。 下午6点,抗原复测先阳性,体温39°,自我感觉和感冒症状一样,头疼,浑身肌肉酸痛。 只能按照防疫要求收拾东西准备去方仓医院隔离。 27日凌晨,到达传说中的琶洲方仓医院, 第一印象是这样的。 有兴趣可以分别看一下这两个视频,就不直接贴出来了: 视频1 视频2 。 只能一句话来形容... 阅读全文

最近要在 Ubuntu 系统上挂载共享存储并进行一些备份和服务迁移, 没想到居然也还有一些坑, 于是记录如下。 安装 cifs-utils 工具 首先, cifs-utils 一定要安装, 系统自带的 mount 命令虽然也能用, 但是选项不多, 或者说不够多。 在 Ubuntu 系统上, 安装命令为: sudo apt install cifs-utils 创建凭证文件 先创建一个凭证文件, 保存访问共享存储使用的用户名和密码, 这样会安全一些, 如果要多次挂载共享存储, 也可以共用这个凭证文件。 先创建 /etc/credentials 目录, sudo mkdir ... 阅读全文

记录从 MacBook Pro 2015 迁移到 MacBook Pro 2021 M1 时进行的一系列的折腾。 安装常用软件的 Arm 版本 虽然借助苹果的 Rosetta 转译程序, 可以直接运行原来的 x64 应用, 但是效率不高, 因此安装对应的 Arm 版本的软件才是最佳的选择。 从 AppStore 上下载的应用, 基本上已经都是通用 (Universal) 应用了, 只需要在新电脑上重新下载即可。 而不是在 AppStore 上下载的软件, 则只能自己去官方网站上寻找对应的 Arm 版本。 Rosetta 在最近几年内还是需要的, 毕竟有很多旧的软件还不支持 Arm... 阅读全文

最近有需要在 AspNet Core 应用中读取当前请求的请求体 (Request.Body) , 本来以为是很简单的事情, 没想到居然有坑, 因此记录如下。 动作方法 (Action Method) 没有参数的情况下, 可以用正常读取请求体的, 代码如下: [HttpPost("")] public async Task<ActionResult> Post() { var result = await Request.BodyReader.ReadAsync(); var message = string.Empty; if (result.I... 阅读全文

GeoServer 使用 Jetty 作为服务容器, 但是默认的下载的 GeoServer 并没有包含 JNDI 相关的 Jetty 模块, 而在 GeoServer 的配置界面是支持使用 JNDI 连接数据库的,这就前后矛盾了。 不过最坑的是 GeoServer 关于 JNDI 的文档 只有那么一小段, 居然还是基于 Tomcat 服务容器的, 真是太过分了。 添加 JNDI 支持 下载与 GeoServer 中的 Jetty 版本一致的完整包, 以最近发布的 GeoServer 2.20.0 为例, 内置的 Jetty 为 9.4.36.v20210114 。 添加 JNDI 支... 阅读全文

本博客基于 Tabler CSS 框架, 采用 Jekyll 模板引擎, 使用 Markdown 语法编写。

博客源代码及文章内容采用 AS-IS 协议发布,转载时请 AS-IS 。