반응형

Javascript로 todo list를 만들어보려고 한다.

(추후 Vue.js로 변환)

 

먼저,

UI를 먼저 그려주겠습니다.

1️⃣ To do list 제목

2️⃣ input 리스트 추가 영역

3️⃣ 리스트 영역

 

input 텍스트 입력을 받아보겠습니다.

1️⃣ 빈칸으로 버튼 클릭 시 alert 띄우기

2️⃣ 입력창에 텍스트 입력 후 버튼 클릭 시 리스트에 추가하기

3️⃣ li 태그 추가 후에 input 창 비워주기

let textArea = document.querySelector("#textArea");
let addBtn = document.querySelector("#addTodo");
let todoList = document.querySelector(".todo-list");

addBtn.addEventListener("click", function () {
	let item = document.createElement("li")
	if (!textArea.value) {
		alert("할일이 입력되지 않았습니다 !!")
	} else {
		item.innerHTML = textArea.value;
		todoList.appendChild(list)
		textArea.value = "";
	}
})

 

 

Todo List의 기능을 구현하기 위해서

리스트를 한번 클릭 시에는 줄을 그어주고,

두 번 클릭 시에는 리스트를 삭제하는 기능을 추가하겠습니다.

1️⃣ 리스트 클릭 시에 줄 생성

2️⃣ 리스트 두번 클릭 시 리스트 삭제

+버튼 클릭 시에 생성되는 li는 따로 click 이벤트 생성하면 불러오지 못함.

버튼 안에서 생성 시에 item이 특정되니 click 이벤트 가능.

 

완성 코드

<index.html>

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0" />
	<title>To Do List</title>
	<link rel="stylesheet" href="./style/style.css" />
</head>

<body>
	<h1>To do list</h1>
	<div class="container">
		<div class="todo-add">
			<input type="text" id="textArea" />
			<button type="button" id="addTodo">+</button>
		</div>
		<ul class="todo-list"></ul>
	</div>
	<script src="./js/common.js"></script>
</body>

</html>

 

<common.js>

let textArea = document.querySelector("#textArea");
let addBtn = document.querySelector("#addTodo");
let todoList = document.querySelector(".todo-list");

addBtn.addEventListener("click", function () {
	let item = document.createElement("li")
	if (!textArea.value) {
		alert("할일이 입력되지 않았습니다 !!")
	} else {
		item.innerHTML = textArea.value;
		todoList.appendChild(item)
		textArea.value = "";
	}

	item.addEventListener("click", function () {
		item.classList.add("__active")
	})
	item.addEventListener('dblclick', function () {
		item.remove()
	})
})

 

 

다음 번엔 더 심화된 Todo List를 구현해보겠습니다.

반응형

'스스로 하는 코딩' 카테고리의 다른 글

자바스크립트 이스케이프 시퀀스  (0) 2023.01.26
gulp 연결하기①  (0) 2022.12.28
스스로 하는 도메인 호스팅(VSCode)  (0) 2022.05.24
반응형

input text 데이터 바인딩

넘겨주려는 데이터 앞에 bind: 를 추가하면 바인딩이 가능

<script>
  let name = '';

</script>

<input type="text" bind:value="{name}"/>
<p>Hello {name}</p>

 

input checkbox 데이터 바인딩

체크 박스 활성화 시에는 Yes, 해제 시에는 No가 보임

<script>
  let yes = true;
</script>

<label>
  <input type="checkbox" bind:checked={yes}/>
  체크박스 테스트
</label>

{#if yes}
<p>Yes</p>
{:else}
<p>No</p>
{/if}

 

input Select 데이터 바인딩

<script>
  let options = [
    {v: 1, t:"Seoul"},
    {v: 2, t:"Busan"},
    {v: 3, t:"Jeju"}
  ];
    let selected = 1;
</script>

<select bind:value={selected}>
  {#each options as opt}
  <option value={opt.v}>{opt.t}</option>
  {/each}
</select>

<p>Select option is : {selected}</p>

 

반응형

'독학코딩 > Svelte' 카테고리의 다른 글

Svelte - 기본 문법  (0) 2023.04.19
Svelte - 라우팅  (0) 2023.04.19
Svelte - 프로젝트 생성  (0) 2023.04.19
반응형

 

1) 데이터를 넘겨주는 게 편하다.

  => {} 안에 넣어서 넘겨주기

  => 이미지 src의 변수명을 src로 지정해 주면 따로 src를 입력해주지 않아도 됨

  => html 태그를 변수에 담았을 때, @html 과 함께 입력해 주면 html 태그로 출력됨

 

 

2) clikc 이벤트 주기

<script>
  let count = 0;
  function increaseCount(){
    count += 1;
  }

</script>

<button type="button" on:click="{increaseCount}">Count</button>
<div>Count: {count}</div>

3) 변수 선언의 다른 방식 ($:)

<script>
  let count = 0;
  function increaseCount(){
    count += 1;
  }
  
  $: if (count > 5) {
    alert("Count는 5보다 클 수 없습니다.");
    count = 5;
  }
  $: sum = count * 2;

</script>

<button type="button" on:click="{increaseCount}">Count</button>
<div>Count: {count}</div>
<div>Sum: {sum}</div>

 

src > components > Nested.svelte 폴더, 파일 생성

4) component 추가하기 

Home.svelte

<script>
  import Nested from '../components/Nested.svelte';
</script>

<Nested/>

 

5) component에 data 넘겨주기

Home.svelte

<Nested name={name}/>

Nested.svelte

<script>
  export let name;
</script>
<p>Nested {name}</p>

 

6) if, else 문 사용하기

Home.svelte

{#if count > 3}
<div>Count: {count}</div>
{/if}
{#if count > 3}
<div>Count2: {count}</div>
{:else}
<div>Count1: {count}</div>
{/if}

 

7) each 문 사용하기 (다중 데이터)

<script>
  let arrData = [
    {user: "홍길동", city: "서울"},
    {user: "말동", city: "인천"},
    {user: "동", city: "경기도"}
  ];
</script>

<table>
  {#each arrData as {user, city}, i}
  <tr>
    <td>{user}</td>
    <td>{city}</td>
  </tr>
  {/each}
</table>
반응형

'독학코딩 > Svelte' 카테고리의 다른 글

Svelte - 바인딩  (0) 2023.04.20
Svelte - 라우팅  (0) 2023.04.19
Svelte - 프로젝트 생성  (0) 2023.04.19
반응형

주제: 페이지 전환을 위한 라우팅 기능을 추가한다.

 

npm install --save svelte-routing

 

svelte-routing 을 설치

 

App.svelte 파일 수정

변경 전

 

 

src > routes 폴더 생성 후, Home.svelteAbout.svelte 파일 만들어주기

그리고 App.svelte에 추가

<script>
	import {Router, Link, Route} from 'svelte-routing';
	import Home from './routes/Home.svelte'
	import About from './routes/About.svelte'

	export let url = '';
</script>

<Router url="{url}">
	<nav>
		<Link to="/">Home</Link>
		<Link to="/About">About</Link>
	</nav>
	<div>
		<Route path='/'><Home/></Route>
		<Route path='/About' component="{About}"></Route>
	</div>
</Router>

변경 후

 

React와 상당히 비슷한데 About을 컴포넌트 태그로 부르는게 아닌 속성으로 불러주는것이 달랐다.

 

 

 

메인을 App으로 설정하기 위해서

 

index.html body에 코드 추가

main.js에 코드 수정

반응형

'독학코딩 > Svelte' 카테고리의 다른 글

Svelte - 바인딩  (0) 2023.04.20
Svelte - 기본 문법  (0) 2023.04.19
Svelte - 프로젝트 생성  (0) 2023.04.19
반응형

회사에서 Svelte를 사용해보게 되어서 기초를 공부했다!!

뭐든 처음은 넘넘 어~려~와~~~

 

먼저, Svelte의 공식 사이트이다.

https://svelte.dev/

 

Svelte • Cybernetically enhanced web apps

Svelte is a radical new approach to building user interfaces. Whereas traditional frameworks like React and Vue do the bulk of their work in the browser, Svelte shifts that work into a compile step that happens when you build your app. Instead of using tec

svelte.dev

 

 

다른 라이브러리, 프레임워크와 비교하면 직관적이고 굉장히 단순하고 쉽다.

그렇지만 내 성격상.. 하나는 완벽히 해야하는데 아직 React도 초초초보인데요!!!

아무.튼 시...작..!!

 

 

1) Svelte 프로젝트를 만들 폴더를 생성한다.

2) VSCode에서 터미널을 열어 튜토리얼과 같이 입력한다.

 npx degit sveltejs/template svelte-study(원하는 폴더명)

3) 프로젝트가 생성된걸 확인 후, npm install 하여 package들을 다운받는다.

4) React와 달리(npm start) => npm run dev 를 입력하면 확인할 수 있다.

 

 

 

쉽고 간단한 Svelte 프로젝트 생성 끝!!

 

 

 

개발자의 품격 유튜버님의 강의를 듣고 정리합니다.

https://www.youtube.com/watch?v=drKEUXO_HaA

 

반응형

'독학코딩 > Svelte' 카테고리의 다른 글

Svelte - 바인딩  (0) 2023.04.20
Svelte - 기본 문법  (0) 2023.04.19
Svelte - 라우팅  (0) 2023.04.19
반응형

React-modal 사용하기

modal 컴포넌트를 만들기 위해 여러가지 찾아보았는데, react-modal을 사용하면

편리하다 하여 3편은 모달 만들기로 적어보겠다.

 

먼저, react-modal을 다운받아준다.

npm i react-modal

 

modal 폴더를 만들어주고 modal.js 파일을 생성한다.

상단에 추가해 주고,

import React from 'react';
import ReactModal from 'react-modal';

 

Modal 클래스를 생성해준다.

const Modal = () => {

  return (
    <ReactModal>
      <div>모달 입니다.</div>
    </ReactModal>
  );
};

export default Modal;

 

그리고 modal이 열릴 js 파일에 상단에 추가해주고,

import Modal from './Modal/Modal';

 

랜더링 될 곳에 useState와 modal을 가져온다.

const [isOpen, setOpen] = useState(false);
const handleClick = () => setOpen(true);
<button onClick={handleClick}>모달 열기</button>
<Modal isOpen={isOpen}/>

 

 

여기까지 왔으면 팝업이 열릴것이다.

 

 

※ 문제는 닫치지 않는다.

 

그래서, Modal.js에 버튼을 추가하여 상위 컴포넌트에서 가져온 props를 이용하여 함수를 사용하였고,

const Modal = ({isOpen}) => {

  return (
    <ReactModal isOpen={isOpen}>
      <button onClick={() => {isOpen(false)}}>X</button>
      <div>모달 입니다.</div>
    </ReactModal>
  );
};

 

상위 컴포넌트에도 Modal에 조건문을 추가하였다.

<button onClick={handleClick}>모달 열기</button>
<>
  {isOpen ? <Modal isOpen={setOpen} /> : null}
</>

 

 

이렇게 열렸다 닫치는 Modal 컴포넌트와 분리 성공~!

 

★ modal에 대해 수정하려면 ReactModal에 추가하여 css 수정

className="Modal" overlayClassName="Overlay"

★ 모달 열기 버튼이 아닌 진짜로 열려야 할 버튼에 추가하여 보자!!..

 

 

 

참고

https://nakta.dev/how-to-manage-modals-1

 

낙타의 블로그 :: 효율적인 modal 관리 with React(1)

중앙화된 모달 관리

nakta.dev

https://phrygia.github.io/react/2021-09-21-react-modal/

 

[react] 모달 팝업창 만들기 (react modal)

프로젝트를 진행할 때마다 모달창을 마주치는 일이 많다. 프론트엔드 프레임워크나 라이브러리를 사용하면 편리성이나 시간을 아낄 수 있기때문에 npm에 등록된 모듈을 사용하곤 했지만, 만들

phrygia.github.io

그 외 여러가지...

반응형

'독학코딩 > React' 카테고리의 다른 글

React - 기초②  (0) 2023.03.28
React - 기초①  (0) 2023.03.28
반응형

Counter.js

=> 버튼 누르면 +1, -1

import React, {useState} from 'react';

const Counter = () => {
  const [num, setNumber] = useState(0);

  const increase = () => {
    setNumber( num + 1);
  }
  const decrease = () => {
    setNumber( num - 1);
  }
  return (
    <div>
      <button onClick={increase}>+1</button>
      <button onClick={decrease}>-1</button>
      <p>{num}</p>
    </div>
  );
}

export default Counter;

1) Counter로 함수 이름 바꾸기

2) 버튼과 숫자 보여지는 p태그 만들기

3) useState를 이용해서 기본 데이터(num)와 변화할 데이터(setNumber)를 0 으로 셋팅

4) increase와 decrease => 데이터의 +-1 함수 생성

 

 

Input.js

=> input의 입력하는 대로 p에서 보여주기

import React, {useState} from 'react';

const Input = () => {
  const [txt, setTxt] = useState("");

  const on = (e) => {
    setTxt(e.target.value)
  }

  return (
    <div>
      <input type="text" value={txt} onChange={on} />
      <p>{txt}</p>
    </div>
  );
}
// p에 보여줌과 동시에 input value 안에도 넣어줌

export default Input;

1) Input으로 함수 이름 바꾸기

2) input[type="text"], p태그 만들기

3) useState로 txt 문자열 공란 만들기

4) onChange 함수를 이용해 value값 담아주기

5) input과 p의 value값을 txt로 변경

 

input2.js

=> input 입력하는 대로 해당 영역에 보여주기

import React, {useState} from 'react';

const Input2 = () => {
  const [inputs, setInputs] = useState({
    name: "",
    email: "",
    tel: ""
  });

    // ECMA 스크립트6 버전에 있는 Object 분해 기법
    // input object 안에 있는 애들을 빼옴
    const {name, email, tel} = inputs;


  const on = (e) => {
    const value = e.target.value;
    const id = e.target.id;

    setInputs({
      // inputs를 깊은 복사해서(안에 들은거 다가져오기) 새로운 Object를 만듬
      // ... + 객체 ===> 상태 관리를 위해서
      ...inputs,
      [id] : value,
    });
  };

  return (
    <div>
      <div>
        <label>이름</label>
        <input type="text" id='name' value={name} onChange={on}/>
      </div>
      <div>
        <label>이메일</label>
        <input type="email" id='email' value={email} onChange={on}/>
      </div>
      <div>
        <label>전화번호</label>
        <input type="tel" id='tel' value={tel} onChange={on}/>
      </div>
      <p>이름: {name}</p>
      <p>이메일: {email}</p>
      <p>전화번호: {tel}</p>
    </div>
  );
}
// p에 보여줌과 동시에 input value 안에도 넣어줌

export default Input2;

1) Input2로 함수 이름 바꾸기

2) 이름, 이메일, 전화번호에 맞는 label+input 태그 만들기

3) useState에 세가지 빈 변수 담아주기

4) value값과 id값을 받아와서 setInput에 담아주는 onChange 함수 생성, id 들의 value를 새로운 Object에 담기

   → ...inputs에서 ...을 붙이면 깊은 복사(안에 들은 변수를 다 가져옴)해서 새로운 Object 생성

5) Object분해 기법을 이용해 바깥에서 변수 한번 더 선언, inputs 안에 있는 애들을 하나씩 빼서 담기

 

 

List.js

=> 배열 데이터를 렌더링(출력)

import React from "react";

const User = ({userData}) => {
  return (
    <tr>
      <td>{userData.name}</td>
      <td>{userData.email}</td>
    </tr>
  )
}

const List = () => {
  const users = [
    { email: 'user@aaaaa.com', name: '홍길똥' },
    { email: 'sdfds@aaaaa.com', name: '김종국' },
    { email: 'tnt@aaaaa.com', name: '이엄자' },
    { email: 'xxx@aaaaa.com', name: '단무지' }
  ]
  return (
    <div>
      <table>
        <thead>
          <tr>
            <th>이름</th>
            <th>이메일</th>
          </tr>
        </thead>
        <tbody>
          {/* User 안에 userData는 property */}
          {/* map으로 돌리며 User의 property로 하나씩 던져줌 */}
          {users.map(user => <User userData={user}/>)}
        </tbody>
      </table>
    </div>
  );
}
// p에 보여줌과 동시에 input value 안에도 넣어줌

export default List;

1) List로 함수 이름 바꾸기

2) 임의의 users 배열 생성

3) 테이블 생성

4) users 배열에 map 반복문으로 user 안에 User의 property(userData)로 하나씩 던져줌

5) User 함수에 userData property를 tbody안에 tr>td 에 각각의 데이터 입력 => users배열이 테이블에 보여짐

 

 

★ (), {}, [] 구분 중요! 

★ useData를 이용하여 함수 사용 중요! (공부多)

 

반응형

'독학코딩 > React' 카테고리의 다른 글

React - 기초③  (0) 2023.03.29
React - 기초①  (0) 2023.03.28
반응형

React-Native와 비슷한 점이 많아서 알고 있는 내용은 상세히 설명하지 않고 넘어가겠다!

업무 중에 React를 사용하기로 하여 React-Native의 기억을 가물치가물치 꺼내며 시작..

 

폴더를 생성하여 VSCode를 열고 터미널을 열어주고 react 폴더를 생성한다.

맨 뒤에 test-app이 폴더명(★Node.js와 npm이 다운로드하여져 있어야 함)

npx create-react-app test-app

 

생성된 폴더 안으로 들어가 react live 서버를 실행한다.

cd test-app
npm start

뭐시깽뭐시깽~ 완료!

 

폴더 구조가 헷갈려서 기초에 대해 공부를 다시 해봤다.

index.js > App.js 가 있고 앞으로 다른 페이지가 생길 것을 감안해서

pages 폴더를 생성해서 컴포넌트를 만들기로 하였다.

 

Router 라우터 생성

Router를 생성해서 컴포넌트끼리 이동이 가능할 수 있게 해야 한다.

먼저 해당 기능을 다운로드하여 준다. (dom 뒤에 @6는 버전)

npm install react-router-dom@6

index.js 상단에 추가해 준다. => BrowserRouter : 가장 보편적으로 많이 사용하는 router

import {BrowserRouter} from 'react-router-dom';

아래에도 BrowserRouter를 추가하여 코드를 수정해 준다.

 

App.js 상단에도 Router를 추가해 준다.

import {Routes, Route, Link} from 'react-router-dom';

Routes : Route들을 모아놓은 것

Route : 이동될 컴포넌트

Link : a태그와 같이 이동시킬 버튼 생성

Link의 to와 Route의 path가 일치한 컴포넌트로 이동된다.

 

 

 

★ 사용되는 기능은 상단에 매번 추가해주어야 한다.

★ 새로운 페이지의 함수 이름은 바꿔주고, 컴포넌트를 부를 때에도 매번 추가해주어야 한다.

 

 

 

참고(기깔난 설명 8편)

https://velog.io/@dlsdk0601/React-%EA%B8%B0%EC%B4%88-%EC%A0%95%EB%A6%AC-1%ED%8E%B8

반응형

'독학코딩 > React' 카테고리의 다른 글

React - 기초③  (0) 2023.03.29
React - 기초②  (0) 2023.03.28
반응형

출처

https://school.programmers.co.kr/learn/courses/30/lessons/120816

 

문제

머쓱이네 피자가게는 피자를 두 조각에서 열 조각까지 원하는 조각 수로 잘라줍니다. 피자 조각 수 slice와 피자를 먹는 사람의 수 n이 매개변수로 주어질 때, n명의 사람이 최소 한 조각 이상 피자를 먹으려면 최소 몇 판의 피자를 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.

 

 

제한사항

  • 2 ≤ slice ≤ 10
  • 1 ≤ n ≤ 100

 

입출력 예

slice n result
7 10 2
4 12 3

 

풀이

 

1) 사람수를 피자 조각수로 나누었을 때,

2)  딱 떨어지면 사람 나누기 조각수 출력

3)  아니면 나누고 한판 더해주기

 

코드

function solution(slice, n) {
    if(n % slice == 0){
        return n / slice
    }else{
        return parseInt(n / slice + 1)
    }
}

 

다른 사람의 풀이

(윽 한대 맞음 1에서 봐놓고 또 사용 못한 바보!)

function solution(slice, n) {
    return Math.ceil(n / slice)
}

 

반응형
반응형

출처

https://school.programmers.co.kr/learn/courses/30/lessons/120815

 

문제

머쓱이네 피자가게는 피자를 여섯 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 매개변수로 주어질 때, n명이 주문한 피자를 남기지 않고 모두 같은 수의 피자 조각을 먹어야 한다면 최소 몇 판을 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.

 

 

제한사항

  • 1 ≤ n ≤ 100

 

입출력 예

n result
6 1
10 5
4 2

 

풀이

 

1) 피자 조각이 6판일때의 변수를 담아서

2)  while문을 통해서 true값이 나올때까지 반복

3) 인원수가 피자조각(6)으로 나누어 떨어질때까지 피자 주문 +6

4) 주문한 피자수의 나누기 6

 

코드

function solution(n) {
    let pizza = 6;
    while(pizza % n !== 0){
        // 0으로 나누어 떨어질때까지 피자 주문 +6
        pizza += 6
    }
    return pizza/6
}
반응형

+ Recent posts