ARTS 打卡第 6 周

107 阅读3分钟

1、Algorithm 一道算法题

盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明: 你不能倾斜容器。

这里考虑用双指针来求解。 用一个左指针 L 代表数组 height 的左边线,右指针 R 代表 height 的右边线。 找到这样的 L 和 R,使得 (R-L)*Math.min(height(L),height(R)) 最小。 这里 L 初始值为 0, R 初始值为 height.length-1。让 L 和 R 向中间移动,每次通过上述公式计算盛水的水量,如果 height[L] <= height[R],则让 L 向 R靠近,否则让 R 向 L 靠近,以此进行指针的移动。

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function(height) {
   let L = 0,R =height?.length-1;
    let max = (R-L) * Math.min(height[R],height[L]);
    
    while(L<R){
        const product = (R-L)*Math.min(height[R],height[L]);
        if(product > max){
            max = product;
        }
        if(height[L] <= height[R]){
            L++;
        }else{
            R--;
        }
    }
    
    return max;
}

2、Review 读一篇英文文章

React Forms - Formik vs. Hook-Form vs. Final-Form

  • 表单是什么? 表单通过适当的 UI & 交互,将用户的输入转化为特定的数据结构
  • 现有的表单方案有哪些? 从受控组件和非受控组件,可以分成 react-hook-form (非受控)和 formik、react-final-form(受控)
  • 各个表单方案的差别? 各个表单方案归根结底,其实是在解决各个表单项之间以及表单项与表单整体的通信问题。
  • 孰优孰劣? 如果是开始一个新项目,建议使用 react-hook-form,因为它具有以下优点: 1、没有依赖,并且相比于其他2个表单方案它的模版代码更少。 2、很直观,而且验证表单项的值的代码书写相比于其他方案更少。

3、Technique/Tips 分享一个小技术

表单验证,有相应的库,比如很受欢迎的 Yup。 Yup 采用了 Schema 的方式进行验证,比如:

import { object, string, number, date, InferType } from 'yup';

let userSchema = object({
  name: string().required(),
  age: number().required().positive().integer(),
  email: string().email(),
  website: string().url().nullable(),
  createdOn: date().default(() => new Date()),
});

// parse and assert validity
const user = await userSchema.validate(await fetchUser());

type User = InferType<typeof userSchema>;

Yup 具有以下的杀手锏优点:

1、简洁而富有表现力的模式接口,适用于建模简单到复杂的数据模型

2、强大的TypeScript支持。从模式中推断静态类型,或确保模式正确实现了类型

3、内置的异步验证支持。同样适用于服务器端和客户端的验证

4、可扩展:添加自己的类型安全方法和模式 丰富的错误详细信息,轻松进行调试

4、Share 分享一个观点

学习表单方案的源码,是在学习状态管理和底层数据模型、表单项之间的联动、表单项和表单整体的通信、动态校验的实现方法。