다시 액세스:useReducer
14432 단어 reacttutorialwebdevjavascript
주 정부의 최신 상황
이 시리즈에서, 우리가 만든 모든 코드 세션과 샌드박스는
useState
를 사용하여 구성 요소 데이터를 관리합니다.그러나 React는 데이터 저장에 사용할 추가 갈고리를 제공했다. useReducer
useState
는 단일 값을 저장하고 설정할 수 있지만 useReducer
는 관련 값을 동시에 저장하고 조작하여 더욱 복잡하거나 구조화된 데이터를 처리하는 데 도움을 준다.사용자 교육기의 해부
useState
와 유사하게 useReducer
는 두 개의 값을 포함하는 그룹을 되돌려줍니다.const [value, setValue] = useState(null)
const [state, dispatch] = useReducer(reducer, initialState)
useReducer
갈고리는 최대 세 개의 매개 변수를 포함한다.useState
갈고리를 제공할 때 기본값을 제공하는 방식과 유사하다....calculating the initial state outside the reducer. This is also handy for resetting the state later in response to an action. ~ React docs
사용 상태와의 차이
useReducer
와 useState
가 각각 상태치를 어떻게 갱신하는지 더 잘 설명하기 위해 나란히 살펴보자.다음 코드 세그먼트는 두 개의 훅을 사용하여 상태 값을 인스턴스화하고 업데이트하는 데 필요한 코드를 보여 줍니다.// useState
const [name, setName] = useState("")
setName("Ryan")
console.log(name) // 'Ryan'
// useReducer
const initialState = {
name: "",
}
function reducer(state, action) {
switch (action.type) {
case "update-name":
return {
name: action.value,
}
}
}
const [state, dispatch] = useReducer(reducer, initialState)
dispatch({ type: "update-name", value: "Ryan" })
console.log(state.name) // 'Ryan'
여기서 첫 번째 차이점은 useState
가 문자열을 저장할 때useReducer
의 초기 값이 대상이라는 것이다.이 경우 키가 하나뿐입니다(즉, name
. 그러나 UI를 구축할 때 우리는 항상 상태에 더 많은 키를 추가할 수 있습니다.그 다음에
useState
의setter 함수는 그 값을 직접 업데이트하고 useReducer
는 동작을 보냅니다.그리고 Reducer 함수는 어떤 종류의 조작을 촉발했는지, 그리고 그 상태를 어떻게 업데이트하는지 확인합니다.주의: 만약 과거에 그것을 사용한 적이 없다면, 이것이 바로 Redux의 작업 원리입니다.
실상
아래의 모래상자에서 나는 데이트를 계획하는 표를 세웠다.여러 종류의 입력이 있지만 모든 값은 같은 입력에 있기 때문이다
<form>
.우리는 모든 입력 값을 자신의
useState
갈고리에 저장하지 않고 폼의 모든 값을 단일useReducer
로 저장하고 관리할 수 있다.이 예에서, 그 상태는 여러 개의 키를 가진 대상이며, 키마다 우리가 저장할 다른 값을 대표한다.개인적으로 말하자면, 이것은 this.state
우리가 연결되기 전의 class
구성 요소를 생각나게 한다.App.js
에서 초기 상태에 대한 정의는 다음과 같습니다.const blankForm = {
name: "",
email: "",
date: "",
time: "",
feeling: "3",
}
const [formState, dispatch] = useReducer(reducer, blankForm)
blankForm
객체의 각 필드는 양식에 입력된 값을 표시하고 저장합니다.email
의 초기 상태가 빈 문자열이기 때문에 렌더링할 때 useReducer
의 상태에서 값을 읽을 때 전자 메일 입력이 비어 있습니다.<input
className="Form__input"
name="email"
type="email"
value={formState.email}
/>
이를 실현하기 위해 우리는 입력 onChange
처리 프로그램을 설정하여 특정한 조작을 나누어 업데이트 상태를 만들었다.다음은 이메일 입력의 현재 모습입니다.<input
className="Form__input"
name="email"
type="email"
value={formState.email}
onChange={event => {
dispatch({ type: "setEmail", value: event.target.value })
}}
/>
위의 코드 세션에서 우리는 전문적으로 setEmail
조작을 분배한다.우리의 Reducer 함수에서 switch
문장은 case
와 일치하는 action.type
를 찾고 그 논리를 실행하여 상태를 업데이트합니다.function reducer(state, action) {
switch (action.type) {
case "setName":
return {
...state,
name: action.value,
}
case "setEmail":
return {
...state,
email: action.value,
}
case "setDate":
return {
...state,
date: action.value,
}
case "setTime":
return {
...state,
time: action.value,
}
case "setFeeling":
return {
...state,
feeling: action.value,
}
case "reset":
return blankForm
}
}
예를 들어 setEmail
를 호출할 때 Reducer는 현재 상태 정보를 포함하는 새로운 대상을 되돌려주지만 email
필드도 업데이트합니다.return {
...state,
email: action.value,
}
마지막으로 useReducer
갈고리의 상태가 업데이트되었기 때문에 구성 요소는 다시 렌더링되고 <input />
모두 formState
에서 업데이트된 값을 표시합니다.성능에 대한 설명
내 친구Josef Aidt가 본문의 초기 초고를 검토할 때 지적한 바와 같이 우리는 상술한 모래상자 중
useReducer
의 용례에 어느 정도 성능 영향을 미친다.입력한 값이 변경될 때마다 입력한 함수onChange
가 터치되기 때문에 우리는 실제적으로 키를 눌렀을 때마다 구성 요소를 다시 렌더링합니다.이것은 프레젠테이션 목적으로 가능하지만, 생산 응용 프로그램을 구축할 때 주의해야 한다.이러한 상황을 피할 수 있는 두 가지 방법이 있다.
ref
s에 저장하지 않고 useReducer
저장합니다. 변경ref
의 값은 구성 요소를 다시 렌더링하지 않기 때문입니다. (자세한 정보는 저의useRef 글을 참조하십시오).Reference
이 문제에 관하여(다시 액세스:useReducer), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ryanharris/react-hooks-revisited-usereducer-5mo텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)