虾​皮​二​面

1. 手撕:React实现Rate

import axios from "axios";
import { useEffect, useState, type Dispatch, type SetStateAction } from "react";

const Rate = (props: { readonly max?: number; readonly readonly?: boolean; readonly setReadonly?: Dispatch<SetStateAction<boolean>>; }) => {
  const { max = 5, readonly = false, setReadonly = () => { } } = props;
  const [starArr, setStarArr] = useState(new Array(max).fill(false));
  return <>
    <div>
      {starArr.map((star, index) => {
        return <span
          onClick={
            () => {
              if (readonly) {
                return;
              }
              const newStarArr = starArr.map((_star, ind) => {
                return ind <= index ? true : false;
              });
              //TODO 深拷贝?
              setStarArr(newStarArr);
              axios.post('/submitStar', { data: newStarArr }).then(e => e.data).then((res) => {
                setStarArr(res);
                setReadonly(true);
              }).catch((e) => {
                console.error('error', e);
                setStarArr(starArr);
              });
            }
          }
        >
          {star ? '亮' : '暗'}
        </span>;
      })}
    </div>
  </>;
};
const max = 5;
const ShowOrder = (props: { readonly title: string; }) => {
  const { title } = props;
  const [readonly, setReadonly] = useState(false);
  const [isShowRate, setIsShowRate] = useState(false);
  const [starArr, setStarArr] = useState(new Array(max).fill(false));
  useEffect(() => {
    axios.get('/queryStar').then((res) => {
      setReadonly(res.data);
      setStarArr(starArr);
    });
  }, []);
  return <div
    onMouseEnter={() => {
      setIsShowRate(true);
    }}
    onMouseLeave={() => {
      setIsShowRate(false);
    }}
  >
    <h1
    >{title}</h1>
    {isShowRate ? <Rate
      readonly={readonly}
      setReadonly={setReadonly}
      starArr={starArr}
      max={5}
    /> : null}
  </div>;
};

2. 算法

// 改造这个方法,使其支持 timeout
async function request(url, options) {
    const {timeout = 1000, ...restOptions} = options
    const rsp = await fetch(url, restOptions)
    return rsp
}

request('http://127.0.0.1:1337', {timeout: 1})
.then(console.log)
.catch(console.error) // timeout 后会到这里
async function newRequest (url: string, options: { readonly timeout?: number; }) {
  const { timeout = 1000, ...restOptions } = options;
  return Promise.race([
    () => fetch(url, restOptions),
    () => new Promise((_resolve, reject) => {
      setTimeout(reject, timeout);
    }),
  ]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值