함수 구성 요소가 있는데 강제로 다시 렌더링하고 싶습니다.
어떻게 할 수 있습니까?
인스턴스가 없기 때문에 this
호출 할 수 없습니다 this.forceUpdate()
.
답변
? 이제 React 후크를 사용하여
반응 후크를 사용하여 이제 useState()
함수 구성 요소를 호출 할 수 있습니다 .
useState()
다음 두 가지의 배열을 반환합니다.
1. 현재 상태를 나타내는 값.
2. 그 세터. 이를 사용하여 값을 업데이트하십시오.
세터로 값을 업데이트하면 다시 렌더링 함수 구성 요소를 강제로 ,
처럼 forceUpdate
수행합니다
import React, { useState } from 'react';
//create your forceUpdate hook
function useForceUpdate(){
const [value, setValue] = useState(0); // integer state
return () => setValue(value => ++value); // update the state to force render
}
function MyComponent() {
// call your hook here
const forceUpdate = useForceUpdate();
return (
<div>
{/*Clicking on the button will force to re-render like force update does */}
<button onClick={forceUpdate}>
Click to re-render
</button>
</div>
);
}
위의 구성 요소 useForceUpdate
는 부울 상태 후크 ( useState
)를 사용하는 사용자 지정 후크 함수 ( )를 사용합니다 . 부울 상태를 토글하므로 React에게 render 함수를 다시 실행하도록 지시합니다.
편집하다
이 답변의 이전 버전에서 스 니펫은 부울 값을 사용하고 forceUpdate()
. 이제 답변을 편집 했으므로 코드 조각은 부울이 아닌 숫자를 사용합니다.
왜 ? (당신은 나에게 물어볼 것입니다)
한 번은 forceUpdate()
두 개의 다른 이벤트에서 두 번 호출되어 원래 상태에서 부울 값을 재설정하고 구성 요소가 렌더링되지 않았기 때문입니다.
때문에에 useState
(의 세터 setValue
여기), React
새와 이전 상태를 비교 하고 상태가 다른 경우에만 렌더링합니다.
답변
React v16.8 업데이트 (2019 년 2 월 16 일 realease)
React 16.8이 후크와 함께 릴리스 된 이후로 함수 구성 요소는 이제 지속적으로 유지할 수 있습니다 state
. 그 능력을 가진 당신은 지금 할 수있는 모방 를 forceUpdate
:
이 접근 방식은 다시 고려해야하며 대부분의 경우 업데이트를 강제해야 할 때 잘못된 작업을 수행 할 수 있습니다.
반응 전 16.8.0
당신은 할 수 없음, 국가없는 기능 구성 요소는 정상 functions
반환 것을 jsx
당신이에서 연장되지 않습니다으로는 수명주기 방법 반응에, 당신이 어떤 액세스 할 수 없습니다 React.Component
.
함수 컴포넌트를 render
클래스 컴포넌트 의 메소드 부분 으로 생각하십시오 .
답변
공식 FAQ ( https://reactjs.org/docs/hooks-faq.html#is-there-something-like-forceupdate )는 이제 정말로 필요한 경우 다음 방법을 권장 합니다.
const [ignored, forceUpdate] = useReducer(x => x + 1, 0);
function handleClick() {
forceUpdate();
}
답변
use-force-update 라는 타사 라이브러리를
사용
하여 반응 기능 구성 요소를 강제로 렌더링했습니다. 매력처럼 작동했습니다. 프로젝트에서 패키지 가져 오기를 사용하고 이와 같이 사용하십시오.
import useForceUpdate from 'use-force-update';
const MyButton = () => {
const forceUpdate = useForceUpdate();
const handleClick = () => {
alert('I will re-render now.');
forceUpdate();
};
return <button onClick={handleClick} />;
};
답변
면책 조항 : 문제에 대한 답이 아닙니다.
여기에 중요한 메모를 남겨주세요 :
상태 비 저장 구성 요소를 강제 업데이트하려는 경우 디자인에 문제가있을 가능성이 있습니다.
다음 경우를 고려하십시오.
- 상태를 변경하고 부모 구성 요소를 다시 렌더링 할 수있는 자식 구성 요소에 setter (setState)를 전달합니다.
- 상태 해제 고려
- 연결된 구성 요소에서 자동으로 다시 렌더링을 강제 할 수있는 Redux 저장소에 해당 상태를 넣는 것을 고려하십시오.
답변
컴포넌트에 prop을 추가하고 stateless 컴포넌트의 부모 컴포넌트에 state를 추가한다면 후크를 명시 적으로 사용하지 않고도이 작업을 수행 할 수 있습니다.
const ParentComponent = props => {
const [updateNow, setUpdateNow] = useState(true)
const updateFunc = () => {
setUpdateNow(!updateNow)
}
const MyComponent = props => {
return (<div> .... </div>)
}
const MyButtonComponent = props => {
return (<div> <input type="button" onClick={props.updateFunc} />.... </div>)
}
return (
<div>
<MyComponent updateMe={updateNow} />
<MyButtonComponent updateFunc={updateFunc}/>
</div>
)
}
답변
받아 들여지는 대답은 좋습니다. 이해하기 쉽게하기 위해서입니다.
구성 요소 예 :
export default function MyComponent(props) {
const [updateView, setUpdateView] = useState(0);
return (
<>
<span style={{ display: "none" }}>{updateView}</span>
</>
);
}
다시 렌더링을 강제하려면 아래 코드를 호출하십시오.
setUpdateView((updateView) => ++updateView);
