Myślący bezgłowy interfejs użytkownika
Dec 06 2022
Komponenty, które nie mają interfejsu… Filozofia komponentów Headless Web składa się z dwóch rzeczy: interfejsu i logiki sterującej interfejsem. Oddzielenie logiki od interfejsu jest podstawową filozofią headless.
Komponenty, które nie mają interfejsu…
Filozofia bezgłowego
Komponenty sieciowe składają się z dwóch rzeczy, interfejsu i logiki sterującej interfejsem.
Oddzielenie logiki od interfejsu jest podstawową filozofią headless.
Pozwala nam budować wysoce elastyczne, adaptacyjne komponenty sieciowe, które mogą działać w różnych bibliotekach interfejsu użytkownika.
Przykład — samodzielny przycisk przełączania
Będziemy używać React Hooks do zbudowania przycisku przełączania.
Aby zbudować przycisk, potrzebujemy statusu wskazującego, czy przycisk jest wciśnięty, czy nie, oraz procedury obsługi zdarzeń, która przełącza status po kliknięciu.
Definicja typów
type ButtonPropsGetter = () => {
onClick: (e: MouseEvent<HTMLButtonElement>) => void;
"aria-pressed": "true" | "false";
};
type StateGetter = () => boolean;
type ToggleButtonGetters = {
getButtonProps: ButtonPropsGetter;
getState: StateGetter;
};
const useToggleButton = (): ToggleButtonGetters => {
const [status, setStatus] = useState(false);
const onClick = () => {
setStatus((prev) => !prev);
};
const getButtonProps: ButtonPropsGetter = () => {
return { onClick, "aria-pressed": status ? "true" : "false" };
};
const getState: StateGetter = () => status;
return { getButtonProps, getState };
};
Konsumpcja
import useToggleButton from "./useToggleButton";
const App: FC = () => {
const { getButtonProps, getState } = useToggleButton();
const status = getState();
return (
<div>
<h1>Hello World!</h1>
{/* We can replace this button with any button */}
<button {...getButtonProps()}>{status ? "ON" : "OFF"}</button>
</div>
);
}
Popularne biblioteki bezgłowe
- Stół Tanstack
- Strefa zrzutu reakcji
- Redukcja

![Czym w ogóle jest lista połączona? [Część 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































