[javascript] React-함수 컴포넌트를 강제로 렌더링하는 방법은 무엇입니까?

함수 구성 요소가 있는데 강제로 다시 렌더링하고 싶습니다.

어떻게 할 수 있습니까?
인스턴스가 없기 때문에 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} />;
};


답변

면책 조항 : 문제에 대한 답이 아닙니다.

여기에 중요한 메모를 남겨주세요 :

상태 비 저장 구성 요소를 강제 업데이트하려는 경우 디자인에 문제가있을 가능성이 있습니다.

다음 경우를 고려하십시오.

  1. 상태를 변경하고 부모 구성 요소를 다시 렌더링 할 수있는 자식 구성 요소에 setter (setState)를 전달합니다.
  2. 상태 해제 고려
  3. 연결된 구성 요소에서 자동으로 다시 렌더링을 강제 할 수있는 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);