常用三方库
use-immer
use-debounce
tsx
import { useDebouncedCallback } from 'use-debounce';
function Input({ defaultValue }) {
const [value, setValue] = useState(defaultValue);
// Debounce callback
const debounced = useDebouncedCallback(
// function
(value) => {
setValue(value);
},
// delay in ms
1000
);
// you should use `e => debounced(e.target.value)` as react works with synthetic events
return (
<div>
<input defaultValue={defaultValue} onChange={(e) => debounced(e.target.value)} />
<p>Debounced value: {value}</p>
</div>
);
}react-hooks-form
tsx
import { useState } from "react";
import { useForm } from "react-hook-form";
import Header from "./Header";
export function App() {
const { register, handleSubmit } = useForm();
const [data, setData] = useState("");
return (
<form onSubmit={handleSubmit((data) => setData(JSON.stringify(data)))}>
<Header />
<input {...register("firstName")} placeholder="First name" />
<select {...register("category", { required: true })}>
<option value="">Select...</option>
<option value="A">Option A</option>
<option value="B">Option B</option>
</select>
<textarea {...register("aboutYou")} placeholder="About you" />
<p>{data}</p>
<input type="submit" />
</form>
);
}@tanstack/react-table
tsx
import { useReactTable } from '@tanstack/react-table'
function App() {
const table = useReactTable(options)
// ...render your table
}动效库 framer-motion
tsx
<motion.div
initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }}
/>轮播图 embla-carousel
TS 校验库zod
常用UI组件库
- Antd
- Headless UI
- radix-ui
- chakra-ui
- headless ui
