React에서 상태와 소품의 차이점은 무엇입니까?


559

나는 React에서 Pluralsight 코스를보고 있었고 강사는 소품을 변경해서는 안된다고 말했습니다. 나는 소품 대 상태에 관한 기사 (uberVU / react-guide) 를 읽고 있는데

props와 state changes는 렌더 업데이트를 유발합니다.

이 기사의 뒷부분에서 다음과 같이 말합니다.

소품 (속성의 약자)은 구성 요소의 구성이며, 가능하면 옵션입니다. 그것들은 위에서 받고 불변입니다.

  • 소품은 변할 수 있지만 불변해야합니까?
  • 언제 소품을 사용해야하고 언제 상태를 사용해야합니까?
  • React 컴포넌트에 필요한 데이터가있는 경우 getInitialState? 를 통해 React 컴포넌트의 props 또는 setup을 통해 전달해야합니다 .


7
이것은 매우 좋은 질문입니다. 실제로 아무도 간단한 대답을하지 않는 것 같습니다 : /
Thomas

답변:


670

소도구와 국가는 관련이 있습니다. 한 구성 요소의 상태는 종종 하위 구성 요소의 소품이됩니다. 소품은 부모의 render 메소드 내에서 자식에게 전달됩니다. React.createElement()JSX를 사용하는 경우 친숙한 태그 속성에 대한 두 번째 인수 입니다.

<MyChild name={this.state.childsName} />

의 부모 상태 값 childsName이 자녀의 값이 됩니다 this.props.name. 아동의 관점에서 prop이라는 이름은 변경할 수 없습니다. 변경해야 할 경우 부모는 내부 상태 만 변경하면됩니다.

this.setState({ childsName: 'New name' });

그리고 React는 그것을 당신을 위해 아이에게 전파 할 것입니다. 자연스러운 후속 질문은 아이가 이름 소품을 변경해야하는 경우 어떻게해야합니까? 이것은 일반적으로 자식 이벤트와 부모 콜백을 통해 수행됩니다. 자식은 예를 들어이라는 이벤트를 노출시킬 수 있습니다 onNameChanged. 그러면 부모는 콜백 핸들러를 전달하여 이벤트를 구독합니다.

<MyChild name={this.state.childsName} onNameChanged={this.handleName} />

자식은 예를 들어을 호출하여 요청 된 새 이름을 이벤트 콜백의 인수로 전달하고 this.props.onNameChanged('New name')부모는 이벤트 핸들러의 이름을 사용하여 상태를 업데이트합니다.

handleName: function(newName) {
   this.setState({ childsName: newName });
}

2
감사! 그래서 몇 가지 질문이 더 있습니다 : 1. 사람들이 왜 소품을 바꾸어서는 안된다고 말하는가? 2. 데이터 부트 스트랩을 어디에 두나요? getInitialState와 같은 구성 요소를 초기화 할 때 또는 구성 요소 외부에 놓고 데이터를 사용할 수있을 때 구성 요소를 렌더링합니까?
skaterdav85

37
1. 이것이 React의 '기능적'측면입니다. 모든 데이터 (거의)가 아래쪽으로 흐릅니다. 소품은 부모가 소유하기 때문에 부모 만 변경해야합니다. 이상적으로 아이들은 무국적이어야합니다. 실제로는 불가능합니다 (React 사이트의 양식 문서 참조). 2. 상단에 급지하거나 권장되는 방법으로 별도의 물체에 보관할 수 있습니다. 널리 사용되는 방법 중 하나는 Flux이며, Stores라는 단일 객체를 사용합니다. 이것은 더 큰 건축 패턴의 일부입니다. 또한 Facebook에서 공개 소스이며 React와 작동하도록 설계되었습니다.
Todd

2
상점은 큰 글로벌 변수와 비슷합니까?
SuperUberDuper

3
예, Flux 스토어는 클라이언트 측 캐시입니다. Facebook 및 Redux의 최근 출시 된 Relay와 같은 다른 패턴도 있습니다.
Todd

6
이것을 조금 정리하자면 : state는 내부에서 관리되는 구성 요소 데이터이고 props는 위에서 관리되고 전달되는 구성 요소 데이터입니다.
Mark

221

부모-자식 의사 소통을 위해 소품을 전달하십시오.

state 를 사용 하여 현재 페이지에 필요한 데이터를 컨트롤러보기에 저장하십시오.

props 를 사용 하여 데이터 및 이벤트 핸들러를 하위 구성 요소로 전달하십시오.

이 목록은 구성 요소의 데이터를 작업 할 때 도움이됩니다.

소품

  • 불변이다
    • React가 빠른 참조 확인을 수행 할 수있게합니다.
  • 뷰 컨트롤러에서 데이터를 전달하는 데 사용됩니다.
    • 최상위 컴포넌트
  • 더 나은 성능을
    • 이것을 사용하여 자식 구성 요소에 데이터를 전달

상태

  • 뷰 컨트롤러에서 관리해야합니다.
    • 최상위 컴포넌트
  • 변하기 쉬워
  • 성능이 나쁘다
  • 자식 구성 요소에서 액세스하면 안됩니다
    • 대신 소품으로 전달하십시오.

부모-자식 관계가없는 두 구성 요소 간의 통신을 위해 고유 한 글로벌 이벤트 시스템을 설정할 수 있습니다. componentDidMount ()에서 이벤트를 구독하고 componentWillUnmount ()에서 구독을 취소하고 이벤트를 수신하면 setState ()를 호출하십시오. 플럭스 패턴은 이것을 배열하는 가능한 방법 중 하나입니다. -https : //facebook.github.io/react/tips/communicate-between-components.html

어떤 구성 요소에 상태가 있어야합니까?

대부분의 컴포넌트는 소품에서 일부 데이터를 가져 와서 렌더링해야합니다. 그러나 때때로 사용자 입력, 서버 요청 또는 시간 경과에 응답해야합니다. 이를 위해 당신은 상태를 사용합니다.

가능한 많은 구성 요소를 상태 비 저장 상태 로 유지하십시오 . 이렇게하면 상태를 가장 논리적으로 격리하고 중복성을 최소화하여 응용 프로그램에 대한 추론을 쉽게 할 수 있습니다.

일반적인 패턴은 데이터를 렌더링하는 상태 비 저장 구성 요소를 여러 개 만들고 계층 구조에서 구성 요소 위에 상태 저장 구성 요소를 가져와 소품을 통해 하위 상태로 전달하는 것입니다. 상태 저장 구성 요소는 모든 상호 작용 논리를 캡슐화하고 상태 비 저장 구성 요소는 선언적인 방식으로 데이터 렌더링을 처리합니다. -https : //facebook.github.io/react/docs/interactivity-and-dynamic-uis.html#what-components-should-have-state

어떤 상태로 가야합니까?

상태는 구성 요소의 이벤트 핸들러가 UI 업데이트를 트리거하기 위해 변경할 수있는 데이터를 포함해야합니다. 실제 앱에서는이 데이터가 매우 작고 JSON 직렬화 가능한 경향이 있습니다. 상태 저장 구성 요소를 빌드 할 때 가능한 상태의 최소 표현을 고려하고 해당 특성 만 this.state에 저장하십시오. render () 내부에서는이 상태를 기반으로 필요한 다른 정보 만 계산하면됩니다. 중복 또는 계산 된 값을 상태에 추가하면 React 컴퓨팅에 의존하지 않고 명시 적으로 동기화 상태를 유지해야하므로 이러한 방식으로 응용 프로그램에 대해 생각하고 작성하는 것이 가장 올바른 응용 프로그램으로 이어질 수 있습니다. -https : //facebook.github.io/react/docs/interactivity-and-dynamic-uis.html#what-should-go-in-state


2
동의하지 않으면 모든 소품을 가져가는 것이 실제로 데이터를 전달하는 성능이 떨어집니다. 하위 구성 요소에 대한 저장소를 설정하면 소품을 처리 할 필요가 없으며 소품이 변경되면 구성 요소를 업데이트해야합니다. 상점을 업데이트하고 구성 요소가 상점에서 데이터를 가져 오도록하십시오.
PositiveGuy

왜 소품이 상태보다 성능이 더 좋은지 말해 줄 수 있습니까? 감사.
hqt

@hqt 불변이기 때문에 값을 변경하는 내부 비교가 더 빠릅니다.
Gaspar

@BentOnCoding, 좋은 하루, 도와주세요. USER INTERACTION의 구성 요소 내에서 변경 될 데이터가있을 때마다 상태가 사용되는 곳은 언제입니까?
Dickens

72

일반 JS 함수와 관련하여 가장 잘 이해할 수 있습니다.

간단히 말해서,

상태 는 구성 요소 외부에 액세스하여 수정할 수없는 구성 요소의 로컬 상태입니다. 함수의 지역 변수와 같습니다.

평범한 JS 기능

const DummyFunction = () => {
  let name = 'Manoj';
  console.log(`Hey ${name}`)
}

반응 성분

class DummyComponent extends React.Component {
  state = {
    name: 'Manoj'
  }
  render() {
    return <div>Hello {this.state.name}</div>;
  }

소품 , 다른 한편으로는, 메이크업 구성 요소는 구성 요소를 소품의 형태로 부모 구성 요소로부터 데이터를 수신 할 수있는 기능을 제공하여 재사용이. 기능 매개 변수와 동일합니다.

평범한 JS 기능

const DummyFunction = (name) => {
  console.log(`Hey ${name}`)
}

// when using the function
DummyFunction('Manoj');
DummyFunction('Ajay');

반응 성분

class DummyComponent extends React.Component {
  render() {
    return <div>Hello {this.props.name}</div>;
  }

}

// when using the component
<DummyComponent name="Manoj" />
<DummyComponent name="Ajay" />

크레딧 : Manoj Singh Negi

기사 링크 : 반응 상태 대 소품 설명


16
이것은 실제로 매우 유용한 답변입니다. 이 글을 읽은 후 더 완전한 답변을 이해할 수 있습니다. 감사.
Aaron

1
React component = plain JS function은 이것을 명확하게 설명하는 훌륭한 방법입니다. 그리고 React가 기능적 구성 요소를 향해 점점 더 많이 이동함에 따라, 이것은 문자 그대로 더욱 중요 해지고 있습니다.
JD Sandifer

1
내가 읽은 최고의 설명 감사합니다
iWizard

48

가장 여기에 같은 상태 요약 I 대 소품 : - 인도 반응을 그 사람에게 큰 모자 팁을. 아래는 해당 페이지의 수정 된 버전입니다.


소품 대 상태

tl; dr 구성 요소가 특정 시점에서 속성 중 하나를 변경해야하는 경우 해당 속성은 상태의 일부 여야하며, 그렇지 않으면 해당 구성 요소의 소품이어야합니다.


소품

소품 (속성의 줄임말)은 구성 요소의 구성입니다. 그것들은 그것들을받는 컴포넌트가 관련되는 한 위에서 수신되며 불변입니다. 구성 요소는 소품을 변경할 수 없지만 자식 구성 요소의 소품을 구성하는 책임은 있습니다. 소품은 단지 데이터 일 필요는 없습니다. 콜백 함수는 소품으로 전달 될 수 있습니다.

상태

상태는 구성 요소가 마운트 될 때 기본값으로 시작하는 데이터 구조입니다. 대부분 사용자 이벤트의 결과로 시간이 지남에 따라 변경 될 수 있습니다.

구성 요소는 내부적으로 자체 상태를 관리합니다. 초기 상태를 설정하는 것 외에도 자녀의 상태를 다루는 사업은 없습니다. 상태를 해당 구성 요소의 전용으로 개념화 할 수 있습니다.

소품과 상태 변경

                                                   소품 상태
    부모 Component에서 초기 값을 얻을 수 있습니까? 예 예
    상위 컴포넌트로 변경할 수 있습니까? 예 아니오
    컴포넌트 내에서 기본값을 설정할 수 있습니까? * 예 예
    컴포넌트 내부를 변경할 수 있습니까? 예
    하위 구성 요소의 초기 값을 설정할 수 있습니까? 예 예
    자식 구성 요소를 변경할 수 있습니까? 예 아니오
  • 부모로부터받은 props와 state 초기 값은 컴포넌트 내부에 정의 된 기본값보다 우선합니다.

이 구성 요소에 상태가 있어야합니까?

상태는 선택 사항입니다. 상태는 복잡성을 증가시키고 예측 가능성을 감소 시키므로, 상태가없는 구성 요소가 바람직하다. 대화식 앱에서 상태가 없으면 명확하게 할 수 없지만 상태 저장 구성 요소가 너무 많지 않아야합니다.

구성 요소 유형

상태 비 저장 구성 요소 만 소품, 상태 없음. render () 함수 외에는 많이 진행되지 않습니다. 그들의 논리는 그들이받는 소품을 중심으로 진행됩니다. 따라서 추적 및 테스트가 매우 쉽습니다.

상태 저장 구성 요소 소품과 상태. 구성 요소가 어떤 상태를 유지해야 할 때 사용됩니다. 클라이언트-서버 통신 (XHR, 웹 소켓 등), 데이터 처리 및 사용자 이벤트 응답에 적합한 장소입니다. 이러한 종류의 물류는 적당한 수의 Stateful 구성 요소로 캡슐화해야하며 모든 시각화 및 형식 지정 논리는 여러 Stateless 구성 요소의 다운 스트림으로 이동해야합니다.

출처


1
"부모로부터받은 상태 초기 값"은 무엇을 의미합니까? 내가 아는 한 상태는 단일 구성 요소의 범위에서만 정의되며 외부에서 직접 변경할 수 없습니다.
Maxim Kuzmin

@MaximKuzmin 나는 'initialColor'와 같은 소품을 가져 와서 'color'와 같은 상태를 초기화하는 일반적인 패턴에 대한 참조라고 생각합니다. 상태는 처음에 prop의 값 (부모로부터 수신)을받은 후 그 이후에도 계속 일반 상태처럼 작동합니다. 상태 대 소품 소개에 포함시키는 것은 약간 혼란 스러울 수 있지만 알아야 할 중요한 패턴입니다.
JD Sandifer

18

props ( "속성"의 약자)와 state 는 일반 JavaScript 객체입니다. 둘 다 렌더의 출력에 영향을 미치는 정보를 보유하고 있지만 한 가지 중요한 방식으로 다릅니다. 소품은 구성 요소에 전달되고 (함수 매개 변수와 유사) 상태 는 구성 요소 내에서 관리됩니다 (함수 내에 선언 된 변수와 유사).

따라서 상태 는 현재 구성 요소로 제한되지만 소품 은 원하는 모든 구성 요소로 전달할 수 있습니다 ... 현재 구성 요소 의 상태 를 다른 구성 요소의 소품 으로 전달할 수 있습니다 ...

또한 React 에는 소품이 있고 내부 상태가 아닌 상태 비 저장 구성 요소 가 있습니다 ...

앱에서 작동하는 방식을 보여주는 아래 예 :

부모 (상태 전체 구성 요소) :

class SuperClock extends React.Component {

  constructor(props) {
    super(props);
    this.state = {name: "Alireza", date: new Date().toLocaleTimeString()};
  }

  render() {
    return (
      <div>
        <Clock name={this.state.name} date={this.state.date} />
      </div>
    );
  }
}

자식 (상태 비 구성 요소) :

const Clock = ({name}, {date}) => (
    <div>
      <h1>{`Hi ${name}`}.</h1>
      <h2>{`It is ${date}`}.</h2>
    </div>
);

11

소품과 상태의 주요 차이점은 상태는 구성 요소 자체에 의해 내부적으로 제어되고 구성 요소를 렌더링하는 것은 소품이 외부에서 제어되고 제어된다는 것입니다.

function A(props) {
  return <h1>{props.message}</h1>
}

render(<A message=”hello />,document.getElementById(“root”));


class A extends React.Component{  
  constructor(props) {  
    super(props)  
    this.state={data:"Sample Data"}  
  }  
  render() {
    return(<h2>Class State data: {this.state.data}</h2>)  
  } 
}

render(<A />, document.getElementById("root"));

주 대 소품

  • 상태 변경 가능 (Mutable)
  • 소품은 할 수 없지만 (불변)

7

기본적으로, 차이는 즉 상태가 OOP의 속성 같은 것입니다 : 그것의 어떤 지역의 더 나은 사용을 설명하는 클래스 (구성 요소)으로는. 소품 은 매개 변수와 같습니다 . 구성 요소 호출자 (부모)에서 특정 매개 변수로 함수를 호출 한 것처럼 구성 요소 로 전달 됩니다.


5

상태소품 컴포넌트로 제어 데이터를 사용하는 반응으로는 일반적으로 지주가 부모에 의해 설정 및 하위 구성 요소에 전달하고이 부품 전체에 고정되어있다. 들어 바꿀 것입니다 데이터, 우리는 상태를 사용해야합니다. 소품은 변경할 수 없지만 상태는 변경 가능합니다 . 소품을 변경하려면 부모 구성 요소에서 수행 한 다음 자식 구성 요소로 전달할 수 있습니다.


4

내가 반응하는 동안 배운대로.

  • props 는 컴포넌트 가 외부 환경에서 데이터를 가져 오는 데 사용됩니다 ( 예 : 다른 컴포넌트 (순수, 기능 또는 클래스) 또는 일반 클래스 또는 javascript / typescript 코드)

  • 상태가 사용되는 구성 요소의 내부 환경을 관리하는 수단이 데이터가 변경 공진 영역 성분


3

소품 : 소품은 컴포넌트의 속성 일 뿐이며 반응 컴포넌트는 자바 스크립트 함수일뿐입니다.

  class Welcome extends React.Component {
    render() {
      return <h1>Hello {this.props.name}</h1>;
    }
  }

const 요소 =;

여기서 <Welcome name="Sara" />환영 컴포넌트의 소품으로 {name : 'Sara'} 객체를 전달합니다. 하나의 부모 구성 요소에서 자식 구성 요소로 데이터를 전달하기 위해 props를 사용합니다. 소품은 불변입니다. 구성 요소의 수명주기 동안 소품은 변경되지 않아야합니다 (불변으로 간주).

State : state는 Component 내에서만 액세스 할 수 있습니다. 컴포넌트 내에서 데이터를 추적하기 위해 state를 사용합니다. setState로 상태를 변경할 수 있습니다. 우리가 자녀에게 상태를 전달해야하는 경우,이를 소품으로 전달해야합니다.

class Button extends React.Component {
  constructor() {
    super();
    this.state = {
      count: 0,
    };
  }

  updateCount() {
    this.setState((prevState, props) => {
      return { count: prevState.count + 1 }
    });
  }

  render() {
    return (<button
              onClick={() => this.updateCount()}
            >
              Clicked {this.state.count} times
            </button>);
  }
}

3

상태:

  1. 상태는 변경 가능합니다.
  2. 상태는 개별 구성 요소와 연관되어 있으며 다른 구성 요소에서는 사용할 수 없습니다.
  3. 구성 요소 마운트시 상태가 초기화됩니다.
  4. 상태는 컴포넌트 내에서 동적 변경 사항을 렌더링하는 데 사용됩니다.

소품:

  1. 소품은 불변입니다.
  2. 구성 요소간에 소품을 전달할 수 있습니다.
  3. 소품은 주로 구성 요소 간 통신에 사용되며 부모에서 자식으로 직접 전달할 수 있습니다. 자녀를 부모에게 전달하려면 상태를 높이는 개념을 사용해야합니다.

class Parent extends React.Component{
  render()
  {
     return(
        <div>
            <Child name = {"ron"}/>
        </div>
      );
  }
}

class Child extends React.Component{
{
    render(){
      return(
         <div>
              {this.props.name}
        </div>
      );
     }
}


{ "message": "Uncaught SyntaxError : 예기치 않은 토큰 <", "filename": " stacksnippets.net/js ", "lineno": 17, "colno": 9}
Niko Jojo

2

기본적으로 props와 state는 컴포넌트가 무엇을 어떻게 렌더링하는지 알 수있는 두 가지 방법입니다. 응용 프로그램 상태의 어느 부분이 상태에 속하고 일부 최상위 저장소에 해당하는지는 React의 작동 방식보다 앱 디자인과 더 관련이 있습니다. 가장 간단한 결정 방법 인 IMO는이 특정 데이터가 전체 응용 프로그램에 유용한 지 아니면 로컬 정보인지 여부를 생각하는 것입니다. 또한 상태를 복제하지 않는 것이 중요하므로 소품에서 일부 데이터를 계산할 수 있으면 소품에서 계산해야합니다.

예를 들어, a) 목록에서 일부 값을 선택하고 b) 열거 나 닫을 수있는 (예 : 옵션 목록이 표시되거나 숨겨 질 수있는) 드롭 다운 컨트롤 (사용자 지정 스타일 지정을 위해 표준 HTML 선택을 래핑)이 있다고 가정 해 보겠습니다. 이제 앱에 일종의 항목 목록이 표시되고 드롭 다운 컨트롤이 목록 항목을 필터링한다고 가정 해 보겠습니다. 그런 다음 활성 필터 값을 소품으로 전달하고 개 / 폐 상태를 로컬로 유지하는 것이 가장 좋습니다. 또한 기능을 수행하려면 드롭 다운 요소 내부에서 호출되는 상위 구성 요소에서 onChange 핸들러를 전달하고 업데이트 된 정보 (선택한 새 필터)를 즉시 저장소로 보냅니다. 반면에 사용자가 실제로 값을 변경할 때까지 나머지 응용 프로그램은 컨트롤이 열려 있는지 실제로 신경 쓰지 않기 때문에 열린 / 닫힘 상태를 드롭 다운 구성 요소 내부에 유지할 수 있습니다.

다음 코드는 완전히 작동하지 않으므로 CSS와 드롭 다운 클릭 / 블러 / 변경 이벤트 처리가 필요하지만 예제를 최소화하고 싶었습니다. 차이를 이해하는 데 도움이되기를 바랍니다.

const _store = {
    items: [
    { id: 1, label: 'One' },
    { id: 2, label: 'Two' },
    { id: 3, label: 'Three', new: true },
    { id: 4, label: 'Four', new: true },
    { id: 5, label: 'Five', important: true },
    { id: 6, label: 'Six' },
    { id: 7, label: 'Seven', important: true },
    ],
  activeFilter: 'important',
  possibleFilters: [
    { key: 'all', label: 'All' },
    { key: 'new', label: 'New' },
    { key: 'important', label: 'Important' }
  ]
}

function getFilteredItems(items, filter) {
    switch (filter) {
    case 'all':
        return items;

    case 'new':
        return items.filter(function(item) { return Boolean(item.new); });

    case 'important':
        return items.filter(function(item) { return Boolean(item.important); });

    default:
        return items;
  }
}

const App = React.createClass({
  render: function() {
    return (
            <div>
            My list:

            <ItemList   items={this.props.listItems} />
          <div>
            <Dropdown 
              onFilterChange={function(e) {
                _store.activeFilter = e.currentTarget.value;
                console.log(_store); // in real life, some action would be dispatched here
              }}
              filterOptions={this.props.filterOptions}
              value={this.props.activeFilter}
              />
          </div>
        </div>
      );
  }
});

const ItemList = React.createClass({
  render: function() {
    return (
      <div>
        {this.props.items.map(function(item) {
          return <div key={item.id}>{item.id}: {item.label}</div>;
        })}
      </div>
    );
  }
});

const Dropdown = React.createClass({
    getInitialState: function() {
    return {
        isOpen: false
    };
  },

  render: function() {
    return (
        <div>
            <select 
            className="hidden-select" 
          onChange={this.props.onFilterChange}
          value={this.props.value}>
            {this.props.filterOptions.map(function(option) {
            return <option value={option.key} key={option.key}>{option.label}</option>
          })}
        </select>

        <div className={'custom-select' + (this.state.isOpen ? ' open' : '')} onClick={this.onClick}>
            <div className="selected-value">{this.props.activeFilter}</div>
          {this.props.filterOptions.map(function(option) {
            return <div data-value={option.key} key={option.key}>{option.label}</div>
          })}
        </div>
      </div>
    );
  },

  onClick: function(e) {
    this.setState({
        isOpen: !this.state.isOpen
    });
  }
});

ReactDOM.render(
  <App 
    listItems={getFilteredItems(_store.items, _store.activeFilter)} 
    filterOptions={_store.possibleFilters}
    activeFilter={_store.activeFilter}
    />,
  document.getElementById('root')
);

2

상태는 구성 요소가 보유한 정보를 처리하는 방식입니다.

서버에서 일부 데이터를 가져와야하는 구성 요소가 있다고 가정합니다. 일반적으로 요청이 처리 중인지, 실패한 경우 등을 사용자에게 알리려고합니다. 이는 특정 구성 요소와 관련이있는 정보입니다. 이것은 국가가 게임에 들어가는 곳입니다.

일반적으로 상태를 정의하는 가장 좋은 방법은 다음과 같습니다.

class MyComponent extends React.Component {
  constructor() {
    super();
    this.state = { key1: value1, key2: value2 }    
  }
}

그러나 최신 반응 네이티브 구현에서는 다음을 수행 할 수 있습니다.

class MyComponent extends React.Component {
  state = { key1: value1, key2: value2 }    
}

이 두 예제는 똑같은 방식으로 실행되며 구문 개선 일뿐입니다.

OO 프로그래밍에서 항상 그렇듯이 객체 속성을 사용하는 것과 다른 점은 무엇입니까? 일반적으로 귀하의 주에 보관 된 정보는 정적 인 정보가 아니며 시간이 지남에 따라 변경되며이 변경 사항을 반영하기 위해 View를 업데이트해야합니다. State는이 기능을 간단한 방법으로 제공합니다.

상태는 변경 불가능합니다! 나는 이것에 충분한 스트레스를 줄 수 없습니다. 이것은 무엇을 의미합니까? 그것은 절대 이런 식으로 행동해서는 안된다는 것을 의미합니다.

 state.key2 = newValue;

올바른 방법은 다음과 같습니다.

this.setState({ key2: newValue });

this.setState를 사용하면 업데이트주기 동안 구성 요소가 실행되며 상태의 일부가 변경되면이 변경 사항을 반영하기 위해 구성 요소 렌더 메서드가 다시 호출됩니다.

더 자세한 설명은 반응 문서를 확인하십시오 : https://facebook.github.io/react/docs/state-and-lifecycle.html


2

소품은 단순히 속성의 줄임말입니다. 소품은 구성 요소가 서로 대화하는 방식입니다. React에 익숙하다면 소품이 부모 구성 요소에서 아래쪽으로 흐른다는 것을 알아야합니다.

부모 구성 요소가 소품을 아래로 전달하지 않더라도 소품이 설정되도록 기본 소품을 가질 수도 있습니다.

이것이 사람들이 React를 단방향 데이터 흐름을 갖는 것으로 언급하는 이유입니다. 이것은 약간의 머리를 가져 오는 데 약간의 시간이 걸리며 나중에 블로그에 올 것입니다.하지만 지금은 기억하십시오 : 부모에서 자식으로의 데이터 흐름. 소품은 변하지 않습니다 (변경되지 않는 멋진 단어)

그래서 우리는 행복합니다. 구성 요소는 부모로부터 데이터를받습니다. 모두 정렬 되었습니까?

글쎄요 구성 요소가 부모 이외의 다른 사람으로부터 데이터를 수신하면 어떻게됩니까? 사용자가 구성 요소에 데이터를 직접 입력하면 어떻게됩니까?

자, 이것이 우리가 상태를 갖는 이유입니다.

상태

소품은 바뀌지 않아야하므로 상태가 올라갑니다. 일반적으로 구성 요소에는 상태가 없으므로 상태 비 저장이라고합니다. 상태를 사용하는 구성 요소를 상태 저장이라고합니다. 파티에 그 작은 음식을 버리고 사람들이 당신에게서 멀어지는 것을 지켜보십시오.

따라서 state는 구성 요소가 렌더링간에 정보를 추적 할 수 있도록 사용됩니다. State를 설정하면 상태 객체가 업데이트 된 다음 구성 요소가 다시 렌더링됩니다. React가 어려운 작업을 처리하고 엄청나게 빠르다는 것을 의미하기 때문에 매우 멋집니다.

상태의 작은 예로서, 여기에 검색 창의 스 니펫이 있습니다 (React에 대해 더 자세히 알고 싶다면이 과정을 확인하십시오).

Class SearchBar extends Component {
 constructor(props) {
  super(props);
this.state = { term: '' };
 }
render() {
  return (
   <div className="search-bar">
   <input 
   value={this.state.term}
   onChange={event => this.onInputChange(event.target.value)} />
   </div>
   );
 }
onInputChange(term) {
  this.setState({term});
  this.props.onSearchTermChange(term);
 }
}

요약

소품과 국가는 비슷한 일을하지만 다른 방식으로 사용됩니다. 구성 요소의 대부분은 상태 비 저장 상태 일 수 있습니다.

소품은 부모에서 자식으로 또는 구성 요소 자체에서 데이터를 전달하는 데 사용됩니다. 그것들은 불변이므로 변경되지 않습니다.

상태는 변경 가능한 데이터 또는 변경 될 데이터에 사용됩니다. 이것은 사용자 입력에 특히 유용합니다. 예를 들어 검색 창을 생각하십시오. 사용자가 데이터를 입력하면 표시되는 내용이 업데이트됩니다.


2

한마디로.

소품 값을 변경할 수 없습니다 [불변]

setState 메소드를 사용하여 상태 값을 변경할 수 있음 [mutable]


1

상태 - 그것은 구성 요소 데이터를 보유 특별 변경할 속성입니다. Componet가 마운트 될 때 기본값이 있습니다.

소품 그것은 본질적으로 불변이며 부모에서 자식으로 가치가 전달되는 경우에 사용되는 특별한 재산입니다. props는 컴포넌트 사이의 통신 채널이며 항상 상위 (부모)에서 buttom (자식)으로 이동합니다.

아래는 상태 및 소품을 결합하는 완전한 예입니다.

<!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8" />
        <title>state&props example</title>

        <script src="https://unpkg.com/react@0.14.8/dist/react.min.js"></script>
        <script src="https://unpkg.com/react-dom@0.14.8/dist/react-dom.min.js"></script>
        <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>

      </head>
      <body>
      <div id="root"></div>
        <script type="text/babel">

            var TodoList = React.createClass({
                render(){
                    return <div className='tacos-list'>
                                {
                                    this.props.list.map( ( todo, index ) => {
                                    return <p key={ `taco-${ index }` }>{ todo }</p>;
                            })}
                            </div>;
                }
            });

            var Todo = React.createClass({
                getInitialState(){
                    return {
                        list : [ 'Banana', 'Apple', 'Beans' ]       
                    }
                },
                handleReverse(){
                    this.setState({list : this.state.list.reverse()});
                },
                render(){
                    return <div className='parent-component'>
                              <h3 onClick={this.handleReverse}>List of todo:</h3>
                              <TodoList list={ this.state.list }  />
                           </div>;
                }
            });

            ReactDOM.render(
                <Todo/>,
                document.getElementById('root')
            );

        </script>
      </body>
      </html>

1

일반적으로 하나의 구성 요소 (부모)의 상태는 하위 구성 요소에 대한 prop입니다.

  1. 상태는 소품이 부모에서 자식으로 전달되는 구성 요소 내에 있습니다.
  2. 소품은 일반적으로 불변입니다.

    class Parent extends React.Component {
        constructor() {
            super();
            this.state = {
                name : "John",
            }
        }
        render() {
            return (
                <Child name={this.state.name}>
            )
        }
    }
    
    class Child extends React.Component {
        constructor() {
            super();
        }
    
        render() {
            return(
                {this.props.name} 
            )
        }
    }

위의 코드에는 하위 구성 요소 (자식 클래스)에 소품으로 전달되는 상태가 이름 인 상위 클래스 (부모)가 있으며 하위 구성 요소는 {this.props.name}을 사용하여 렌더링합니다.


1

애플리케이션 어딘가에 사용자가 입력 한 일부 데이터가 있습니다.

  1. 데이터를 입력하는 구성 요소는 데이터를 입력 하는 동안 데이터를 조작하고 변경해야하므로이 데이터 의 상태를 유지해야합니다.

  2. 응용 프로그램의 다른 곳에서 데이터는 다른 모든 구성 요소에 대한 소품 으로 전달되어야합니다.

그렇습니다. 소품은 바뀌고 있지만 '소스'에서 바뀌면 간단히 거기에서 흘러 나옵니다. 따라서 소품을 받는 구성 요소의 맥락에서 소품을 변경할 수 없습니다 .

예를 들어 사용자가 공급 업체 목록을 편집하는 참조 데이터 화면에서 상태를 관리하면 AppState 아래의 한 수준 일 수있는 업데이트 된 데이터가 ReferenceDataState에 저장되고이 공급 업체 목록이 소품으로 전달됩니다. 그것을 사용하는 데 필요한 모든 구성 요소에.


1

React에서 상태는 소품과 데이터를 저장합니다. 후자의 차이점은 저장된 데이터를 다른 변경으로 수정할 수 있다는 것입니다. 이것들은 플랫 JavaScript로 작성된 객체에 지나지 않으므로 데이터 또는 코드를 포함하고 모델링하려는 정보를 나타냅니다. 당신이 더 많은 정보가 필요한 경우는 당신이이 책을 참조하는 것이 좋습니다 반작용에서 국가의 사용의 소품의 사용 반응을


1
  • props --- 값을 변경할 수 없습니다.
  • states --- 코드에서 값을 변경할 수 있지만 렌더링이 발생하면 활성화됩니다.

1

반응에서 "상태"와 "프로 프"의 일부 차이점.

React는 상태에 따라 DOM을 제어하고 렌더링합니다. 구성 요소 상태에는 두 가지 유형이 있습니다. props는 구성 요소간에 전송되는 상태이며 state는 구성 요소의 내부 상태입니다. 소품은 부모 구성 요소에서 자식 구성 요소로의 데이터 전송에 사용됩니다. 구성 요소는 구성 요소 내부에서만 수정할 수있는 자체 내부 상태 : 상태입니다.

일반적으로 특정 구성 요소의 상태는 하위 구성 요소의 소품 일 수 있으며 소품은 부모 구성 요소의 렌더링 방법에 명시된 하위 항목으로 전달됩니다.


1

소품

  • 소품은 자식 구성 요소의 데이터를 전달하는 데 사용

  • 소품은 구성 요소 (자식 구성 요소) 외부의 값을 변경합니다

상태

  • 클래스 컴포넌트 내부의 상태 사용

  • 구성 요소 내부의 상태 변경

  • 페이지를 렌더링하면 setState를 호출하여 DOM 업데이트 (페이지 값 업데이트)

국가는 반응에 중요한 역할을한다


0

소품이 불변이라는 초기 질문에 대한 답 으로, 하위 구성 요소에 관한 것이지만 부모에서 변경할 수있는 한 불변이라고합니다 .


0

React Components는 상태를 사용하여 예를 들어 다음과 같이 변경 / 돌연변이 할 수있는 내부 변수를 읽거나 씁니다.

this.setState({name: 'Lila'})

React props는 프로그래머가 부모 컴포넌트에서 자식 컴포넌트로 변수와 메소드를 가져올 수 있도록하는 특수 객체입니다.

그것은 창문과 집의 문과 같은 것입니다. 소품도 변경 불가능합니다. 하위 컴포넌트는 변경 / 업데이트 할 수 없습니다.

부모 구성 요소가 소품을 변경할 때 청취하는 데 도움이되는 몇 가지 방법이 있습니다.


0

이것은 상태와 소품 사이의 설명에 관한 나의 현재 관점입니다.

  1. 상태는 컴포넌트 내부의 로컬 변수와 같습니다. set state를 사용하여 state 값을 조작 할 수 있습니다. 그런 다음 상태 값을 하위 구성 요소로 전달할 수 있습니다.

  2. Props는 redux 상점 내부에 정확히 위치한 값입니다. 이것은 실제로 리듀서에서 시작된 상태에서 나옵니다. 소품에서 가치를 얻으려면 구성 요소를 redux에 연결해야합니다. 소품 값을 자식 구성 요소에 전달할 수도 있습니다


0

간단한 설명은 다음과 같습니다. STATE는 구성 요소의 로컬 상태입니다 (예 : color = "blue"또는 animation = true 등). this.setState를 사용하여 구성 요소의 상태를 변경하십시오. PROPS는 구성 요소가 서로 통신하고 (부모에서 자식으로 데이터를 전송) 구성 요소를 재사용 할 수있게 만드는 방법입니다.


0

상태는 데이터이며 변경 가능하며 필요한 모든 것을 할 수 있습니다. 소품은 데이터 만 읽을 수 있습니다. 일반적으로 소품을 전달할 때 이미 데이터로 작업했으며 데이터를 렌더링하기 위해 하위 구성 요소가 필요하거나 소품이 기능 u 작업을 수행하기 위해 호출


0

상태는 데이터가 사는 진실의 기원입니다. 소품을 통해 국가가 나타납니다.

구성 요소에 소품을 제공하는 것은 UI가 데이터와 동기화되도록 유지하는 것입니다. 컴포넌트는 실제로 마크 업을 반환하는 함수일뿐입니다.

동일한 소품 (표시 할 데이터)이 주어지면 항상 동일한 마크 업을 생성합니다 .

따라서 소품은 데이터를 원점에서 기능적 구성 요소로 전달하는 파이프 라인과 같습니다.


0

Props : "읽기 전용"데이터를 나타내며 변경할 수 없으며 부모 구성 요소의 특성을 나타냅니다.

상태 : 변경 가능한 데이터를 나타내며 궁극적으로 페이지에 렌더링되고 구성 요소 자체에 의해 내부적으로 관리되고 사용자 입력으로 인해 초과 근무 시간이 변경됩니다.


1
프로는 1 명뿐입니까? 그리고 1 죄수?
제우스의 책

0

가장 큰 차이점은 상태는 구성 요소에 대해 비공개이며 해당 구성 요소 내에서만 변경 될 수 있고 소품은 정적 구성 요소이며 부모 구성 요소를 통해 전달되고 자식 구성 요소 내에서 변경할 수없는 자식 구성 요소의 키입니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.