11-14
1 小程序动态背景
[1][小程序滚动页面修改导航栏背景色](https://blog.csdn.net/qq_44854653/article/details/123556071)
[2][微信小程序:随页面滚动渐变的顶部导航组件](https://blog.csdn.net/haoyanyu_/article/details/108028832) (加入防抖)
2 ts类型声明问题
声明空间
分两类:1.类型声明空间 2.变量声明空间
// 类型声明空间
class Foo {}
interface Bar {}
type Bas = {};
// 变量声明空间
class Foo {} // 可以看到类可以同时为(类型|变量)声明空间
const someVar = Foo;
const someOtherVar = 123;
对单独文件类型声明
// CPCL_JSSdk0.0.0.2.js
function CPCL_JSSdk() {}
CPCL_JSSdk.prototype.print = function () {};
export default CPCL_JSSdk;
声明文件:
// CPCL_JSSdk0.0.0.2.d.ts
class CPCL_JSSdk {
print: () => void;
}
export default CPCL_JSSdk;
或者,对整个模块显示声明any
// CPCL_JSSdk0.0.0.2.d.ts
export default any;
[1][TypeScript 中的声明文件](https://daief.tech/post/declaration-files-of-typescript/)
[2] https://ts.xcatliu.com/basics/declaration-files.html#%E6%A8%A1%E5%9D%97%E6%8F%92%E4%BB%B6
3 js格式化金钱
方法一:该方法在特定环境会失效,不建议使用
const options = {
style: 'currency',
currency: 'CNY',
};
const num = 999999
num.toLocaleString('zh-CN', options);
=>> '¥999,999.00'
方法二
function formatCurrency(num: any, withcents = 2) {
const originnum = num;
// eslint-disable-next-line no-useless-escape
num = num.toString().replace(/\$|\,/g, '');
if (Number.isNaN(num)) {
num = '0';
}
// eslint-disable-next-line eqeqeq
const sign = num == (num = Math.abs(num));
num = Math.floor(num * 100 + 0.50000000001);
let cents = (num % 100) as any;
num = Math.floor(num / 100).toString();
if (cents < 10) {
cents = `0${cents}`;
}
// eslint-disable-next-line no-plusplus
for (let i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++) {
num = `${num.substring(0, num.length - (4 * i + 3))},${num.substring(num.length - (4 * i + 3))}`;
}
const rs = `${(sign ? '' : '-') + num}.${cents}`;
// eslint-disable-next-line radix, eqeqeq
if (!withcents && parseInt(originnum) == parseFloat(originnum)) {
return rs.split('.')[0];
}
return rs;
}
function formatPrice(price: string | number | undefined, withcents = 2) {
price = price || 0;
return formatCurrency(price, withcents);
}
4 recycle-view下拉刷新
原理为给 scroll-view 增加下拉刷新操作
[1][微信小程序长列表组件 recycle-view 修改,使其可以下拉刷新 ](https://www.cnblogs.com/han-guang-xue/p/13048505.html)
[2][修改后的 recycle-view包](https://www.npmjs.com/package/@ginlink/miniprogram-recycle-view)
5 一些工具
5.1 class-transformer
class-transformer
是一个类转化工具,重点内容是将字面量转化为类,还可以对类上的属性进行更名导出、隐藏等操作
class User {
id: number;
firstName: string;
lastName: string;
@Expose()
get name() {
return this.firstName + ' ' + this.lastName;
}
@Exclude()
password: string;
}
5.2 Typegoose
Typegoose
主要用于更加简单的书写Mongoose模型
class Job {
@prop()
public title?: string;
@prop()
public position?: string;
}
// === 等效Mongoose写法
const JobSchema = new mongoose.Schema({
title: String;
position: String;
});
6 虚拟列表
TODO
用Canvas实现?
飞书文档中的表格是利用Canvas实现的?
[0][vue-virtual-scroller的使用,长列表优化,虚拟列表](https://blog.csdn.net/weixin_43239880/article/details/120755432)
[1][vue-virtual-scroller](https://github.com/Akryum/vue-virtual-scroller)
[2][vue-virtual-scroller示例](https://vue-virtual-scroller-demo.netlify.app/)
[3][react-virtualized](https://github.com/bvaughn/react-virtualized)
[4][react-virtualized示例](https://bvaughn.github.io/react-virtualized/#/components/List)
[5][Luckysheet](https://github.com/dream-num/Luckysheet) (非虚拟列表,强大的在线开源表格项目)
2022-12-28 21:51:02补充
[1][使用 AntV S2 打造大数据表格组件](https://zhuanlan.zhihu.com/p/478129151)
内包含 类 Excel 前端表格组件的一些分析
一些关于AntV S2的文章:
拓展内容
[1][协同编辑中使用的 OT 算法是什么?](https://zhuanlan.zhihu.com/p/559699843)
OT算法常用于实现协同文档的底层算法,支持多个用户同时编辑文档,不会因为并发修改导致冲突,而使结果不一致或数据丢失。
7 微信小程序中使用lodash的问题
[1][微信小程序中使用lodash的问题](https://juejin.cn/post/6844903971862102030)
8 Hooks时代,如何写出高质量的react和vue组件?
高复用、低耦合封装组件
视图、交互逻辑和业务逻辑区分开来,是衡量一个组件质量的重要标准
拆分组件的时候可以参考下面几个原则:
- 拆分的组件要保持功能单一。即组件内部代码的代码都只跟这个功能相关;
- 组件要保持较低的耦合度,不要与组件外部产生过多的交互。如组件内部不要依赖过多的外部变量,父子组件的交互不要搞得太复杂等等。
- 用组件名准确描述这个组件的功能。就像函数那样,可以让人不用关心组件细节,就大概知道这个组件是干嘛的。如果起名比较困难,考虑下是不是这个组件的功能并不单一。
示例
业务逻辑
// 用户模块hook
const useUser = () => {
// react版本的用户状态
const user = useState({});
// vue版本的用户状态
const userInfo = ref({});
// 获取用户状态
const getUserInfo = () => {}
// 修改用户状态
const changeUserInfo = () => {};
// 检查两次输入的密码是否相同
const checkRepeatPass = (oldPass,newPass) => {}
// 修改密码
const changePassword = () => {};
return {
userInfo,
getUserInfo,
changeUserInfo,
checkRepeatPass,
changePassword,
}
}
交互逻辑
// 用户模块交互逻辑hooks
const useUserControl = () => {
// 组合用户hook
const { userInfo, getUserInfo, changeUserInfo, checkRepeatPass, changePassword } = useUser();
// 数据查询loading状态
const loading = ref(false);
// 错误提示弹窗的状态
const errorModalState = reactive({
visible: false, // 弹窗显示/隐藏
errorText: '', // 弹窗文案
});
// 初始化数据
const initData = () => {
getUserInfo();
}
// 修改密码表单提交
const onChangePassword = ({ oldPass, newPass ) => {
// 判断两次密码是否一致
if (checkRepeatPass(oldPass, newPass)) {
changePassword();
} else {
errorModalState.visible = true;
errorModalState.text = '两次输入的密码不一致,请修改'
}
};
return {
// 用户数据
userInfo,
// 初始化数据
initData: getUserInfo,
// 修改密码
onChangePassword,
// 修改用户信息
onChangeUserInfo: changeUserInfo,
}
}
视图
<template>
<!-- 视图部分省略,在对应btn处引用onChangePassword和onChangeUserInfo即可 -->
</template>
<script setup>
import useUserControl from './useUserControl';
import { onMounted } from 'vue';
const { userInfo, initData, onChangePassword, onChangeUserInfo } = useUserControl();
onMounted(initData);
<script>
[1][Hooks时代,如何写出高质量的react和vue组件?](https://cloud.tencent.com/developer/article/2062117)
9 如何获取Nestjs装饰器内容?
思路:只要是装饰器都可以通过 反射
去获取,关键获取到key和上下文
// 获取swagger的@ApiTags装饰器,注意getClass(类上的装饰器)
this.reflector.get<string[]>(SWAGGER_DECORATORS.API_TAGS, context.getClass())
// 获取swagger的@ApiOperation装饰器,注意getHandler(方法上的装饰器)
this.reflector.get<Partial<OperationObject>>(SWAGGER_DECORATORS.API_OPERATION, context.getHandler())
10 一些学习项目
React阵营
Kutt 使用了Node.js、Express、Passport、React、TypeScript、Next、Easy Peasy、styled-components、Recharts、PostgreSQL、Redis 等技术构建,是一个不错的学习React的开源项目。来源[1]
目的:1.学习如何封装组件 2.学习Next如何在项目中运用
Real World App 是使用 Cypress 对程序进行端到端测试的一个很好的 DEMO 项目。在 repo 中包含了示例数据,自动化测试和应用程序都可以开箱即用地运行。
它基于 create-react-app 构建,使用 TypeScript 编写,带有 Express 后端,使用 Material UI 作为 UI/组件库,使用 Formik 实现表单,使用 react-router 实现路由。来源[2]
目的:1.学习如何用Cypress测试组件 2.如何在项目中正确使用 Material UI
Win11 in React 是一个使用 React、CSS (SCSS) 和 JS 等标准 Web 技术开发的复制 Windows 11 桌面体验的React项目。让开发者可以在浏览器上就可以体验 Windows 11 操作系统的魅力。来源[1]
目的:学习终端如何在前端使用。
[1][推荐10个React开源项目](https://juejin.cn/post/7169108697950453773)
[2][有哪些值得学习的大型 React 开源项目?](https://www.51cto.com/article/715457.html)
Vue阵营
JeecgBoot-Vue3采用 Vue3.0、Vite、 Ant-Design-Vue3、TypeScript 等新技术方案,包括二次封装组件、utils、hooks、动态菜单、权限校验、按钮级别权限控制等功能。 是JeecgBoot低代码平台的vue3技术栈的全新UI版本,功能强于vue2版。
强大的代码生成器让前后端代码一键生成! JeecgBoot引领低代码开发模式(OnlineCoding-> 代码生成-> 手工MERGE), 帮助解决Java项目70%的重复工作,让开发更多关注业务。既能快速提高效率,节省成本,同时又不失灵活性
11 vue3.x显示json数据组件
[1][vue3-json-viewer](https://github.com/qiuquanwu/vue3-json-viewer)
12 判断设备-通过user-agent
简单方案:手动匹配
export enum TerminalEnum {
pc = 0,
micromessenger = 1,
h5 = 2,
}
export const TerminalEnumMap: { [k in TerminalEnum]: string } = {
0: 'Erp',
1: '小程序',
2: 'H5',
}
export function getTerminal(deviceAgent: string) {
if (/(micromessenger)/.test(deviceAgent)) {
return TerminalEnum.micromessenger
}
if (/(iphone|ipod|ipad|android)/.test(deviceAgent)) {
return TerminalEnum.h5
}
return TerminalEnum.pc
}
13 Rxjs
[1][RxJS 从入门到精通](http://rx.js.cool/)
14 changeLog使用方法
1.安装
yarn add -D standard-version
2.命令,添加到 scripts
中
{
"release:peek": "standard-version --dry-run",
"release:major": "standard-version --release-as major",
"release:minor": "standard-version --release-as minor",
"release:patch": "standard-version --release-as patch",
"release:pre": "standard-version --prerelease alpha",
"release:first": "standard-version --first-release"
}
- peek:临时在命令行中看一下生成记录(不会有任何影响)
- major、minor、patch:分别对应主版本、此版本和补丁版本,可以根据提交情况手动指定
- pre:预览版本(抢先版本),可以指定前缀,示例中为
alpha
- first:第一次生成,不会增加版本号
运行相关命令后,会自动打tag、生成changelog以及进行一次提交
15 字体Css兼容写法
[1][浅析CSS的字体兼容写法(用CSS为英文和中文字体分别设置不同的字体)及字体定义设计规范 ](https://www.cnblogs.com/goloving/p/9721328.html)
15 mongodb树形结构
[1][mongodb树形结构](https://blog.csdn.net/a273967581/article/details/84909724)
[2][mongodb单集合关联查询parent字段内容](https://juejin.cn/post/6870678533736398862)
16 acro二次封装
[1][基于vue3+Arco Design的table组件的hook二次封装](https://juejin.cn/post/7088958678912466957)
17 小程序性能优化实践
[1][小程序性能优化实践](https://developers.weixin.qq.com/community/business/course/000606628dc2e86dc0ddcbb115940d)
[2][京喜小程序的高性能打造之路](https://cloud.tencent.com/developer/article/1830523)
18 提升效率
生成器
form-create 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的表单生成组件。支持5个UI框架,并且支持生成任何 Vue 组件。内置20种常用表单组件和自定义组件,再复杂的表单都可以轻松搞定。