Vue.js 에서 v-for 객체배열을 통해 반복문을 연습하기 예제입니다.

 

<template>
    <main>
        <h1>반복문 사용하기</h1>
        <table>
            <thead>
                <tr>
                    <th>제품명</th>
                    <th>가격</th>
                    <th>카테고리</th>
                    <th>배송료</th>
                </tr>
            </thead>
            <tbody>
                <tr :key="i" v-for="(product, i) in products">
                    <td>{{ product.name }}</td>
                    <td>{{ product.price }}</td>
                    <td>{{ product.category }}</td>
                    <td>{{ product.delivery }}</td>
                </tr>
            </tbody>
        </table>
    </main>
</template>
<script>
export default {
    name: '',
    components: {},
    data() {
        return {
            products: [
                { name: '게이밍마우스', price: 34500, category: '컴퓨터/주변기기', delivery: 4000 },
                { name: '무선게이밍마우스', price: 52000, category: '컴퓨터/주변기기', delivery: 3000 },
                { name: '게이밍키보드', price: 42000, category: '컴퓨터/주변기기', delivery: 3000 },
                { name: '무선게이밍키보드', price: 50000, category: '컴퓨터/주변기기', delivery: 4000 },
                { name: '무선충전기기', price: 24000, category: '컴퓨터/주변기기', delivery: 3000 },
                { name: '갤럭시탭', price: 385000, category: '모바일/휴대기기', delivery: 0 },
            ]
        }
    },
    methods: {}
}
</script>

 

오히려 이전 발행글보다 난이도가 낮아진 기초의 느낌입니다.

 

 

[ Vue.js ] 반복문 사용하기 for .. in .. , 객체 리스트 출력하는 방법

안녕하세요 상훈입니다. Vue.js에서 반복문을 사용하고, 그 속에서 data binding이 된 객체 데이터를 출력하는 방법을 포스팅하겠습니다. 1. data 2. template 1. data import products from './assets/listData.j..

code-hoon.tistory.com

 

 

반응형

 

Canvas.js 를 사용하는 와중 특정한 조건에 의해 새로운 차트비동기로 재출력하는 상황,
아래와 같은 에러가 발생하였다.

 

 

이유인즉슨, 기존의 차트가 존재하기 때문에 새로운 차트를 적용할 수 없다는 것이다.

 

그렇기 때문에 기존의 차트를 제거하는 수순을 밟아야한다.

 const ChartName = new Chart(
        document.getElementById('generalList'),			// canvas의 id 호출
        ChartNameConfig								// Config로 기본 설정했던 변수 호출
      );
      ChartName.destroy()							// ★★destroy로 기존의 canvas를 제거
  }

destroy()new Chart 함수의 마지막에 작성한다.

 

 

 

https://pretagteam.com/question/canvas-is-already-in-use-chart-with-id-0-must-be-destroyed-before-the-canvas-can-be-reused-chatjs

 

pretagteam.com

 

해당 페이지 참고

반응형

 

 

깃 허브(Github)에 있는 본인의 레파지토리(Repository)연결하는 방법에 대해 포스팅하겠습니다.
순서대로 해주세요

 

본인의 깃 레파지토리 주소

 

 

빈 폴더 한곳에서 진행해주세요. (git과 연결되어있는 폴더 내부지양해주세요)

1. git init
2. git remote add origin "git repository url"

# repository와 연결이 잘되었는지 확인
3. git remote -v
4. git pull

# git repository에 이미 데이터 자체가 있다면,
5. git clone "git repository url"

 

만약 가장 처음 등록하여 개인 정보 자체가 없을 경우 개인정보를 등록해줍니다.

$ git config --global user.email "깃허브 이메일주소"
$ git config --global user.name "깃허브 이름"

 

그리고 본인이 원하는 내용 한개를 추가해서 add 하고 commit을 해주면 된다.

 

■ 이 글을 쓰게 된 이유

지난번에 git pull을 통해 repository와 연동하려고 하였는데 실패하고, 해당 내용이 모두 분실되어 다시 restore을 진행하고,
전체적인 폴더 구조를 변경하는 번거로움(분노)이 있었다. 

항상 먼저 작업을 할 때에는

▶ 하위 git 경로와 겹치지 않게,
해당 branch clone을 우선적으로 진행해주어 최신화를 해주는 것을 잊지 말도록 하자.


 

 

참고 블로그

 

GitHub 원격 저장소와 로컬 Git 저장소 연동하는 방법

GitHub은 원격 저장소를 호스팅해주는 서비스로, 본격적인 코드 작업을 하려면 GitHub의 저장소와 로컬 Git 저장소를 연동해야합니다. 이 글에서는 원격 저장소와 로컬 저장소를 연동하는 방법들을

www.lainyzine.com

 

 

반응형

깃허브(Git Hub)에서 코드가져오는 방법은 다양합니다.

1. 다운로드
2. 명령어 
3. etc

사실 여러 모든 내용이 전부 "Clone"을 하는 또다른 형태입니다.

그래서 근본인 clone 명령어만 수기하도록 하겠습니다.

$ git clone "repository url"

 

아주 간단합니다.

 

반응형

 

 

Web Application에서 게시판이나 상품리스트와 같이 정렬이 존재하고,
페이지를 넘겨야하는 경우가 있는데, 이 때 pagination을 사용한다.


라이브러리(ex. Pagination.js) 도 존재하지만 직접 코딩할 때 필요한 limit offset, count를 포스팅하겠다.

 

Pagination.js | Home

 

pagination.js.org

 

Mysql 에서 limit를 사용할때 보통은 1개의 인자만 입력하여 최대 n개 를 가져오게 한다.

select * from tableName ~ limit 10;

 

그런데 pagination을 적용할 때에는 limit n 으로 전부 처리할 수가 없다.
페이지가 분할되어 출력되어야 하기 때문이다. 

그래서 limt n, k ; 를 사용하는데,

select * from tableName ~ limit 행의 수(offset),  출력할 컬럼 수;

//예시 
select * from tableName ~ limit 3, 4
// 0,1,2,3번째 행부터 4개 출력

 

column_no id
3 id_three
4 id_four
5 id_five
6 id_six

 

이렇게 사용한다.

offset 기본적으로는 0으로 처리되며,

설정하지 않을 경우 그냥 자동으로 0 처리가 된다. 

즉, 평소에 offset을 제공하지 않고 limit을 사용한 경우, offset이 0이 자동생략되었다는 것이다.

 

반응형

[ 사용 환경 : Vue.js, tailwind css ]

Vue.js 에서 daum address api (kakkao map) 를 사용하는 방법을 포스팅 하겠습니다.

기존 html css js 에서 사용하는 것과 달리 조금은 번거로운 작업이 존재합니다.

 

 

Daum 우편번호 서비스

우편번호 검색과 도로명 주소 입력 기능을 너무 간단하게 적용할 수 있는 방법. Daum 우편번호 서비스를 이용해보세요. 어느 사이트에서나 무료로 제약없이 사용 가능하답니다.

postcode.map.daum.net

위 링크를 통해 실제 예제가 존재합니다.  이를 변형하여 vue에 맞게 제작하겠습니다.

 

팝업(pop up)을 이용한 웹 (Web application) 전용으로 제작하도록 하겠습니다.

 


 

■ 작업 순서

1. index.html 
2. component 생성
3. component import

 

1. index.html 파일에서 cdn 연결해주기

    <script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>

위의 내용을 복사해서 <head></head> 에 작성해주세요.

 

2. component 생성

이제 해당 내용을 작성할 컴포넌트를 생성하도록 하겠습니다.

src/views/Account/Address.vue

src/views/Account/Address.vue 파일을 생성하였습니다.

Address.vue

<template>
    <div class="text-md my-5">
        <label class="text-xs px-2" for="company_name">회사주소</label><br> 
        <input class="focus:outline-none focus:ring focus:border-blue-600 border-b-2 border-black pt-2 px-2 mb-3 mr-10"  
            type="text" id="sample4_postcode" name="post_number" placeholder="우편번호">
        <button class="border-2 border-gray-400 rounded bg-gray-100 p-1 inline-block"
            type="button" @click="addressApi">우편번호 찾기</button><br>

        <input class="mr-10 focus:outline-none focus:ring focus:border-blue-600 border-b-2 border-black pt-2 px-2 mb-3"   
            type="text" id="sample4_roadAddress" name="address1" placeholder="도로명주소">
        <span id="guide" style="color:#999;display:none"></span>
        <input class="focus:outline-none focus:ring focus:border-blue-600 border-b-2 border-black pt-2 px-2"   
            type="text" id="sample4_extraAddress" name="address3" placeholder="참고항목">
        <input class="focus:outline-none focus:ring focus:border-blue-600 border-b-2 border-black pt-2 px-2"   
            type="text" id="sample4_detailAddress" name="address4" placeholder="상세주소">
    </div>
</template>

<script>
export default {
    methods: {
     addressApi() {
        new daum.Postcode({
            oncomplete: function(data) {
                // 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.

                // 도로명 주소의 노출 규칙에 따라 주소를 표시한다.
                // 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
                var roadAddr = data.roadAddress; // 도로명 주소 변수
                var extraRoadAddr = ''; // 참고 항목 변수

                // 법정동명이 있을 경우 추가한다. (법정리는 제외)
                // 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다.
                if(data.bname !== '' && /[동|로|가]$/g.test(data.bname)){
                    extraRoadAddr += data.bname;
                }
                // 건물명이 있고, 공동주택일 경우 추가한다.
                if(data.buildingName !== '' && data.apartment === 'Y'){
                   extraRoadAddr += (extraRoadAddr !== '' ? ', ' + data.buildingName : data.buildingName);
                }
                // 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다.
                if(extraRoadAddr !== ''){
                    extraRoadAddr = ' (' + extraRoadAddr + ')';
                }

                // 우편번호와 주소 정보를 해당 필드에 넣는다.
                document.getElementById('sample4_postcode').value = data.zonecode;
                document.getElementById("sample4_roadAddress").value = roadAddr;

                // 참고항목 문자열이 있을 경우 해당 필드에 넣는다.
                if(roadAddr !== ''){
                    document.getElementById("sample4_extraAddress").value = extraRoadAddr;
                } else {
                    document.getElementById("sample4_extraAddress").value = '';
                }

                var guideTextBox = document.getElementById("guide");
                // 사용자가 '선택 안함'을 클릭한 경우, 예상 주소라는 표시를 해준다.
                if(data.autoRoadAddress) {
                    var expRoadAddr = data.autoRoadAddress + extraRoadAddr;
                    guideTextBox.innerHTML = '(예상 도로명 주소 : ' + expRoadAddr + ')';
                    guideTextBox.style.display = 'block';

                } else if(data.autoJibunAddress) {
                    var expJibunAddr = data.autoJibunAddress;
                    guideTextBox.innerHTML = '(예상 지번 주소 : ' + expJibunAddr + ')';
                    guideTextBox.style.display = 'block';
                } else {
                    guideTextBox.innerHTML = '';
                    guideTextBox.style.display = 'none';
                }
            }
        }).open();
    }       
    }
    }

</script>

<style>
.address-layout{
    display:none;
    position:fixed;
    overflow:hidden;
    z-index:1;
    -webkit-overflow-scrolling:touch;
}
</style>

 

3. component import

본래 사용할 component에 Address.vue 를 import 하도록 합니다.

<template>
  <Address />
</template>

<script>
import Address from './Address'

  export default {
      components: {
          Address,
      },
</script>

 

■ 결과 확인

예쁘게 꾸미고 싶은데 제 주제가 안되더라구요. 왤까요. 불합리한 세상.

 

이제 우편번호 찾기를 클릭하면 정상적 출력 됨을 확인하실 수 있습니다.

 

 

 


■ 후기

사실 완전히 Vue.js style로 변형한건 아닙니다. 

그냥 js 기반의 언어기 때문에 혼용이 될 뿐입니다. 

$emit 을 이용한다던가, data () {} 를 작성하여 값을 모니터링 한 것도 아닙니다.

쓰면 좋겠지만, 렌더링 속도나 구현 속도 등을 고려했을 때 굳이 안바꿔도 된다 생각하여 제멋대로 변형해보았습니다.

 

반응형

사용환경 : Linux, Ubuntu, Vue.js 3, vue-cli, axios - post, php

Vue-cli port : 8081
PHP Apache server port : 8080

Vue.js 3 에서 axios를 이용해 php데이터를 송신하는 방법을 포스팅하도록 하겠습니다.

3일째 이거 만지다가 어쩌다 됐습니다. 억울..

[버전은 상관없지만] @vue/cli 4.5.15 에서 적용하였습니다. 


■ 1. Vue-cli project 설정 1/2

/src/views/Account/AxiosTest.vue

디렉터리 구조

제가 form을 이용해 post data송신Vue 페이지는 위와 같습니다.

AxiosTest.vue 
=> input 태그 2개로, id 와 password를 전달하려고 합니다.

1. Template

<template>
  <div>
    <form action="" @submit="checkForm">
      <input type="text" name="id" v-model="idValue" />
      <input type="password" name="password" v-model="passwordValue" />
      <button type="submit">submit</button>
    </form>
  </div>
</template>

 

2. script

<script>
import axios from "axios";

export default {
  data() {
    return {
      idValue: "",
      passwordValue: "",
    };
  },
  methods: {
    async checkForm(e) {
      e.preventDefault();
      let idValue = this.idValue;
      let passwordValue = this.passwordValue;

      await axios
        .post("/api/loginCheck", {
          id: idValue,
          password: passwordValue
        })
        .then(function (response) {
          // handle success
          console.log("success");

          console.log(response);
        })
        .catch(function (error) {
          // handle error
          console.log(error);
        })
        .then(function () {
          // always executed
        });
    },
  },
};
</script>

 

■ 1. Vue-cli project 설정 2/2

vue.config.js

vue.config.js

프로젝트의 root 경로에 vue.config.js 파일을 없으신 분들은 생성해주시고 아래의 내용을 복붙해주세요.

 

vue.config.js

module.exports = {
  devServer: {
    proxy: {
      "/api": {
        target: "http://localhost:8080/",
      },
    },
  },
};

 

■ 3. php 

Apache 서버를 사용하신다면, 8080포트로 구동 중이실겁니다. (본인의 포트에 맞게 설정해주세요)

/var/www/html/ 경로에 /api 폴더를 생성해주세요. 이곳에 axiosdata 를 수신할 php 파일을 생성할겁니다.

이렇게 생성하였습니다. (자유롭게 생성해주세요. 보통 /api 라고 많이 생성합니다.

/api/loginCheck.php

<?php
 // header의 요청을 수락하는 php 설정들. 안해주면 데이터를 못받는 경우가 생김
header('Access-Control-Allow-Origin:*');
header("Access-Control-Allow-Credentials", "true");
header('Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers');
header('Access-Control-Allow-Methods:GET,POST,PUT,DELETE,OPTIONS');

$data = json_decode(file_get_contents('php://input'), true);

// 반복문으로 데이터 출력 


■ 결과

개발자 - 네트워크
data
콘솔 화면

 

감격스럽게도 200 통신 성공 결과가 출력되었고,

php에서 $data 는 array 의 타입이기 때문에 출력 결과(response) 가 array 로 출력되었습니다. 

 

■ 1차 수정

- 기존에 params 를 넘겨줘서 자꾸 데이터가 array로 출력이 되었습니다.

params를 없앤 모습

- 기존 : data(=params객체) : jsonStyleValues 
- 변경 : { jsonStyleValues list}

* POST method에서는 params넘겨주면 안된다. 

 

 

참고

 

Sending Axios parameters with a POST request in PHP – ZeroWP

Using a library like Axios to create complex AJAX requests is simple and easy. Of course, we can use `fetch` but still, I prefer Axios because of the many options it has, which is lightweight, well documented, and stable. Recently I tried to use it by crea

zerowp.com

 

 

Configuration Reference | Vue CLI

Configuration Reference Global CLI Config Some global configurations for @vue/cli, such as your preferred package manager and your locally saved presets, are stored in a JSON file named .vuerc in your home directory. You can edit this file directly with yo

cli.vuejs.org

https://coderedirect.com/questions/43570/axios-get-from-local-php-just-returns-code-instead-of-executing

 

Axios GET from local PHP just returns code instead of executing - Code Redirect

The API I am trying to access has disabled CORS so I need to request on the server side. Utilizing React and Axios I am making a get request to the local php file which should execute cURL but am j...

coderedirect.com

 

덕분에 3일동안 axioshttp, proxy, 등에 대해 많이 공부할 수 있었습니다.

반응형

안녕하세요 상훈입니다.

Kotlin 에서 button 클릭 시, 혹은 image button 클릭 시,
Toast 메시지를 출력하는 방법에 대해 포스팅 하겠습니다.

 

var contentToast = Toast.makeText(this, "Content button clicked", Toast.LENGTH_SHORT)
contentToast.show()

toast메시지 생성 방법은 위와 같습니다.
변수에 toast 메시지 내용할당하고, show() 함수를 통해 해당 내용을 체이닝하여 출력하는 방식.

 

 

 

예제1)

버튼 클릭 시, toast 메시지 출력

private lateinit var binding: ActivityMainBinding

onCreate(){

  binding.contentBtn.setOnClickListener {
      var contentToast = Toast.makeText(this, "Content button clicked", Toast.LENGTH_SHORT)
      contentToast.show()
  }
       
}

contentBtn이라는 id 를 가진 Image Button에 대한 클릭 이벤트 안에 Toast 메시지를 출력하도록 작성하였습니다.

 

 

예제2) : 좋아요 버튼

이미지 버튼 2개 준비합니다. [ 클릭 전, 클릭 후 ] 의 각각의 이미지를 나타냅니다.

binding.heartBtn.setOnClickListener {
    if (!liked) {
        binding.heartBtn.setBackgroundResource(R.drawable.checkedheart);
        var likeToast = Toast.makeText(this, "Liked!!", Toast.LENGTH_SHORT)
        likeToast.show()
    } else {
        binding.heartBtn.setBackgroundResource(R.drawable.heart);
        var likeToast = Toast.makeText(this, "UnLiked!!", Toast.LENGTH_SHORT)
        likeToast.show()
    }
    liked = !liked; // reverse
}

 

before  &  after

 

클릭 시 toast 메시지 출력과 빈 하트가 빨간 하트로 변경되게 설정하였습니다.

vue로 따지자면 v-if( ! liked ) / else 가 되겠네요.

반응형

+ Recent posts