Consumer 사용하기

Consumer 는 컴포넌트에서 Context 를 사용해야 할 때에 사용됩니다.

값 보여주기

Receives 에서 context 안에 있는 값을 보여줘봅시다. 컴포넌트를 다음과 같이 작성해보세요.

src/components/Receives.js

import React from 'react';
import { SampleConsumer } from '../contexts/sample';

const Receives = () => {
  return (
    <SampleConsumer>
      {
        (sample) => (
          <div>
            현재 설정된 값: { sample.state.value }
          </div>
        )
      }
    </SampleConsumer>
  );
};

export default Receives;

그러면 이렇게, 우리가 기존에 설정했던 기본값이 보여질 것입니다.

여기서 JSX 내부에서 { (sample) => ... } 이런식으로 작성해주었는데, 이것은 Render Props 라는 패턴입니다.

우리가 방금 작성한 코드는 비구조화 할당 문법을 사용하면 다음과 같이 작성 할 수도 있답니다

      {
        ({state}) => (
          <div>
            현재 설정된 값: { state.value }
          </div>
        )
      }

준비한 actions 호출하기

이번엔 우리가 기존에 준비했던 actions 를 통해서 값을 변경해보겠습니다. 이번에 컴포넌트를 구현하기 위해선, 단순히 render 에서만 필요한게 아니라, 내부에 있는 메소드에서도 필요로 합니다. 그렇기에 아까전에 했던것처럼 render 에서 Consumer 를 사용하는 형태로 구현하지 않고, SendsContainer 라는 컨테이너 컴포넌트를 추가적으로 만들어서 props 로 필요한 값을 전달하는 방식으로 구현해주겠습니다.

src/components/Sends.js

import React, { Component } from 'react';
import { SampleConsumer } from '../contexts/sample';

class Sends extends Component {

  state = {
    input: ''
  }

  componentDidMount() {
    // :: 초기 값 설정
    this.setState({
      input: this.props.value,
    })
  }

  handleChange = (e) => {
    this.setState({ input: e.target.value });
  }

  handleSubmit = (e) => {
    e.preventDefault();
    // :: props로 받은 setValue 호출
    this.props.setValue(this.state.input);
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <input value={this.state.input} onChange={this.handleChange}/>
        <button type="submit">설정</button>
      </form>
    );
  }
}

// :: Consumer 를 사용하여 context 값을 전달해준 컨테이너 컴포넌트
const SendsContainer = () => (
  <SampleConsumer>
    {
      ({state, actions}) => (
        <Sends 
          value={state.value}
          setValue={actions.setValue}
        />
      )
    }
  </SampleConsumer>
)

// :: Sends 대신에 SendsContainer 를 내보내줌
export default SendsContainer;

이제 값을 수정 할 수 있을 것입니다!

results matching ""

    No results matching ""