props

2024. 3. 17. 21:47Daily Codig Reminder

PROPS

 

img

import reactImg from './assets/exam.png';

function App() {
  return (
    <div>
      <img src={reactImg} width="100" height="100"></img>
   <br/>
   <img src='sample.png' width="100" height="100"></img>
   {/* public 폴더에 sample.png 붙여넣기 할것*/}
    </div>
  );
};

export default App;

 

PROPS

index.js 에서 <React.StrictMode> 막으면 결과가 출력 한번만 됨

 

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App.js';
import reportWebVitals from './reportWebVitals';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
 // <React.StrictMode>
    <App />
//  </React.StrictMode>
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

 

 

import './App.css'
function Avatar(props){
  console.log(props);
 const {name, age, address="제주"}=props;
 return(
  <div>
  이름: {name}
  <br/>
  나이 : {age}
  <br/>
  주소: {address}
  <br/>
  </div>
 );
}
function Avatar2({name, age, address="제주"}){
 return(
  <div>
  이름: {name}
  <br/>
  나이 : {age}
  <br/>
  주소: {address}
  <br/>
  </div>
 );
}
function Member ({person}){
  const {name, age, address}=person;
  return(
    <div>
      이름: {name}
  <br/>
  나이 : {age}
  <br/>
  주소: {address}
  <br/>
    </div>
  )
}
function Member1 (props){
  //const person = props.person;
  const{person} =props;
  const {name, age, address}=person;

  return(
    <div>
      이름: {name}
  <br/>
  나이 : {age}
  <br/>
  주소: {address}
  <br/>
    </div>
  )
}
function App() {
  const addr ="서울";
  const chul = {name:"유관순", age: 18, address:"부산"};
  console.log(chul);
  return (
    <div>
<h1>Avatar</h1>
{/* 문자열을 제외한 값은 전달시 반드시 중괄호를 사용함, 숫자에 "" 지정하면 문자로 전달됨*/}
  회원1: <Avatar name="홍길동" age={20} address={addr}></Avatar>
  <br/>
  {/*props는 전달시 spread 연산자 사용가능 */}
회원2: <Avatar {...chul}></Avatar>
<br/>
회원3 : <Avatar name="이순신" age={20}></Avatar>
<br/>
회원4: <Avatar/>
<br/>
<h1>Avatar2</h1>
Avatar2: <Avatar2 name="강감찬" age={10} address="부산"/>
<br/>
Avatar2: <Avatar2 {...chul}/>
<br/>
<h1>Member</h1>
{/*객체로 전달시 반드시 명시적으로 값을 지정함
변수를 지정하기 위해서는 백틱 `${변수명}`을 사용함
  json 전달시 이중 {{}}을 사요함*/ }
Member1: 
<Member1 person={{name:"홍길동", age:20, address:"서울"}}></Member1>
<br/>
Member2:
<Member person={{name:"홍길동", age:20, address:`${addr}`}}></Member>
    </div>
  );
};

export default App;

import './App.css'
import React from 'react';
import Avatar, { Avatar2 } from './components/Avatar.js'; 
import Member, {Member1} from './components/Member.js';



function App() {
  const addr ="서울";
  const chul = {name:"유관순", age: 10, address:"부산"};
  console.log(chul);
  return (
    <div>
<h1>Avatar</h1>
{/* 문자열을 제외한 값은 전달시 반드시 중괄호를 사용함, 숫자에 "" 지정하면 문자로 전달됨*/}
  회원1: <Avatar name="홍길동" age={20} address={addr}></Avatar>
  <br/>
  {/*props는 전달시 spread 연산자 사용가능 */}
회원2: <Avatar {...chul}></Avatar>
<br/>
회원3 : <Avatar name="이순신" age={50}></Avatar>
<br/>
회원4: <Avatar/>
<br/>
<h1>Avatar2</h1>
Avatar2: <Avatar2 name="강감찬" age={20} address="bbb"/>
<br/>
Avatar2: <Avatar2 {...chul}/>
<br/>
<h1>Member</h1>
{/*객체로 전달시 반드시 명시적으로 값을 지정함
변수를 지정하기 위해서는 백틱 `${변수명}`을 사용함
  json 전달시 이중 {{}}을 사요함*/ }
Member1: 
<Member1 person={{name:"홍길동", age:20, address:"서울"}}></Member1>
<br/>
Member2:
<Member person={{name:"홍길동", age:20, address:`${addr}`}}></Member>
    </div>
  );
};

export default App;

 

 

import React from 'react';

  function Avatar({name, age, address="제주"}){
   return(
    <div>
    이름: {name}
    <br/>
    나이 : {age}
    <br/>
    주소: {address}
    <br/>
    </div>
   );
  }
  export function Avatar2(props){
    const {name, age, address}= props;
    return(
     <div>
     이름: {name}
     <br/>
     나이 : {age}
     <br/>
     주소: {address}
     <br/>
     </div>
    );
   }
  export default Avatar;

 

import React from 'react';

function Member ({person}){
    const {name, age, address}=person;
    return(
      <div>
        이름: {name}
    <br/>
    나이 : {age}
    <br/>
    주소: {address}
    <br/>
      </div>
    )
  }
 export function Member1 (props){
    //const person = props.person;
    const{person} =props;
    const {name, age, address}=person;
  
    return(
      <div>
        이름: {name}
    <br/>
    나이 : {age}
    <br/>
    주소: {address}
    <br/>
      </div>
    )
  }
  export default Member;

spread, map

 

import React from 'react';
import { CORE_AVATARS } from './data/data';

function Avatar(props) {
  const { name, age, address = '제주' } = props;
  return (
    <div>
      Name: {name} <br />
      Age: {age} <br />
      Address: {address}
    </div>
  );
}

function App() {
  // Extracting the name property of the first item in CORE_AVATARS
  console.log(CORE_AVATARS[0].name);
  console.log(CORE_AVATARS[1].name);

  return (
    <div>
      <h1>Core Avatars</h1>
      회원1:<br />
      Name: {CORE_AVATARS[0].name}<br />
      Age: {CORE_AVATARS[0].age}<br />
      Address: {CORE_AVATARS[0].address}
      <hr />
      <h1>Core Avatars2: spread 연산자 이용</h1>
      회원1: <Avatar {...CORE_AVATARS[0]} /><br />
      회원2: <Avatar {...CORE_AVATARS[1]} /><br />
      회원3: <Avatar {...CORE_AVATARS[2]} /><hr />
      <h1>Core Avatars3: map 반복문 이용</h1>
      
      {CORE_AVATARS.map((row, index) => (
        <div key={index}>
          <span>회원{index + 1}</span><br />
         <Avatar
          name={row.name}
          age={row.age}
          address={row.address}
          ></Avatar>
<h1>spread</h1>
<span>회원{index + 1}</span><br />
<span>
  <Avatar {...row}></Avatar>
</span>
        </div>


      ))}


    </div>
  );
}

export default App;

 

export const CORE_AVATARS = [
    {
        name:"홍길동",
        age:20,
        address:"서울"
    },
    {
        name:"이순신",
        age:50,
        address:"전라"
    },
    {
        name:"강감찬",
        age:44,
        address:"경기"
    },
]

 

defaultProps설정

 

import './App.css'
import React from 'react';
import Avatar from './components/Avatar.js'; 
import Member, {Member1} from './components/Member.js';



function App() {
  const addr ="서울";
  const chul = {name:"유관순", age: 10, address:"부산"};
  console.log(chul);
  return (
    <div>
<h1>Avatar0</h1>
{/* default.props의 사용*/}
  회원0: <Avatar></Avatar>
  {/*문자열을 제외한 이외릐 값은 전달시 반드시 중괄호를 사용*/}
  <br/>
  <h1>Avatar1</h1>
  회원1: <Avatar name="홍길동" age={20}></Avatar>
  <br/>
  {/*props는 전달시 spread 연산자 사용가능 */}
회원2: <Avatar {...chul}></Avatar>
<br/>
회원3 : <Avatar name="이순신" age={50}></Avatar>
<br/>
<hr/>
<h1>Member</h1>
{/*객체로 전달시 반드시 명시적으로 값을 지정함
변수를 지정하기 위해서는 백틱 `${변수명}`을 사용함
  json 전달시 이중 {{}}을 사요함*/ }
Member1: 
<Member1 person={{name:"홍길동", age:20, address:"서울"}}></Member1>
<br/>
Member2:
<Member person={{name:"홍길동", age:20, address:`${addr}`}}></Member>
    </div>
  );
};

export default App;

 

 

import React from 'react';

  function Avatar({name, age, address="제주"}){
   return(
    <div>
    이름: {name}
    <br/>
    나이 : {age}
    <br/>
    주소: {address}
    <br/>
    </div>
   );
  }

   Avatar.defaultProps={
    name:"이름없음",
    age:0,
    address:"주소없음"
   };
  export default Avatar;

props 실습

import React from 'react';

function PersonList({ persons }) {
  return (
    <table border='1'>
      
        <tr>
          <th>No</th>
          <th>Name</th>
          <th>Age</th>
        </tr>
      
    
        {persons.map((person, index) => (
          <tr key={index}>
            <td>{index + 1}</td>
            <td>{person.name}</td>
            <td>{person.age}</td>
          </tr>
        ))}
     
    </table>
  );
}

export default PersonList;

 

 

import React from 'react';
import PersonList from './components/PersonList';

let persons = [
  { name: '홍길동', age: 20 },
  { name: '이순신', age: 30 },
  { name: '유관순', age: 40 },
  { name: '강감찬', age: 50 },
];

function App() {
  return (
    <div>
      <h1>학생정보</h1>
      <PersonList persons={persons} />
    </div>
  );
}

export default App;

 

personList.js

 

import React from 'react';
import Person from './Person';

function PersonList({ persons }) {
  return (
    <table border='1'>
      <thead>
        <tr>
          <th>No</th>
          <th>Name</th>
          <th>Age</th>
        </tr>
      </thead>
      <tbody>
        {persons.map((person, index) => (
          <Person person={person} index={index}/>
        ))}
      </tbody>
    </table>
  );
}

export default PersonList;

 

 

person.js

 

import React from 'react';

function Person({ index,person }) {
  return (
    <tr key={index}>
      <td>{index+1}</td>
      <td>{person.name}</td>
      <td>{person.age}</td>
    </tr>
  );
}

export default Person;

 

 

app.js 같음

 

children

import React from 'react';

function Avatar ({name, age, address}){
  return(
    <div>
      이름: {name}
      <br/>
      나이: {age}
      <br/>
      주소: {address}
      <br/>

    </div>
  )
}
function Avatar2 ({name, age, children}){
  return(
    <div>
      이름: {name}
      <br/>
      나이: {age}
      <br/>
    children: {children}
      <br/>
      
    </div>
  )
}

function App() {
  const user = {name :"유관순" ,age:18, address:"부산"};
  const user2 = {name :"유관순" ,age:18};
  return (
    <div>
    <h1>Avatar</h1>
    회원1: <Avatar {...user}></Avatar>
    <br/>
    회원2: <Avatar2 {...user2}>서울</Avatar2>
{/*내용이 children으로 전달*/}
<br/>
회원3:{" "}
<Avatar2 {...user2}>
  <span>사진</span>
  <img src="sample.png" width="100"></img>
</Avatar2>
<br/>
    </div>
  );
}

export default App;

계층 구조의 효과적인 Props 전달 방법

 

import React from 'react';
import FirstComponent from './components/FirstComponent';

function App() {
const user ={name:"홍길동", age:20,};
  return (
    <div>
    <FirstComponent {...user}/>
    </div>
  );
}

export default App;

 

🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟

props로 넘기기

import React from 'react';
import SecondComponent from './SecondComponent';
function FirstComponent(props) {
    let user={...props, address:"서울"}
    return (
        <div>
          
            <SecondComponent {...user}/>
        </div>
    );
}

export default FirstComponent;

 

 

import React from 'react';

function SecondComponent(props) {
  const { name, age, address } = props;

  return (
    <div>
      <h2>SecondComponent</h2>
      <p>Name: {name}</p>
      <p>Age: {age}</p>
      <p>Address: {address}</p>
    </div>
  );
}

export default SecondComponent;

 

 

 

spread 함수 안 쓰고 해보기

 

import React from 'react';
import FirstComponent from './components/FirstComponent';

function App() {
  const user={name:"유관순", age:20};
  return (
    <div>
      <FirstComponent user={user}/>
    </div>
  );
}

export default App;

 

 

import React from 'react';
import SecondComponent from './SecondComponent';
function FirstComponent({user}) {
    const {name, age}=user;
    const data = {name, age, address:"서울"};
    return (
        <div>
           <h1>FirstComponent</h1>
      <p>Name: {data.name}</p>
      <p>Age: {data.age}</p>
      {/* 주소도 SecondComponent로 전달 */}
      <SecondComponent user={data} />
        </div>
    );
}

export default FirstComponent;

 

 

import React from 'react';

function SecondComponent({user}) {
const {name, age, address}= user;
  return (
    <div>
      <h2>SecondComponent</h2>
      <p>Name: {name}</p>
      <p>Age: {age}</p>
      {/* 주소 출력 */}
      <p>Address: {address}</p>
    </div>
  );
}

export default SecondComponent;

 

덮어써짐..

 

import React from 'react';
function FirstComponent(props) {
   
    const user = {...props, name:"서울"};
    return (
        <div>
           <h1>FirstComponent</h1>
      <p>Name: {user.name}</p>
      <p>Age: {user.age}</p>
      {/* 주소도 SecondComponent로 전달 */}
        </div>
    );
}

export default FirstComponent;

 

 

이벤트 처리

 

import React from 'react';

function App() {
//이벤트 함수는 중첩 형식으로 구현


function handleEvent1(e){
  console.log("handleEvent1"+e.target);
}
function handleEvent2(v,e){
  console.log("handleEvent2",v,e);
}
return (
  <div>
    <h4>1.기본 이벤트 처리 =callback 형식</h4>
    <button onClick={handleEvent1}>OK1</button>
    <h4>2.명시적인 arrow 형식</h4>
    <button onClick={(e)=> handleEvent1(e)}>OK2</button>
    <button onClick={(e)=> console.log(e)}>OK3</button>
    <h4>3. 명시적인 파라미터 전달</h4>
    {/*  error arrow 이벤트 필수
    데이터 전송시 직접 호출 안됨
    <button onClick={handleEvent2(100,e)}>OK4-1</button>  */}
    <button onClick={(e)=> handleEvent2(100,e)}>OK4-2</button>
  </div>
);
}
export default App;

import './App.css';

function App() {
  //이벤트 함수는 중첩형식으로 구현
  //이벤트 객체를 얻으려면 반드시 파라미터로 지정함
  function handleEvent1(e){
    console.log("handleEvent1 => ", e.target);
  }

  function handleEvent2(v, e){//데이터, 이벤트
    console.log("handleEvent2 => ", v, e);
  }

  return (
    <div>
      <h3>1. 기본이벤트 처리 = callback 형식</h3>
      <button onClick={handleEvent1}>OK1</button>
      {/* <button onClick={handleEvent1(e)}>OK1-2</button>
      함수 호출이되어 리턴값을 받아야하는데 리턴값이 없기 때문에 에러 발생 /}

      <h3>2. 명시적인 arrow 형식</h3>
      <button onClick={(e)=>handleEvent1(e)}>OK2</button>
      {/ 리턴된 값이 람다함수로 들어감 /}
      <button onClick={(e)=>console.log(e)}>OK3</button>

      <h3>3. 명시적인 파라미터 전달</h3>
      <button onClick={(e)=>handleEvent2(100,e)}>OK4_1</button>
      {/ <button onClick={handleEvent2(100,e)}>OK4_2</button>
        에러발생 => 데이터 전송 시 직접 호출 안됨
      */}
    </div>
  );
}

export default App;

'Daily Codig Reminder' 카테고리의 다른 글

useState 와 useRef  (0) 2024.03.19
useState, 이벤트, hook  (0) 2024.03.17
React  (0) 2024.03.17
부서 삭제, router@3 props, query, 라우팅  (0) 2024.03.14
eventBus, slot, sts 연결  (0) 2024.03.14