묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지
CityList개발-handleLoadMore함수질문
코드 관련 질문은 아래와 같이 '코드블럭' 기능을 이용해주세요!+ 오류 메세지도 함께 올려주시면 좋아요 🙂 안녕하세요 강의에 따라 그림이 로드 되는 것까지는 성공했지만 이후 handleLoadMore를 넣고 배열이 나오지 않아요...그리고 handleLoadMore함수가 어떻게 실행까지 이어지는지 알려주세요예) handleLoadMore가 new CityList의 인수로 지정되고 cityList 함수에 부여되어 00줄 console.log함수로 출력추가한 코드만 넣었습니다...! 주석 단 부분으로 확인해보니이렇게 작동됨은 확인했습니다! const cityList = new CityList({ $app, initialState: this.state.cities, handleLoadMore: async () => { const newStartIdx = this.state.startIdx + 40; const newCities = await request(newStartIdx, this.state.region, this.state.sortBy, this.state.searchWord); } }); //console.log(cityList) ⚠ 답변은 평일 오전 10시에 순차적으로 작성해드립니다.⚠ '질문 해결'은 답변 작성일 기준 1일 이후에 적용됩니다.
-
미해결한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지
객체와 배열의 const 차이
const로 했을 때 객체는 수정이 되고 배열은 수정이 안된다는 설명 부분이 이해가 잘 안됩니다. 고유 ID가 아니라는 말도 이해가 잘 안되는데 보충 설명을 받을 수 있을까요?
-
미해결한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지
const 객체/배열 차이
왜 객체는 const로 했을 때 수정이 되고, 배열은 const로 했을 때 수정이 안 되는지 이해가 잘 안됩니다.
-
미해결한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지
header 개발 새로고침 오류
검색어 입력 후 새로고침을 하면 Failed to load resource: the server responded with a status of 500 () 이와 같은 오류가 뜨는데 왜 그러는걸까요?그리고 그 밑에 SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON 이렇게 함께 콘솔창에 나옵니다.
-
해결됨Vanilla JavaScript로 직접 구현하는 Notion
만약 문서 수가 매우 많아진다면 성능 이슈는 없을까요?
문서 수가 수백개 이상으로 늘어나면 findDoc(), childrenOf() 등의 함수에서 전체 배열을 순회하는 부분이 성능면에서 문제가 될 수 있을까요? 만약 그렇다면 최적화할 수 있는 방법은 어떤 것이 있을까요?
-
해결됨DOM에서 픽셀까지, 브라우저 렌더링과 CRP 완전 정복 - [DOM 완전 정복 Part 3]
CSS까지만 지연에 영향을 주는건가요?
안녕하세요~! 궁금한 점이 생겨 문의드립니다! DOM + CSSOM > Render Tree를 만들기 때문에 CSS 배치에 따라 CRP에 영향을 주는 것까지는 이해했는데요! script는 async 또는 defer 속성을 알맞게 적어주기만 하면 실행 순서만 보장이 되고 안되고의 차이이고 CRP에는 영향을 주진 않는건가요?
-
미해결한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지
cityList 렌더가 안되는 문제
강의 영상대로 코드를 작성하고, localhost:3000을 열어보니 다음과 같은 오류가 계속 뜨네요 ㅜㅠㅠSyntaxError: Unexpected identifier 'App'. import call expects one or two arguments. 다음은 server.js 입니다const express = require("express"); const path = require("path"); const app = express(); const PORT = 3000; //현재 탐색기에 위치한 폴더들에 서버가 접근할 수 있도록 하는 코드 //join 안에 경로 작성 app.use(express.static(path.join(__dirname, ".."))); //어떤 경로의 요청이 오던지 항상 동일한 index.html 파일을 반환할 수 있도록 코드 작성 app.get("/*splat", (req, res) => { res.sendFile(path.join(__dirname, "..", "index.html")); }); //우리가 설정한 포트번호에서 서버가 항상 요청을 듣고 있을 수 있도록 하는 코드. app.listen(PORT, () => { console.log("START SERVER"); }); 다음은 index.js 입니다import App from "./App.js"; const $app = document.getElementById("app"); new App($app); 무엇이 문제일까요? import 경로를 계속 수정해봐도 같은 에러가 뜹니다 ㅠㅠ
-
미해결[React / VanillaJS] UI 요소 직접 만들기 Part 1
강의 난이도에대해서
혹시 강의 난이도에 대해서 문의드리고싶은데...저만 어렵게 느껴지는건...아니겠죠..?
-
미해결[React / VanillaJS] UI 요소 직접 만들기 Part 1
강의자료 관련 질문
안녕하세요 오늘 강의를 구매했는데, 깃헙클론 부터 초기셋팅 하는법이 어딨는지 몰라서... 혹시 캡처로 첨부드린 내용이 어딨는지 알 수 있을까요??감사합니다
-
해결됨한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지
init 함수 앞에 await
App.js의 App 생성자 함수 안에서 호출하는 init()은 비동기 함수인데 앞에 await을 붙이지 않아도 되나요?
-
해결됨웹 프론트엔드를 위한 자바스크립트 첫걸음
"6. 1. (최신 버전) 자바스크립트 코딩 환경 설정"의 화면이 정상적으로 출력되지 않습니다
"6. 1. (최신 버전) 자바스크립트 코딩 환경 설정"의 화면이 정상적으로 출력되지 않습니다.Chrome과 Safari에서 각각 테스트했으나 결과는 같았습니다.문제 해결 부탁드립니다.
-
미해결한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지
동물 앨범 만들기 pushtState 관련
안녕하세요, 선생님.수업 잘 듣고 있습니다! 동물 앨범 만들기-3 수업을 듣다가 pushState메서드 사용할 때 가장 첫번째 값에 null을 넣는 이유가 궁금합니다!감사합니다! const tabBar = new TabBar({ $app, initialState: "", onClick: async (name) => { history.pushState(null, `${name}`, name); this.setState({ ...this.state, currentTab: name, photos: await request(name === "all" ? "" : name), }); }, }); ⚠ 답변은 평일 오전 10시에 순차적으로 작성해드립니다.⚠ '질문 해결'은 답변 작성일 기준 1일 이후에 적용됩니다.
-
해결됨한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지
동물 앨범 만들기 사진 관련 문의
안녕하세요. 동물 앨범 만들기 부분을 듣고 있습니다. 올려주신 사이트에 들어가려고 하니까 '연결이 비공개로 설정되어 있지 않습니다' 라는 문구가 나와서 여러가지 방법을 사용해봤는데, 마지막에 불법 정보 유해 사이트쪽으로 넘어가지는데 혹시 어떻게 해결할 수 있을까요?⚠ 답변은 평일 오전 10시에 순차적으로 작성해드립니다.⚠ '질문 해결'은 답변 작성일 기준 1일 이후에 적용됩니다.
-
해결됨한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지
자바스크립트 첫걸음 교재 질문..
자바스크립트 첫걸음 교재 책을 구매했는데이 교재로 웹 프론트엔드를 위한 자바스크립트 첫걸음, 한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지교재로 이 두개 강의 같이 공부할수 있나요? 아니면 별도로 정리를 해야할가요
-
해결됨한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지
URL에 따라 리스트 불러오기 - getSortBy()와 getSearchWord()를 활성화 하면 리스트가 사라집니다
const getSortBy = () =>{ if(window.location.search){ const sortText = window.location.search.split('sort=')[1].split('&')[0]; console.log(`getSortBy : ${sortText}`); return sortText; }; return 'total'; }; const getSearchWord = () => { if(window.location.search && window.location.search.includes('search=')){ return window.location.search.split('search=')[1]; }; return ''; }; ... this.state = { startIdx: 0, sortBy : getSortBy(), searchWord: getSearchWord(), region: "", cities: "",}; 일단 문제가 되는 코드는 이 부분 입니다.이부분을 작성 한 이후로, 새로고침 하면 아래 시티리스트가 안나오다가상단 sort 또는 search 를 주석처리 하면 리스트가 출력 됩니다 전체 코드는 아래 git 주소를 같이 봐주시면 감사하겠습니다.https://github.com/KimDay366/onebite_js/tree/main/section09/Trip-Wiki 한시간째 똑같은 코드만 보고 있는데, 계속 봐도 저는 뭐가 문제인지 모르겠네요 ㅠㅠㅠ
-
해결됨한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지
DOM API-2 1분54초 경 질문드립니다.
안녕하세요 강의 잘 듣고 있습니다 좋은 강의 만들어주셔서 감사합니다!DOM API-2 1분54초 경 질문드립니다. let $type = document.createElement("div"); $type.className = "info-item"; $type.id = "type"; $type.textContent = "말티즈"; console.log($type); 이렇게 출력이 되고 div#type.info-itemlet $type = document.createElement("div"); $type.className = "info-item"; $type.id = "type"; $type.textContent = "말티즈"; console.log($type.outerHTML); 다음과같이 .outerHTML을 출력해야 강의와 같이 아래처럼 출력이 되는데<div class="info-item" id="type">말티즈</div>어떤 차이가 있는 걸까요? 환경설정을 어떻게 하면 강의처럼 그냥 console.log($type);만 출력해도<div class="info-item" id="type">말티즈</div>와 같이 웹사이트 콘솔창에서 볼 수 있을까요? ⚠ 답변은 평일 오전 10시에 순차적으로 작성해드립니다.⚠ '질문 해결'은 답변 작성일 기준 1일 이후에 적용됩니다.
-
해결됨한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지
동물앨범 1-1-2
경로 에러가 나와서 혹시 제 파일구조 때문에 그런지 궁금하여 문의드립니다!일단 파일구조가 아래와 같은 방식으로 구성되어있습니다.(맨위에 lecture라고 따로있습니다 lecture/section06/src) 원래 강의코드koala.html<!DOCTYPE html> <head> <title>Animal Album</title> <meta charset="UTF-8" /> <link rel="stylesheet" href="./src/styles.css" /> </head> <body> <div id="app"> <div class="tab-bar"> <a href="/"><div>전체</div></a> <a href="/penguin.html"><div>펭귄</div></a> <a href="/koala.html"><div class="clicked">코알라</div></a> <a href="/panda.html"><div>판다</div></a> </div> <div class="content"></div> </div> <script src="./src/koala.js"></script> </body> 현제 제 코드<!DOCTYPE html> <head> <title>Animal Album</title> <meta charset="UTF-8" /> <link rel="stylesheet" href="./src/styles.css" /> </head> <body> <div id="app"> <div class="tab-bar"> <a href="index.html"><div>전체</div></a> <a href="penguin.html"><div>펭귄</div></a> <a href="koala.html"><div class="clicked">코알라</div></a> <a href="panda.html"><div>판다</div></a> </div> <div class="content"></div> </div> <script src="./src/koala.js"></script> </body> 이렇게 해야 화면에 동물사진이 나오는데 혹시 경로 상의 문제인지 아니면 파일구조상 때문에 이렇게 작성해야하는지 궁금하여 문의드립니다! 차후에 강의를 듣고 프로젝트를 할때 불편함을 느낄지.. 걱정되어 문의드립니다!
-
해결됨한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지
스프링 공부를 하다가 노드 백엔드도 경험해 보고 싶어서 자바스크립트 강의를 들으려는데
백엔드 부분을 위해 필요한 파트는 어디어디인가요?
-
해결됨한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지
node_modules 폴더가 생기지 않아요
npm init -y해서 package.json은 생겼는데 npm install express했을때 package-lock.json은 생겼는데 node_modules 폴더가 생기지 않네요 ㅠ
-
해결됨한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지
최종프로젝트 상세페이지 출력 오류 문의드립니다!
세션 9. 최종 프로젝트cityDetail 개발-2 에서https://trip-wiki-api.vercel.app/ 강사님이 알려주셨던 링크에는 상세페이지 이미지와 받는 정보가 없습니다! 어떻게 상세페이지를 출력할 수 있나요? Japan을 검색창에서 검색하고 상세페이지를 눌렀지만 아무런 정보가 출력되지 않고 있습니다! import Header from "./components/Header.js"; import RegionList from "./components/RegionList.js"; import CityList from "./components/CityList.js"; import CityDetail from "./components/CityDetail.js"; import { request, requestCityDetail } from "./components/api.js"; export default function App($app) { const getSortBy = () => { if (window.location.search) { return window.location.search.split("sort=")[1].split("&")[0]; } return "total"; }; const getSearchWord = () => { if (window.location.search && window.location.search.includes("search=")) { return window.location.search.split("search=")[1]; } return ""; }; this.state = { startIdx: 0, sortBy: getSortBy(), region: window.location.pathname.replace("/", ""), searchWord: getSearchWord(), cities: "", currentPage: window.location.pathname, }; const renderHeader = () => { new Header({ $app, initialState: { currentPage: this.state.currentPage, sortBy: this.state.sortBy, searchWord: this.state.searchWord, }, handleSortChange: async (sortBy) => { const pageUrl = `/${this.state.region}?sort=${sortBy}`; history.pushState( null, null, this.state.searchWord ? pageUrl + `&search=${this.state.searchWord}` : pageUrl ); const cities = await request( 0, this.state.region, sortBy, this.state.searchWord ); this.setState({ ...this.state, startIdx: 0, sortBy: sortBy, cities: cities, }); }, handleSearch: async (searchWord) => { history.pushState( null, null, `/${this.state.region}?sort=${this.state.sortBy}&search=${searchWord}` ); const cities = await request( 0, this.state.region, this.state.sortBy, searchWord ); this.setState({ ...this.state, startIdx: 0, cities: cities, searchWord: searchWord, }); }, }); }; const renderRegionList = () => { new RegionList({ $app, initialState: this.state.region, handleRegion: async (region) => { history.pushState(null, null, `/${region}?sort=total`); const cities = await request(0, region, "total"); this.setState({ ...this.state, startIdx: 0, sortBy: "total", region: region, cities: cities, searchWord: "", currentPage: `/${region}`, }); }, }); }; const renderCityList = () => { new CityList({ $app, initialState: this.state.cities, handleItemClick: async (id) => { history.pushState(null, null, `/city/${id}`); this.setState({ ...this.state, currentPage: `/city/${id}`, }); }, handleLoadMore: async () => { const newStartIdx = this.state.startIdx + 40; const newCities = await request( newStartIdx, this.state.region, this.state.sortBy ); this.setState({ ...this.state, startIdx: newStartIdx, cities: { ...this.state.cities, cities: [...this.state.cities.cities, ...newCities.cities], isEnd: newCities.isEnd, }, }); }, }); }; const renderCityDetail = async (cityId) => { try { const cityDetailData = await requestCityDetail(cityId); new CityDetail({ $app, initialState: cityDetailData }); } catch (err) { console.log(err); } }; const render = async () => { const path = this.state.currentPage; $app.innerHTML = ""; // 상세 페이지로 이동 if (path.startsWith("/city/")) { const cityId = path.split("/city/")[1]; renderHeader(); renderCityDetail(cityId); } else { renderHeader(); renderRegionList(); renderCityList(); } }; this.setState = (newState) => { this.state = newState; render(); }; const init = async () => { const path = this.state.currentPage; // 메인 페이지 if (!path.startsWith("/city")) { const cities = await request( this.state.startIdx, this.state.region, this.state.sortBy, this.state.searchWord ); this.setState({ ...this.state, cities: cities, }); } // 상세페이지 else { render(); } }; window.addEventListener("popstate", async () => { const urlPath = window.location.pathname; const prevRegion = urlPath.replace("/", ""); const prevPage = urlPath; const prevSortBy = getSortBy(); const prevSearchWord = getSearchWord(); const prevStartIdx = 0; const prevCities = await request( prevStartIdx, prevRegion, prevSortBy, prevSearchWord ); this.setState({ ...this.state, startIdx: prevStartIdx, sortBy: prevSortBy, region: prevRegion, currentPage: prevPage, searchWord: prevSearchWord, cities: prevCities, }); }); init(); } //API.js 코드입니다!export default function CityDetail({ $app, initialState }) { this.state = initialState; this.$target = document.createElement("div"); this.$target.className = "city-detail"; $app.appendChild(this.$target); const getScoreColor = (score) => { // let scoreNumber = parseInt(score); if (score >= 4) return "green"; if (score >= 3) return "yellow"; return "red"; }; this.template = () => { let cityData = this.state.CityDetail; let temp = ``; if (cityData) { temp = `<div class="image-banner"> <img src="${cityData.image}"/> <div class="city-name"> <div class="city">${cityData.city}</div> <div class="country">${cityData.region} / ${cityData.country}</div> </div> </div> <div class="progress-container"> <div class="info-item"> <div class="label">⭐ Total Score</div> <div class="progress-bar" score-color="${getScoreColor( cityData.total )}" style="--score:${cityData.total * 20}%"></div> </div> <div class="info-item"> <div class="label">💵 Cost</div> <div class="progress-bar" score-color="${getScoreColor( cityData.info.cost )}" style="--score:${cityData.info.cost * 20}%"></div> </div> <div class="info-item"> <div class="label">😆 Fun</div> <div class="progress-bar" score-color="${getScoreColor( cityData.info.fun )}" style="--score:${cityData.info.fun * 20}%"></div> </div> <div class="info-item"> <div class="label">🚓 Safety</div> <div class="progress-bar" score-color="${getScoreColor( cityData.info.safety )}" style="--score:${cityData.info.safety * 20}%"></div> </div> <div class="info-item"> <div class="label">🌐 Internet</div> <div class="progress-bar" score-color="${getScoreColor( cityData.info.internet )}" style="--score:${cityData.info.internet * 20}%"></div> </div> <div class="info-item"> <div class="label">💨 Air Condition</div> <div class="progress-bar" score-color="${getScoreColor( cityData.info.air )}" style="--score: ${cityData.info.air * 20}%"></div> </div> <div class="info-item"> <div class="label">🍜 Food</div> <div class="progress-bar" score-color="${getScoreColor( cityData.info.food )}" style="--score: ${cityData.info.food * 20}%"></div> </div> </div> `; } return temp; }; this.render = () => { this.$target.innerHTML = this.template(); }; /* this.setState = (newState) => { this.state = newState; this.render(); }; */ this.render(); } //cityDetail.js 상세페이지 코드입니다!