학은제 과제로 성적 계산기 만들기가 나왔다.. 겸사겸사 공유한다.

과제 조건

우선 3명의 이름과 성적을 입력받고 제출 버튼을 클릭하면 순위대로 이름, 총점, 평균을 출력하는 코드를 작성했다.

<body>
  <h2>성적 계산기</h2>
  <form action="post" name="grade">
    <p>이름 : <input type="text" size="4" name="name1"> 국어 : <input type="text" size="4" name="kor1"> 영어 : <input type="text" size="4" name="eng1"> 수학 : <input type="text" size="4" name="math1"></p>
    <p>이름 : <input type="text" size="4" name="name2"> 국어 : <input type="text" size="4" name="kor2"> 영어 : <input type="text" size="4" name="eng2"> 수학 : <input type="text" size="4" name="math2"></p>
    <p>이름 : <input type="text" size="4" name="name3"> 국어 : <input type="text" size="4" name="kor3"> 영어 : <input type="text" size="4" name="eng3"> 수학 : <input type="text" size="4" name="math3"></p>
    <input type="button" value="제출" onclick="result()">
    <p>이름 : <input type="text" size="4" name="1th"> 총점 : <input type="text" size="4" name="sum1"> 평균 : <input type="text" size="4" name="avg1"> 순위 : <input type="text" size="4" name="rank1"></p>
    <p>이름 : <input type="text" size="4" name="2th"> 총점 : <input type="text" size="4" name="sum2"> 평균 : <input type="text" size="4" name="avg2"> 순위 : <input type="text" size="4" name="rank2"></p>
    <p>이름 : <input type="text" size="4" name="3rd"> 총점 : <input type="text" size="4" name="sum3"> 평균 : <input type="text" size="4" name="avg3"> 순위 : <input type="text" size="4" name="rank3"></p>
  </form>
</body>

simple is best

제출 버튼을 눌렀을 때 main.js에서 만든 result() 함수가 실행되고 최소한 이름이나 성적에 빈칸이 있을 경우 제출하지 못하게 경고 창을 띄워주고 (정확하겐 이름엔 텍스트만 입력되고 성적엔 숫자만 입력되게 해주는 좋다)

 

function result() {
  if(grade.kor1.value === "" || grade.kor2.value === "" || grade.kor3.value === "") {
    alert('국어 점수를 입력해주세요');
  } else if (grade.name1.value === "" || grade.name2.value === "" || grade.name3.value === ""){
    alert('학생의 이름을 입력해주세요');
  } else if (grade.eng1.value === "" || grade.eng2.value === "" || grade.eng3.value === ""){
    alert('영어 점수를 입력해주세요');
  } else if (grade.name1.value === "" || grade.name2.value === "" || grade.name3.value === ""){
    alert('수학 점수를 입력해주세요');
  }
}

빈칸이 없이 잘 입력되었을 경우 계산이 시작된다.

 

여기서 값을 입력 받고 평균과 등수를 정해서 출력해줘야 하는데.. 하나씩 비교해가면서 쓰는건 좀 아닌거 같아서 찾아보니 아주 좋은 코드가 있었다.

 

    var sum1 = parseInt(grade.kor1.value) + parseInt(grade.eng1.value) + parseInt(grade.math1.value);
    var sum2 = parseInt(grade.kor2.value) + parseInt(grade.eng2.value) + parseInt(grade.math2.value);
    var sum3 = parseInt(grade.kor3.value) + parseInt(grade.eng3.value) + parseInt(grade.math3.value);

    const sumArray = [sum1, sum2, sum3];
    const answer = [];
    const ranking = [...sumArray].sort((a,b)=>b-a);
    for(let n of sumArray) {
      answer.push(ranking.indexOf(n)+1)
    }

우선 입력받은 값들을 저장하고 배열에 넣은 다음 등수를 저장할 빈 배열을 만들고 랭킹에서 오름차순 정렬으로 점수 배열의 값들을 돌려서 빈 배열에 인덱스 +1로 넣어준다. 그러면 동점 처리까지 완벽..

 

main.js 전체 코드

function result() {
  if(grade.kor1.value === "" || grade.kor2.value === "" || grade.kor3.value === "") {
    alert('국어 점수를 입력해주세요');
  } else if (grade.name1.value === "" || grade.name2.value === "" || grade.name3.value === ""){
    alert('학생의 이름을 입력해주세요');
  } else if (grade.eng1.value === "" || grade.eng2.value === "" || grade.eng3.value === ""){
    alert('영어 점수를 입력해주세요');
  } else if (grade.math1.value === "" || grade.math2.value === "" || grade.math3.value === ""){
    alert('수학 점수를 입력해주세요');
  } else {
    var sum1 = parseInt(grade.kor1.value) + parseInt(grade.eng1.value) + parseInt(grade.math1.value);
    var sum2 = parseInt(grade.kor2.value) + parseInt(grade.eng2.value) + parseInt(grade.math2.value);
    var sum3 = parseInt(grade.kor3.value) + parseInt(grade.eng3.value) + parseInt(grade.math3.value);

    const sumArray = [sum1, sum2, sum3];
    const answer = [];
    const ranking = [...sumArray].sort((a,b)=>b-a);
    for(let n of sumArray) {
      answer.push(ranking.indexOf(n)+1)
    }
   
    grade.rank1.value = answer[0];
    grade.rank2.value = answer[1];
    grade.rank3.value = answer[2];

    var avg1 = sum1 / 3;
    var avg2 = sum2 / 3;
    var avg3 = sum3 / 3;

    grade.first.value = grade.name1.value;
    grade.sec.value = grade.name2.value;
    grade.thr.value = grade.name3.value;

    grade.sum1.value = sum1;
    grade.sum2.value = sum2;
    grade.sum3.value = sum3;

    grade.avg1.value = avg1;
    grade.avg2.value = avg2;
    grade.avg3.value = avg3;
   
  }
}

짜잔 참 쉽죠?

https://nomadcoders.co/nextjs-fundamentals/lectures/3440

 

All Courses – 노마드 코더 Nomad Coders

초급부터 고급까지! 니꼬쌤과 함께 풀스택으로 성장하세요!

nomadcoders.co

NextJS에서는 페이지간 이동에 a태그를 권장하지 않는다.

왜냐하면 a태그는 페이지 전체를 불러오기 때문에 속도와 최적화의 문제로 Link 컴포넌트를 권장하기 때문이다.

(React에서 React Router Link)를 사용하는 것과 비슷하다. 

Link 컴포넌트를 사용하기 위해 우선 임포트를 하고

import Link from "next/link";

수업에서 나온대로 링크 컴포넌트로 a태그를 감싸주면..!

import Link from "next/link";

import { useRouter } from "next/router";

 

export default function NavBar() {
    const router = useRouter();
    return (
        <nav>
            <Link href="/">
                <a>Home</a>
            </Link>

 

            <Link href="/about">
                <a >About</a>
            </Link>
        </nav>
    );
}

짜잔 오류가 난다

왜 이런고.. 강의 댓글과 이유를 찾아보니 NextJS가 13버전으로 올라가고 난 후에 생긴 에러였다.

a태그를 지워주거나 Link 컴포넌트 안에 legacyBehavior를 추가해주어야 한다고 한다.

https://nextjs.org/docs/messages/invalid-new-link-with-extra-ancho
import Link from "next/link";
import { useRouter } from "next/router";

export default function NavBar() {
    const router = useRouter();
    return (
        <nav>
            <Link href="/">Home</Link>

            <Link href="/about">About</Link>
        </nav>
    );
}

잘된다.

 

invalid-new-link-with-extra-anchor | Next.js

Invalid with child Starting with Next.js 13, renders as , so attempting to use as a child is invalid. Run the new-link codemod to automatically upgrade previous versions of Next.js to the new usage: npx @next/codemod new-link . This will change Home to Hom

nextjs.org

 

+ Recent posts