useReducer 개선 코드 사용
17894 단어 reactjavascript
useReducer
에 관한 것이다.Checkbox
어셈블리의 경우이 구성 요소는 간단한 상태를 가진 구성 요소의 완벽한 예입니다.확인란이 선택되었거나 선택되지 않았습니다.checked
는 상태값이고, setChecked
는 상태를 바꾸는 함수이다.어셈블리가 처음 렌더링될 때checked
값은 false
입니다.function Checkbox() {
const [checked, setChecked] = useState(false);
return (
<>
<input
type="checkbox"
value={checked}
onChange={() => setChecked(checked => !checked)}
/>
{checked ? "checked" : "not checked"}
</>
);
}
이 기능은 효과가 있지만 한 가지 측면에서 경고가 발생할 수 있습니다.onChange={() => setChecked(checked => !checked)}
자세히 보다.언뜻 보기에는 괜찮은데, 우리가 골치 아프게 하는 거 아니야?현재 값 checked
을 받아들이고 반대 값 !checked
을 되돌려 주는 함수를 보내고 있습니다.이것은 필요한 것보다 더 복잡할 수 있다.개발자는 잘못된 정보를 보내서 전체 과정을 파괴하기 쉽다.이렇게 처리하는 것보다 왜 전환 기능을 제공하지 않습니까?같은 동작을 수행하는
toggle
함수를 추가합니다. 호출 setChecked
하고 현재 값 checked
과 반대되는 값을 되돌려줍니다.function Checkbox() {
const [checked, setChecked] = useState(false);
function toggle() {
setChecked(checked => !checked);
}
return (
<>
<input type="checkbox" value={checked} onChange={toggle} />
{checked ? "checked" : "not checked"}
</>
);
}
이렇게 하는 것이 더 좋다.onChange
는 예측 가능한 값으로 설정되었다. 함수toggle
.우리는 이 함수가 매번 어느 곳에서든지 무엇을 하는지 안다.checkbox 구성 요소를 사용할 때마다, 우리는 더욱 진일보하여, 더욱 예측 가능한 결과를 낼 수 있다.우리가 setChecked
함수에서 toggle
에 보낸 함수를 기억하십니까?setChecked(checked => !checked);
우리는 지금 다른 이름으로 이 함수 checked => !checked
: 감속기를 인용한다.reducer 함수의 가장 간단한 정의는 현재 상태를 받아들이고 새로운 상태로 돌아가는 것입니다.checked
가 false
라면 반대true
로 돌아가야 한다.우리는 논리를 하나의 Reducer 함수로 추상화할 수 있다. 이 함수는 이 행위를 onChange
이벤트로 하드코딩하는 것이 아니라 항상 같은 결과를 낳을 것이다.구성 요소useState
가 아닌 useReducer
를 사용합니다.function Checkbox() {
const [checked, toggle] = useReducer(checked => !checked, false);
return (
<>
<input type="checkbox" value={checked} onChange={toggle} />
{checked ? "checked" : "not checked"}
</>
);
}
useReducer
수신 감속기 기능과 초기 상태false
.그리고 우리는 onChange
함수를 toggle
로 설정하고 Reducer 함수를 호출할 것이다.우리 초기의 감속기
checked => !checked
가 좋은 예였다.함수에 같은 입력을 제공하면 같은 출력을 예상해야 합니다.이 개념은 자바스크립트Array.reduce
에서 기원한다.reduce
근본적으로 말하자면 이것은 Reducer가 하는 일과 같다. 함수(모든 값을 하나의 값으로 축소)와 초기 값을 받아들인 다음에 하나의 값을 되돌려준다.Array.reduce
감속기 함수와 초기 값을 받아들인다.numbers
그룹의 모든 값에 대해 값을 되돌릴 때까지 감축기를 호출합니다.const numbers = [28, 34, 67, 68];
numbers.reduce((number, nextNumber) => number + nextNumber, 0); // 197
Array.reduce
에 보낸 Reducer는 두 개의 인자를 받아들인다.여러 매개변수를 Reducer 함수로 보낼 수도 있습니다.function Numbers() {
const [number, setNumber] = useReducer(
(number, newNumber) => number + newNumber,
0
);
return <h1 onClick={() => setNumber(30)}>{number}</h1>;
}
매번 클릭h1
할 때마다 우리는 총수에 30을 더한다.복잡한 상태를 처리하는 데 사용되는 useReducer
useReducer
상태가 복잡해지면 상태 업데이트를 예측 가능하게 처리할 수 있습니다.사용자 데이터가 포함된 객체를 고려하려면 다음과 같이 하십시오.const firstUser = {
id: "0391-3233-3201",
firstName: "Bill",
lastName: "Wilson",
city: "Missoula",
state: "Montana",
email: "[email protected]",
admin: false
};
그리고 우리는 User
라는 구성 요소가 있는데 firstUser
라는 구성 요소가 초기 상태로 설정되어 해당 데이터를 표시합니다.function User() {
const [user, setUser] = useState(firstUser);
return (
<div>
<h1>
{user.firstName} {user.lastName} - {user.admin ? "Admin" : "User"}
</h1>
<p>Email: {user.email}</p>
<p>
Location: {user.city}, {user.state}
</p>
<button>Make Admin</button>
</div>
);
}
상태를 관리할 때 자주 발생하는 오류는 덮어쓰기 상태입니다.<button
onClick={() => {
setUser({ admin: true });
}}
>
Make Admin
</button>
이렇게 하면 firstUser
의 상태를 덮어쓰고 setUser
함수에 보내는 내용으로 바꿉니다. {admin: true}
이렇게 하면 사용자의 현재 값을 분산한 다음 admin
값을 덮어쓰면서 수정할 수 있습니다.<button
onClick={() => {
setUser({ ...user, admin: true });
}}
>
Make Admin
</button>
이것은 초기 상태를 사용하고 새 키/값을 입력합니다: {admin: true}
.우리는 오류가 발생하기 쉽도록 각각 onClick
에서 이 논리를 다시 써야 한다.내가 내일 응용 프로그램으로 돌아갈 때, 나는 이 일을 하는 것을 잊어버릴 수도 있다.function User() {
const [user, setUser] = useReducer(
(user, newDetails) => ({ ...user, ...newDetails }),
firstUser
);
...
}
그런 다음 감속기에 새 상태 값newDetails
을 보내고 객체를 밀어 넣습니다.<button
onClick={() => {
setUser({ admin: true });
}}
>
Make Admin
</button>
이 모드는 상태가 여러 개의 하위 값이나 다음 상태가 이전 상태에 의존할 때 매우 유용합니다.이곳에서 우리는 전파의 힘을 이용하고 있다.모든 사람에게 전파를 가르치면 그들은 하루를 전파할 것이다.모든 사람을 교육자에게 가르치면 그들은 평생 전파될 것이다.
Reference
이 문제에 관하여(useReducer 개선 코드 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/eveporcello/improving-code-with-usereducer-2lda텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)