본문 바로가기
React

React 컴포넌트에 조건부로 props 추가 방법 (style, event handler)

by @hohoya33 2021년 12월 29일

props를 객체로 정의 하고 Spread operator(...)를 사용하여 컴포넌트에 전달할 수 있습니다.

<Component title="React" label="library" />

// can be rewritten as 

const props = {
  title: 'React',
  label: 'library'
}

<Component {...props} />

 

조건에 따라서 추가하거나 제거 하려면 삼항 연산자(a?b:c) 또는 if-else 문을 사용

 

예제1.

//using ternary operator
const App = () => {

  const [isShowDescription, setIsShowDescription] = useState(false);

  const customProps = {
    label: "Hello",
    size: 100 
  }
  return (
    <CustomComponent
      { ...customProps }
      {...(
        isShowDescription ?
        { description: 'added description property' } :
        {}
      )}
    />
  );
}

export default App;

예제2.

//using if-else statement
const App = () => {

  const [isHeight, setIsHeight] = useState(false);
  const boxProps = {}

  if (isHeight) {
    boxProps.height = "200px";
  }

  return (
    <Box 
      { ...boxProps }
    />
  );
  
}

export default App;

 

Solution #1: Inline conditionals in attribute props

function App() {
  const [mood] = React.useState("happy");

  const greet = () => alert("Hi there! :)");

  return (
    <button onClick={greet} disabled={"happy" === mood ? false : true}>
      Say hi
    </button>
  );
}

Solution #2: if statements
function App() {
  let disabled = true;

  const [mood] = React.useState("happy");

  const greet = () => alert("Hi there! :)");

  if ("happy" === mood) {
    disabled = undefined;
  }

  return (
    <button onClick={greet} disabled={disabled}>
      Say hi
    </button>
  );
}


Solution #3: Spread props to child component

function App() {
  let fieldProps = {
    type: 'password',
    disabled: true,
  };

  if ("password" === fieldProps.type) {
    fieldProps.required = true;
    fieldProps.disabled = false;
  }

  return <input {...fieldProps} />;
}

 

 <Child {...(editable && { editable: editableOpts } )} />
 
 <Child {...(this.props.editable && { editable: this.props.editableOpts })} />
 
 <Child {...(canClick && { onClick: this.handler })} />
 
 <Child onClick={canClick ? this.handler : undefined} />
 
  <Child onClick={(canClick && this.handler) || null} />

'React' 카테고리의 다른 글

React Props 조건문  (0) 2021.03.09
React 컴포넌트 props 조건문  (0) 2021.03.09
CRA + Emotion 사용시 jsx pragma 선언 없이 css 사용 방법  (0) 2021.03.09

개의 댓글