TypeScript를 사용하여 한 줄에 상태기 작성
22358 단어 reacttypescriptstatemachineswebdev
그러나 Redux 등과 달리 상태기가 프로젝트에 설치된 라이브러리는 아닙니다!일단 네가 개념적으로 그것들을 이해하게 되면, 그것들은 스스로 문제를 사고하는 방식이 될 것이다.
요컨대 이 문장은 너를 도울 수 있을 거야...
⚠️ 참고: 다음 예제에서는 React가 사용됩니다.그러나 핵심 학습 개념은 어떠한 전단 프레임워크로 옮겨진다
개념 먼저 한 장면
만약 우리가 UI의 복잡성을 이야기한다면, 폼 관리는 가장 쉽게 볼 수 있는 곳이다.만약 우리가 간단한 등록 화면을 가지고 있다면, 사용자 이름과 비밀번호를 사용해서 실현해야 한다.일을 좀 재미있게 하자. 우리가 믿을 수 없는 어린 시절의 기억을 회복하고 있다고 가정하자. 즉, !
Club Penguin
움츠러들지 마라.적어도 플래시에 만들어진 건 아니에요.😬
우리는 또한 사용자가 표를 작성할 때 일부 장면을 고려하기를 바란다.즉, a) 제출 전 암호 검증과 b) API에 보낼 때 제출 단추를 사용하지 않도록 지원해야 한다.다음은 가능한 흐름입니다.
일반적인 방법: 만리블
우선, 많은 개발자들이 취할 수 있는 방법 을 소개합니다.우리가 원하는 상호작용에 근거하여 우리는 마땅히
const ClubPenguinSignup = () => {
const [invalid, setInvalid] = React.useState(false);
const [submitting, setSubmitting] = React.useState(false);
const [submitted, setSubmitted] = React.useState(false);
...
// state vars for username and password, markup, etc.
}
제출/제출 표지판에 대해 우리는 양식을 제출할 때 좋은 리셋 함수를 사용할 수 있다.const onSubmit = async (event: React.FormEvent) => {
event.preventDefault();
setSubmitting(true); // we're now submitting
const addedUser = await arcticAuthService({ username, password });
if (addedUser?.success) { // if signup call worked...
setSubmitting(false); // we're no longer submitting
setSubmitted(true); // we've submitted
}
};
마지막으로, 우리는 사용자가 비밀번호를 입력할 때 비밀번호를 검증하는 초기본 리셋을 진행할 수 있다.이 경우 입력 값의 변경 사항 (즉, 사용 CodeSandbox 을 수신하고 안전하지 않은 구문 검사기를 통해 이 값을 실행합니다.const onChangePassword = (event: React.FormEvent<HTMLInputElement>) => {
setPassword(event.currentTarget.value);
checkPasswordSecurity(event.currentTarget.value);
};
const checkPasswordSecurity = (changedPassword: string) => {
let insecure = false; // we first assume the value is secure (excuse the double negative)
["club", "penguin", "puffle"].forEach((badWord) => {
if (changedPassword.includes(badWord)) {
insecure = true;
}
});
setInvalid(insecure);
};
제어 입력 왁자지껄한 곳
너무 좋아요.이것은 결코 그리 나쁘지 않은 것 같다...하지만 우리는 아직 끝나지 않았다.이 모델을 다시 검사하면 버튼에 표시할 세 개의 다른 표시기가 있습니다 (정상, 불러오기, 완료).각각에 대해 별도의 부울 로고를 사용하기 때문에, 단추 배경 + 맛 텍스트를 설정하기 위해 일부 맵이 필요합니다.
const getButtonLabel = (): string => {
if (submitting) {
return "•••";
} else if (submitted) {
return "Time to play!";
} else {
return "Let's get sliding!";
}
};
const getButtonClass = (): string => {
if (submitting) {
return "submitting";
} else if (submitted) {
return "submitted";
} else if (invalid) {
return "invalid";
} else {
return "";
}
};
return (
...
<button type="submit" className={getButtonClass()}>
{getButtonLabel()}
</button>
)
우리는 원소의 영사기 하나만 필요하기 때문에, 이것은 결코 무서워 보이지 않는다.그럼에도 불구하고 UI와 상태 변수를 더 많이 추가할 때 제어를 잃기 쉽습니다...const [usenameTaken, setUsernameTaken] = React.useState(false);
const [apiError, setApiError] = React.useState(false);
const [serverAtMaxCapacity, setServerAtMaxCapacity] = React.useState(false);
const [invalid, setInvalid] = React.useState(false);
const [submitting, setSubmitting] = React.useState(false);
const [submitted, setSubmitted] = React.useState(false);
const getButtonClass = (): string => {
// 100 lines of ifs
};
우리는 불가능한 주도 많이 고려했다.예를 들어 우리는'제출'과'제출'을 동시에 해서는 안 된다. 비밀번호가 잘못되었을 때, 이 두 가지 모두 true
해서는 안 된다.위의 미친 상태가 폭발한 것을 감안하면, 우리는 최종적으로 이러한 무효 상태를 방지하기 위해 모든 변수를 회복할 것이다.// api responds that servers are at max capacity, so no sign ups allowed
setServerAtMaxCapacity(true)
setSubmitting(false)
setSubmitted(false)
setApiError(true)
...
만약 무엇이 다르다면, 우리는 부울 값이 두 개가 넘으면 표지판을 여기저기 바꾸지 않을 것이다.다행히도 TypeScript는 우리에게 이런 초능력을 주었다💪우리의 새로운 방법: 가난한 사람들의 상태기
네가 이미 짐작한 바와 같이, 우리는 간단한 상태기로 이 부광 문제를 해결할 수 있다.나는 이런 방법을'the'라고 하는데, 이것도 매우 적합한 제목이라고 한다.
상태 변수를 단일 유형으로 모델링하는 Xstate 라이브러리가 필요합니다.
type FormState = 'idle' | 'invalid' | 'submitting' | 'submitted'
당신은 당연히 이 때문에 매거를 사용할 수 있습니다.나는 단지 문자열 문자를 더 좋아할 뿐이다. 왜냐하면 그것들은 좀 짧고, 가독성이 더욱 강하기 때문이다.유형을 정의하면 모든 상태 변수를 하나로 압축할 수 있습니다.
const [formState, setFormState] = React.useState<FormState>("idle");
여기서 비밀번호를 재구성하고 리셋을 제출하는 것은 매우 쉽다.const checkIfPasswordIsSecure = (changedPassword: string) => {
setFormState("idle"); // not invalid yet
["club", "penguin", "puffle"].forEach((badWord) => {
if (changedPassword.includes(badWord)) {
setFormState("invalid"); // oops! Looks like it's invalid after all
}
});
};
const onSubmit = async (event: React.FormEvent) => {
event.preventDefault();
if (formState === "invalid") return; // don't submit if our password is invalid
setFormState("submitting");
const addedUser = await arcticAuthService({ username, password });
if (addedUser?.id) {
setFormState("submitted"); // no need to set submitting to false, since we don't have 2 states to consider anymore!
}
};
우리가 비추는 버튼className
을 기억하십니까?우리의 상태는 문자열로 표시되기 때문에 우리는 그것들을 CSS에 직접 전달할 수 있다✨return (
<button type="submit" className={formState /* our state is our CSS */}>
...
</button>
)
이런 방법은 CSS를 제어하기에 매우 편리하다.우리는 끊임없이 클래스를 추가하고 삭제할 필요가 없다. 단지 어떤 클래스를 적용하는지 바꾸기만 하면 된다.우리의 새로운 방법을 사용하다✨
이것은 작업 코드 샌드박스이다 진일보하다🚀
물론, 이것은 매우 간단한 예시이며, 당신의 용례에 그다지 적합하지 않을 수도 있습니다.예를 들어, 주어진 시간에 여러 상태를 유지하거나 잘못된 변환을 방지할 수 있습니다. 예를 들어, 먼저
idle
을 통과하지 않으면 submitted
에서 submitting
로 전환할 수 없습니다.전자는 여러 개의 상태 변수만 필요할 수 있으므로 여러 개
FormState
유형을 만들어서 기분이 어떤지 고려해 보십시오.그럼에도 불구하고, 당신은 충분한 복잡성을 가지고 있을 수 있기 때문에, 주 관리 창고는 매우 의미가 있다.봐라
, 이게 너처럼 들리면!당신을 놀라게 하기 위해서 저는 인터넷에서 몇 가지 고품질의 프레젠테이션을 찾았습니다. 볼 만합니다.
보다 복잡한 ReactJS 양식 작성 정보이것은 매우 길지만, 네가 시간을 쓸 만한 가치가 있다.
Vanilla JS 드래그 앤 드롭 상호 작용 생성 정보이것은 더욱 밀집된 CSS이며,
className
수법을 내가 위에서 보여 주었다.프레임 간에 상태기 모델링 UI를 사용합니다.이 주제에 관한 최고의 회의 강연
X 상태 뭐 공부 해요?
아주 좋아요.만약 당신이 놓쳤다면, 나는 을 발표하여 더 많은 이런 지식의 보고를 탐색할 것이다!
이 일은 웹 개발 문제를 해결했다my "web wizardry" newsletter.다시 말하면 우리의 모든 웹 프로젝트를 돌아가는 서투른 브라우저 API, 구부러진 CSS 규칙, 반접근 가능한 HTML은 무엇입니까?만약 네가 틀을 뛰어넘고 싶다면, 이것은 너에게 주는 것이다, 사랑하는 인터넷 마법사🔮
"first principles" . 나는 영원히 가르치고 스팸메일을 보내지 않겠다고 보증한다❤️
Reference
이 문제에 관하여(TypeScript를 사용하여 한 줄에 상태기 작성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bholmesdev/writing-a-state-machine-in-one-line-with-typescript-3h9d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)