REACT/[inflearn] 처음만난 리액트

5강. Components and Props

web_seul 2022. 11. 3. 11:57
반응형

Components와 Props의 정의

Components : 속성들을 입력으로 받아서 element 생성, 리액트를 구성하는 가장 작은 빌딩블록, JS객체형태, 화면에 보이는 것들 기술, 붕어빵 틀

Props : Property(속성)의 줄임말, components의 속성, 붕어빵의 재료, 컴포넌트에 전달할 다양한 정보를 담고있는 자바스크립트 객체

 

Props의 특징 및 사용법

Props의 특징 : Read-only(값 변경x), 값을 변경하기 위해서는 새로운 값을 컴포넌트에 전달하여 새로운 Element 생성, 모든 리액트 컴포넌트는 Props를 직접 바꿀수 없고 같은 Props에 대해서는 항상 같은 결과를 보여줄것

 

Props 사용법

//jsx 사용
function App(props){
  return (
    <Profile	//component
      name="소플"	//props
      introduction="안녕하세요."	//props
      viewCount={1500}	//props, JS코드 
    />
  );
}

 

Component 만들기 및 렌더링

Function Component : 리액트의 컴포넌트를 함수로 사용

function Welcome(props){
  return <h1>안녕, {props.name}</h1>;
}

 

Class Component : ES6의 class기반

class Welcome extends React.Component{	//react.component 상속
  render(){
    return <h1>안녕, {this.props.name}</h1>;
  }
}

 

Component이름은 항상 대문자로 시작(소문자로 시작할 경우 DOM으로 인식)

//HTML div로 인식
const element = <div/>;

//Welcome이라는 리액트 Component로 인식
const element = <Welcome name="인제"/>

 

Component 렌더링

//DOM 태그를 사용한 element
const element = <div/>;

//사용자가 정의한 Component를 사용한 element
const element = <Welcome name="인제"/>

//렌더링
function Welcome(props){
  return <h1>안녕, {props.name}</h1>;
}
const element = <Welcome name="인제"/>
ReactDOM.render(
  element,
  document.getElementById('root')
);

 

Component 합성과 추출

Component 합성 : Component내에 또 다른 Component를 사용할 수 있음, 복잡한 화면을 여러개의 Component로 나눠서 구현 가능

function Welcome(props){
  return <h1>Hello, {props.name}</h1>
}

function App(props){
  return(
    <div>
      <Welcome name="Mike"/>	//컴포넌트 합성
      <Welcome name="Steve"/>
      <Welcome name="JAne"/>
    </div>
  )
}

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

 

Component 추출 : 큰 컴포넌트를 나눠서 새로운 컴포넌트 생성, 재사용성 ↑(기능, 목적 명확, props 단순), 개발속도 ↑

function Comment(props){
  return(
    <div className = "comment">
      <div className = "user-info">
        <img className = "avatar"	//1. Avatar 추출
          src={props.author.avatarUrl}
          alt={props.author.name}
        />
        <div className="user-info-name">
          {props.author.name}
        </div>
      </div>
      <div className="comment-text">
        {props.text}
      </div>
      <div className="comment-date">
        {formatDate(props.date)}
      </div>
    </div>
  );
}

//1. Avatar 추출
function Avatar(props){
  return(
    <img className="avatar"
      src={props.user.avatarUrl}
      alt={props.user.name}
    />
  );
}

//2. avatar 컴포넌트 반영
function Comment(props){
  return(
    <div className = "comment">
      <div className = "user-info">
        <Avatar user={props.author} /> //avatar 반영        
        <div className="user-info-name">
          {props.author.name}
       </div>
      </div>
      <div className="comment-text">
        {props.text}
      </div>
      <div className="comment-date">
        {formatDate(props.date)}
      </div>
    </div>
  );
}

//3. UserInfo 추출
function UserInfo(props){
  return(
    <div className = "user-info">
      <Avatar user={props.author} /> //avatar 반영        
        <div className="user-info-name">
          {props.author.name}
        </div>
    </div>
  );
}

//4. UserInfo 컴포넌트 반영
function Comment(props){
  return(
    <div className = "comment">
      <UserInfo user={props.author} > //UserInfo 반영        
      <div className="comment-text">
        {props.text}
      </div>
      <div className="comment-date">
        {formatDate(props.date)}
      </div>
    </div>
  );
}

 

(실습) 댓글 컴포넌트 만들기

//Comment.jsx
import React from "react";

const styles={
    wrapper:{
        margin: 8,
        padding: 8,
        display: "flex",
        flexDirection: "row",
        border: "1px solid grey",
        borderRadius: 16,
    },
    imageContainer:{},
    image: {
        width: 50,
        height: 50,
        borderRadius: 25,
    },
    contentContainer: {
        marginLeft: 8,
        display: "flex",
        flexDirection: "column",
        justifyContent: "center",
    },
    nameText: {
        color: "black",
        fontSize: 16,
        fontWeight: "bold",
    },
    commentText: {
        color: "black",
        fontSize: 16,
    },
};

function Comment(props) {
    return(
        <div style={styles.wrapper}>
            <div style={styles.imageContainer}>
                <img 
                    src="http://upload.wikimedia.org/wikipedia/commons/8/89/Protrait_Placeholder.png"
                    alt="프로필"
                    style={styles.image}
                />
            </div>

            <div style={styles.contentContainer}>
                {/* <span style={styles.nameText}>이인제</span>
                <span style={styles.commentText}>제가 만든 첫 컴포넌트입니다.</span> */}
                <span style={styles.nameText}>{props.name}</span>
                <span style={styles.commentText}>{props.comment}</span>
            </div>
        </div>
    )
}
export default Comment;


//CommentList.jsx
import React from "react";
import Comment from "./Comment";

//comments의 데이터
const comments = [
    {
        name: "이인제",
        comment: "안녕하세요, 소플입니다.",
    },
    {
        name: "유재석",
        comment: "안녕하세요, 유재석입니다.",
    },
    {
        name: "강민경",
        comment: "안녕하세요, 강민경입니다.",
    },
    {
        name: "의자",
        comment: "안녕하세요, 의자입니다.",
    },
];

function CommentList(props) {
    return(
        <div>
            {/* props추가하기 */}
            {/* 
            //Comment 컴포넌트 반영
            <Comment name={"이인제"} comment={"안녕하세요, 소플입니다."}/>
            <Comment name={"유재석"} comment={"리액트리액트"}/> 
            */}

            //Comment 데이터를 별도의 객체로 분리하여 동적으로 반영
            {comments.map((comment) => {
                return (
                    <Comment name={comment.name} comment={comment.comment} />
                    
                );
            })}
        </div>
    )
}
export default CommentList;
root.render(
  <React.StrictMode>
    <CommentList />	//Comment컴포넌트를 반영한 CommentList 컴포넌트
  </React.StrictMode>
)

 

반응형

'REACT > [inflearn] 처음만난 리액트' 카테고리의 다른 글

7강. Hooks  (0) 2022.11.08
6강. State와 Lifecycle  (0) 2022.11.03
4강. Rendering Elements  (0) 2022.11.02
3강. JSX  (0) 2022.10.28
1강. 리액트 소개 / 2강. 리액트 시작하기  (0) 2022.10.26