리엑트 ㅇ_ㅇ

E__ppo·2022년 5월 22일
0
post-custom-banner

// import logo from './logo.svg';
// import './App.css';

import BucketList from './Bucket_List';
import React from 'react';

// import {BucketList} from "./Bucket_List"
// export 로 포함할 때 쓰는 방법

class App extends React.Component{
constructor(props){
super(props);

this.state ={ 
  list: ["영화관 가기", "매일 책읽기", "수영 배우기"]
}

}
// 컴포넌트에 필요한 기본적인 데이터를 생성자를 통해 생성해주는 것

render(){ // 필수함수, 리턴되는 값은 무조건 1개는 있어야한다.
console.log(this.state.list);

return(
  <div className="App">
    <BucketList list={this.state.list}/> 
    props 명  = 데이터 
  </div>
);

}
}

// function App() {
// return (
//


//
//

// );
// }

export default App;

import React from "react"
import Nemo from "./Nemo";

class App extends React.Component{
  constructor(props) {
    super(props);

    this.state = {
      count: 3
    };
  }

  componentDidMount() { }
  
  addNemo = () => {
    this.setState({ count : this.state.count + 1});
    // 스테이트가 딕셔너리 상태이기 때문에 똑같이 맞춰줘야한다. 
  }

  remoneNemo = () => {

    if (this.state.count > 0) {
          this.setState({ count: this.state.count - 1 });      
    } else {
      window.alert("네모가 없어요 8ㅅ8")
    }

  }


  render() {

    const nemo_count = Array.from({ length: this.state.count }, (v, i) => i);

    console.log(this.state)

    return (
      <div className="App">
        <Nemo/>
        {nemo_count.map((n,i) => {
          return (
            <div
              key={i}
              // 가상돔 key, 실제돔 key 값이 다르기 때문에 비교가 어려움(무조건 새것으로 인식 후 렌더)
              // 키값에 대한 경고가 뜨지 않도록 생성시점에 같은 키값으로 할당
              style={{
                width: "150px",
                height: "150px",
                backgroundColor: "#ddd",
                margin: "10px"
              }}>
              nemo
            </div>
          );
        })}

        <div>
          <button onClick={() => {
            //<button onClick={this.addNemo}> 이렇게 표현해도 됨 
            // this.addNemo()  하게되면 즉시실행되므로 버튼을 안눌러도 실행처리됨
            // 꼭 () 빼고 쓰세오 
            this.addNemo();
          }}>하나 추가</button>
          <button onClick={this.remoneNemo}>하나 빼기</button>
        </div>
       
      </div>
    );
  }
}



export default App;
import React from "react"

const Nemo = (props) => {
    const [count, setCount] = React.useState(3);
    // 스테이트의 값 / 카운트를 수정하는 어떤 함수 / 스테이트게 들어가는 초기값 
    const nemo_count = Array.from({ length: count }, (v, i) => i);

    // 클레스형이 아니라 함수형이기 때문에 선언해준 후 함수를 만들어야한다. 
    const addNemo = () => {
        setCount(count+1);
    }

    const removeNemo = () => {
        if (count > 0) {
            setCount(count - 1);
        }else window.alert("네모가 없어요 9ㅅ9")
    }



    return (
        <>
            {/* 리턴안에 있는 문구들이 리엑트 요소가 아닌 것 같아?  공백도 있어, 아래 문구 이상해? 
            이럴때는 감싸는 태그로 감싸주면 해결됨 */}
         { nemo_count.map((n,i) => {
          return (
           
            <div
              key={i}
              // 가상돔 key, 실제돔 key 값이 다르기 때문에 비교가 어려움(무조건 새것으로 인식 후 렌더)
              // 키값에 대한 경고가 뜨지 않도록 생성시점에 같은 키값으로 할당
              style={{
                width: "150px",
                height: "150px",
                backgroundColor: "#ddd",
                margin: "10px"
              }}>
              nemo
            </div>
          );
        })}

        <div>
          <button onClick={addNemo} >하나 추가</button>
          <button onClick={removeNemo}>하나 빼기</button>
        </div></>
    );
    
}

export default Nemo;
import React from "react";
import logo from "./logo.svg";
// BucketList 컴포넌트를 import 해옵니다.
// import [컴포넌트 명] from [컴포넌트가 있는 파일경로];
import BucketList from "./BucketList";
import styled from "styled-components";


// 클래스형 컴포넌트는 이렇게 생겼습니다!
class App extends React.Component {
    constructor(props) {
        super(props);
        // App 컴포넌트의 state를 정의해줍니다.
        this.state = {
            list: ["영화관 가기", "매일 책읽기", "수영 배우기"],
        };

        this.text = React.createRef();
    }

    componentDidMount() {
        console.log(this.text);
    }


    addBucket = () => {
        this.setState({ list: [...this.state.list, this.text.current.value] });
        // 스프레드 문법... push 같은 소리하네 나..
        // [...this.state.list , 넣고 싶었던 어떤 값]
    }

    // 랜더 함수 안에 리액트 엘리먼트를 넣어줍니다!
    render() {

        console.log(this.text.current);
        return (
            <AppWrap>
                <Container>
                    <Title >내 버킷리스트</Title>
                    <Line />
                    {/* 컴포넌트를 넣어줍니다. */}
                    {/* <컴포넌트  [props 명]={넘겨줄 것(리스트, 문자열, 숫자, ...)}/> */}
                    <BucketList list={this.state.list} />
                </Container>

                <InputWrap>
                    <input type="text" ref={this.text}
                        onChange={() => {
                            console.log(this.text.current.value)
                        }} />
                    <button onClick={this.addBucket}> 입력하기</button>
                </InputWrap>
            </AppWrap>
        );
    }
}

const AppWrap = styled.div`
background-color: #eee;
height: 100vh;
width: 100vw;
display: flex;
flex-direction: column;
`;

const Container = styled.div`
background-color: #fff;
width: 50vw;
max-width: 350px;
margin: auto;
height: 80vh;
padding: 16px;
border: 1px solid #ddd;
border-radius: 5px;
`;

const Title = styled.h1`
color: slateblue;
text-align: center;
`;

const Line = styled.hr`
margin: 16px 0px;
`;


const InputWrap = styled.div`
background-color: #fff;
width: 50vw;
max-width: 350px;
margin: auto;
padding: 16px;
border: 1px solid #ddd;
border-radius: 5px;
`;

export default App;
post-custom-banner

0개의 댓글