# v-if 사용 예제보기아주 간단한 예제입니다. 클릭 가능한 스위치를 하나 만들고 이 버튼을 누르면 텍스트가 나타나고 사라지는 토글 기능 동작의 예제입니다.

<script>
data: {
  isStatusOn: false
},
methods: {
  toggleOnOff: function() {
    this.isStatusOn = !this.isStatusOn;
  }
}
...
</script>


버튼과 메시지는 아래와 같이 만들어줍니다. v-if도 아래에 위치합니다.

<div v-if="isStatusOn">Hello Webisfree.com</div>
<button @click="toggleOnOff">Click</button>


이제 버튼을 클릭하면 메시지를 보이고 'Hello Webisfree.com'이 나타나게됩니다.



출처 : https://webisfree.com/2018-10-02/[vuejs]-v-if%EB%A1%9C-%EC%9A%94%EC%86%8C-%EB%B3%B4%EC%9D%B4%EA%B1%B0%EB%82%98-%EC%88%A8%EA%B8%B0%EB%8A%94-%EB%B0%A9%EB%B2%95

변수(Variable)는 (문자나 숫자 같은) 값을 담는 컨테이너로 값을 유지할 필요가 있을 때 사용한다. 여기에 담겨진 값은 다른 값으로 바꿀 수 있다. 변수는 마치 (사람이 쓰는 언어인) 자연어에서 대명사와 비슷한 역할을 한다.

변수의 선언

JavaScript에서 변수는 var로 시작한다. var은 변수를 선언하겠다는 것을 의미한다. var을 생략 할수도 있지만 이것은 유효범위라는 것에 영향을 미친다. 그렇기 때문에 var의 의미를 명확하게 이해하기 전까지는 var를 사용하는 것이 권장된다. 유효범위에 대해서는 뒤에서 살펴볼 것이다. 변수의 이름은 $, _, 혹은 특수 문자를 제외한 모든 문자로 시작할 수 있다. 다음 예제는 변수에 값을 대입한 예제다.

1
2
3
4
5
var a = 1;
alert(a+1); //2
var a = 2;
alert(a+1); //3

//은 주석(comment)으로 코드에 부가적인 설명을 쓰거나 사용하지 않는 코드를 비활성화시키기 위해서 사용한다. //뒤에 따라오는 내용은 해석되지 않는다.

세미콜론(;)은 하나의 구문이 끝났음을 명시적으로 나타내는 기호다. 다음처럼 한줄에 여러구문을 사용하고 싶을 때 세미콜론이 유용하다.

a = 1; alert(a+1);

JavaScript에서는 세미콜론을 생략할 수 있는데, 이 경우 줄바꿈을 명령의 끝으로 간주하게 된다.


https://opentutorials.org/course/743/4673

1. 공통점


(1) typeof 연산자를 배열에 사용하였을 때 Object가 출력된다.


(2) 배열과 객체는 프로퍼티를 가질 수 있다. 배열 인덱스에 사용할 수 없는 값을 할당하게 되면 이것은 객체의 프로퍼티처럼 동작함. 아래 링크 참조. 


http://stackoverflow.com/questions/874205/what-is-the-difference-between-an-array-and-an-object


(3) 배열은 속성과 기능을 갖는데 이것은 객체의 특징임.


(4) 스크립트에서 객체는 배열처럼 인덱스를 갖고 있지는 않지만 연관배열이라는 인덱스와 유사한 개념을 갖고 있음. ( 실제로는 인덱스가 아니라 프로퍼티를 추가하는 것이지만. )




2. 차이점 



(1) 객체는 인덱스의 개념이 없음. 자바스크립트에서는 객체에도 a[1] = 20과 같은  방식으로 값을 할당할 수는 있으나 이것은 인덱스를 생성하는 것이 아니라 프로퍼티에 값을 할당하는 것으로 처리됨.


(2) 객체는 length 프로퍼티가 없음. 인덱스가 없으므로 지극히 당연함. String 객체에는 length가 있지만 의미가 다소 다름. 


(3) 리터럴 표기법이 다름. 객체는 = {}, 배열은 = []


(4) 배열의 prototype은 Array임. 



- 결론




배열은 추가기능을 조금 지닌 객체다.




출처: https://tjdghkwnd1.tistory.com/entry/객체와-배열의-차이 [Programmer's Way]






자바스크립트에서 배열 역시 객체

하지만 배열은 일반객체와 약간의 차이가 있다.


//1번
//colorsArray 배열
var colorsArray = ['orange','yellow','green'];
console.log(colorsArray[0]);  //(출력값)  orange
console.log(colorsArray[1]);  //(출력값)  yellow
console.log(colorsArray[2]);  //(출력값)  green

//colorsObj 객체
var colorObj = {
     '0' : 'orange',
     '1' : 'yellow',
     '2' : 'green'
};
console.log(colorsObj[0]);    //(출력값)  orange
console.log(colorsObj[1]);    //(출력값)  yellow
console.log(colorsObj[2]);    //(출력값)  green

//2번
//typeof 연산자 비교
console.log(typeof colorsArray);  //(출력값) object (not array)
console.log(typeof colorsObj);    //(출력값) object

//3번
//length 프로퍼티
console.log(colorsArray.length);  //(출력값)  3
console.log(colorsObj.length);    //(출력값)  undefined

//4번
//배열 표준 메서드
colorsArray.push('red');           //['orange','yellow','green','red']
colorsObj.push('red');             //Uncaught TypeError: Object #<Object> has no method 'push'


1번 - 배열과 객체 생성
colorSArray배열의 형태와 유사하게 객체 리터럴 방식으로 colorsObj객체를 생성

객체프로퍼티설명할 때, 대괄호 안에는 접근하려는 프로퍼티의 속성을 문자열 형태로 적어야 한다고했음
(colorObj[0]이아니라 colorObj['0']형태로 기입해야 맞는거 BUT 저렇게 안써도 제대로출력됨)

-> 이유는 자바스크립트엔진이 []연산자 내에 숫자가 사용될 경우, 해당 숫자를 자동으로 문자열 형태로 바꿔주기때문


2번 - typeof 연산자 비교
typeof 연산결과는 배열과 객체가 모두 object인걸 기억해야함
-> 즉, 자바스크립트도 배열을 객체로 생각하는 것


3번 length 프로퍼티 존재 여부
배열 colorsArray와 객체 colorObj는 근본적 차이가 있음
colorsObj는 객체이므로 length 프로퍼티가 존재 X

-> colorsArray.length는 3이 출력되지만 colorsObj.length 결과가 undefined인 이유


4번 - 배열 표준 메서드 호출 여부
배열과 객체의 또하나의 차이점은 colorObj는 배열이 아니므로 push()메서드와 같은 표준 배열 메서드를 사용X

-> 배열과 객체가 자신의 부모인 프로토타입 객체가 서로 다르기때문


객체리터럴방식으로 생성한 객체의 경우, 객체 표준 메서드를 저장하고 있는 Object.prototype 객체가 프로토타입.
배열의 경우 Array.prototype 객체가 부모객체인 프로토타입.
Array.prototype객체의 프로토타입은 Object.prototype 객체가 된다.


객체는 자신의 프로토타입이 가지는 모든 프로퍼티 및 메서드들을 상속받아 사용 O이므로 배열은 Array.prototype에 포함된 배열 표준 메서드와 Object.prototype의 표준 메서드들을 모두 사용할 수 있다. 









내용이 알찬 배열과 객체의 차이를 설명해주는 사이트

https://programmer-seva.tistory.com/18

created

인스턴스가 작성된 후 동기적으로 호출됩니다. 이 단계에서 인스턴스는 데이터 처리, 계산된 속성, 메서드, 감시/이벤트 콜백 등과 같은 옵션 처리를 완료합니다. 그러나 마운트가 시작되지 않았으므로 $el 속성을 아직 사용할 수 없습니다.

virtual dom 을 사용할 수 없다.

created에서 이제 data와 events가 활성화 되어 접근할 수 있다. 여전히 템플릿과 가상돔은 마운트 및 렌더링 되지 않은 상태이다.


mounted

el이 새로 생성된 vm.$el로 대체된 인스턴스가 마운트 된 직후 호출됩니다. 루트 인스턴스가 문서 내의 엘리먼트에 마운트 되어 있으면, mounted가 호출 될 때 vm.$el도 문서 안에 있게 됩니다.

virtual dom 을 사용할 수 있다.

컴포넌트, 템플릿, 렌더링된 돔에 접근 가능

공식 문서에는 el 사용 여부를 중점으로 설명되어있다.

이 말은 Virtual DOM 생성 여부와 관련이 있다. (Virtual DOM)


created와 mounted를 완벽히 이해하지 않아도, 사실상 크게 문제가 없을 수 있다.

하지만 규모가 커지면서, 컴포넌트간 통신이 있을 경우 문제가 발생할 수 있다.



출처: https://mygumi.tistory.com/201 [마이구미의 HelloWorld]



사용에 있어, 하나의 예로 created는 데이터 초기화에 대한 목적, mounted는 DOM 조작에 대한 목적으로 사용할 수 있다.

출처: https://mygumi.tistory.com/201?category=697395 [마이구미의 HelloWorld]


*렌더링이란?

rendering은 renderer engine(skia)이 합니다

Render는 html로 입력받아 해석해서 표준 출력 장치(모니터)로 출력 해 줍니다. (화면에 뿌려주는 역할)

위 작업을 Rendering이라고 합니다



*바인딩이란?

값이 서버상에서 들어간것 

이름을 속성에 연관(bind)시키는 과정이 바인딩이다.

특정객체에서 실행되게끔 고정시키는 그런 역할

바인딩(Binding) : 컴퓨터 프로그래밍에서 각종 값들이 확정되어 더 이상 변경할 수 없는 구속(Bind) 상태가 되는 것.

프로그램 내에서 변수, 배열, 라벨, 절차 등의 명칭, 즉, 식별자(identifier)가 그 대상인 메모리 주소, 데이터형 또는 실제 값으로 배정되는 것이 이에 해당된다.

원시 프로그램의 컴파일링 또는 링크 시에 확정되는 바인딩을 정적 바인딩(static binding)이라 하고, 프로그램이 실행되는 과정에서 바인딩 되는 것을 동적 바인딩(dynamic binding)이라고 한다.

프로그래밍에서는 바인딩을 가급적 뒤로 미루도록 권고하고 있다.


*컴포넌트란?


컴포넌트는 Vue의 가장 강력한 기능 중 하나입니다. 기본 HTML 엘리먼트를 확장하여 재사용 가능한 코드를 캡슐화하는 데 도움이 됩니다. 상위 수준에서 컴포넌트는 Vue의 컴파일러에 의해 동작이 추가된 사용자 지정 엘리먼트입니다. 경우에 따라 특별한 is 속성으로 확장 된 원시 HTML 엘리먼트로 나타날 수도 있습니다.

Vue 컴포넌트는 Vue 인스턴스이기도 합니다. 그러므로 모든 옵션 객체를 사용할 수 있습니다. (루트에만 사용하는 옵션은 제외) 그리고 같은 라이프사이클 훅을 사용할 수 있습니다.


*돔이란?


여기서 또 virtual  dom 이란 무슨 뜻이지?

Virtual DOM 기술은 DOM 조작에 있어 비효율적인 이유에서 나오게 되었다.

DOM 조작에 있어, 비효율적인 이유를 살펴보자.

기존에는 아래와 같이, Javascript 또는 Jquery를 통해 원하는 dom 노드를 찾은 후 변경하는 행위를 했다.

하지만 수천가지의 노드가 존재할 수 있기에, 계산하기 위해 큰 비용을 투자하게 된다.

그 결과, 성능 저하로 인한 페이지 속도 지연이 발생한다.

위와 같은 처리에 대한 비용이 큰 자세한 이유는 링크를 참고하길 바란다. http://d2.naver.com/helloworld/59361

간단히 설명하자면, 아래의 그림과 같은 동작이 DOM 조작을 할 때마다 영향을 끼치게 되는 것이다.



이러한 배경 속에서 Virtual DOM 이 탄생하게 되었다.

이러한 Virtual DOM에 대해 코드를 통해 표현할 수 있다.



직접 DOM API를 사용하지 않고, domNode 객체를 활용하게 된다.

이러한 처리는 실제 DOM이 아닌 메모리에 있기 때문에 훨씬 더 빠르다.


즉, 실제 DOM이 아닌 Virtual DOM에 먼저 변경 작업을 해준다.

그리고 변경된 부분만 찾아 실제 DOM에 변경해주는 방식이다.

이로써, 기존 View 방식보다 많은 양의 연산을 줄일 수 있게 된다.


Virtual DOM의 여부에 따른 차이를 보여주는 애니메이션 영상이다. 

참고하면 도움이 될 것이다.

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



출처: https://mygumi.tistory.com/190 [마이구미의 HelloWorld]


*템플릿이란?

Vue.js는 렌더링 된 DOM을 기본 Vue 인스턴스의 데이터에 선언적으로 바인딩 할 수있는 HTML 기반 템플릿 구문을 사용합니다. 모든 Vue.js 템플릿은 스펙을 호환하는 브라우저 및 HTML 파서로 구문 분석 할 수있는 유효한 HTML입니다.

내부적으로 Vue는 템플릿을 가상 DOM 렌더링 함수로 컴파일 합니다. 반응형 시스템과 결합된 Vue는 앱 상태가 변경 될 때 최소한으로 DOM을 조작하고 다시 적용할 수 있는 최소한의 컴포넌트를 지능적으로 파악할 수 있습니다.

가상 DOM 개념에 익숙하고 JavaScript의 기본 기능을 선호하는 경우 템플릿 대신 렌더링 함수를 직접 작성할 수 있으며 선택사항으로 JSX를 지원합니다.


*훅(hook)이란?

훅킹(Hooking)이란 이미 작성되어 있는 코드의 특정 지점을 가로채서 동작 방식에 변화를 주는 일체의 기술

 훅이란 낚시바늘같은 갈고리 모양을 가지는데 여기서는 코드의 중간 부분을 낚아채는 도구라는 뜻으로 사용된다. 대상 코드의 소스를 수정하지 않고 원하는 동작을 하도록 해야 하므로 기술적으로 어렵기도 하고 운영체제의 통상적인 실행 흐름을 조작해야 하므로 때로는 위험하기도 하다.


Vue.js의 라이프 사이클은 크게 Creation, Mounting, Updating, Destruction 으로 나눌 수 있다.


1. Creation : 컴포넌트 초기화 단계

Creation 단계에서 실행되는 훅(hook)들이 라이프사이클 중에서 가장 처음 실행된다. 이 단계는 컴포넌트가 돔에 추가되기 전이다. 서버 렌더링에서도 지원되는 훅이다.

따라서 클라이언트 단과 서버단 렌더링 모두에서 처리해야할일이 있다면 이단계에서 하면된다. 아직 컴포넌트가 돔에 추가되기 전이기 때문에 돔에 접근하거나 this.$el를 사용할 수 없다.

이 단계에서는 beforeCreate 훅과 Created 훅이 있다.

beforeCreate

모든 훅 중에 가장 먼저 실행되는 훅이다. 아직 data와 events(vm.$on, vm.$once, vm.$off, vm.$emit)가 세팅되지 않은 시점이므로 접근하려고 하면 에러를 뿜어낼 것이다.

<script>
export default {
data () {
return {
title: ''
}
},
beforeCreate () {
//can't use Data(this.title ...), events(vm.$on, vm.$once, vm.$off, vm.$emit)
}
}




</script>

created

created 훅에서는 이제 data와 events가 활성화되어 접근할 수 있다. 여전히 템플릿과 가상돔은 마운트 및 렌더링되지 않은 상태이다.


<script>
export default {
data () {
return {
title: ''
}
},
computed: {
titleComputed() {
console.log('I change when this.property changes.')
return this.property
}
},
created () {
//can use Data(this.title, this.titleComputed ...), events(vm.$on, vm.$once, vm.$off, vm.$emit)
//don't use $el
}
}
</script>

2. Mounting : 돔(DOM) 삽입 단계

Mounting 단계는 초기 렌더링 직전에 컴포넌트에 직접 접근할 수 있다. 서버렌더링에서는 지원하지 않는다.

초기 랜더링 직전에 돔을 변경하고자 한다면 이 단계를 활용할 수 있다. 그러나 컴포넌트 초기에 세팅되어야할 데이터 페치는 created 단계를 사용하는것이 낫다.

beforeMount

beforeMount 훅은 템플릿과 렌더 함수들이 컴파일된 후에 첫 렌더링이 일어나기 직전에 실행된다. 대부분의 경우에 사용하지 않는 것이 좋다. 그리고 서버사이드 렌더링시에는 호출되지 않는다.

<script>
export default {
beforeMount() {
console.log(`this.$el doesn't exist yet, but it will soon!`)
}
}
</script>



mounted

mounted 훅에서는 컴포넌트, 템플릿, 렌더링된 돔에 접근할 수 있다. 모든 하위 컴포넌트가 마운트된 상태를 보장하지는 않는다. 서버렌더링에서는 호출되지 않는다.

<script>
export default {
mounted() {
console.log(this.$el.textContent) // can use $el
this.$nextTick(function () {
// 모든 화면이 렌더링된 후 실행합니다.
})
}
}
</script>


mounted 훅에서 유의할 점은, 부모와 자식 관계의 컴포넌트에서 우리가 생각한 순서로 mounted가 발생하지 않는다는 점이다. 즉 부모의 mounted훅이 자식의 mounted훅보다 먼저 실행되지 않는다. 오히려 그 반대이다.


// Parent export default { created() { console.log("Parent created") }, mounted() { console.log("Parent mounted") } } // Child export default { created() { console.log("Child created") }, mounted() { console.log("Child mounted") } }


=> Parent created

=> Child created

=> Child mounted

=> Parent mounted


출처: https://mygumi.tistory.com/201 [마이구미의 HelloWorld]


위 그림처럼 Created훅은 부모->자식의 순서로 실행되지만 mounted는 그렇지 않다는 것을 알 수 있다. 다른 식으로 말하면 부모는 mounted훅을 실행하기 전에 자식의 mounted훅이 끝나기를 기다린다. (참고 Vue Parent and Child lifecycle hooks)



3. Updating : Diff 및 재 렌더링 단계

컴포넌트에서 사용되는 반응형 속성들이 변경되거나 어떤 이유로 재 렌더링이 발생되면 실행된다. 디버깅이나 프로파일링 등을 위해 컴포넌트 재 렌더링 시점을 알고 싶을때 사용하면 된다. 조심스럽지만, 꽤 유용하게 활용될 수 있는 단계이다. 서버렌더링에서는 호출되지 않는다.

beforeUpdate

이 훅은 컴포넌트의 데이터가 변하여 업데이트 사이클이 시작될때 실행된다. 정확히는 돔이 재 렌더링되고 패치되기 직전에 실행된다. 재 렌더링 전의 새 상태의 데이터를 얻을 수 있고 더 많은 변경이 가능하다. 이 변경으로 이한 재 렌더링은 트리거되지 않는다.

updated

이 훅은 컴포넌트의 데이터가 변하여 재 렌더링이 일어나 후에 실행된다. 돔이 업데이트 완료된 상태이므로 돔 종속적인 연산을 할 수 있다. 그러나 여기서 상태를 변경하면 무한루프에 빠질 수 있다. 모든 자식 컴포넌트의 재 렌더링 상태를 보장하지는 않는다.


<script>
export default {
updated() {
this.$nextTick(function () {
// 모든 화면이 렌더링된 후 실행합니다.
})
}
}
</script>


4. Destruction : 해체 단계

beforeDestroy

이 훅은 해체(뷰 인스턴스 제거)되기 직전에 호출된다. 컴포넌트는 원래 모습과 모든 기능들을 그대로 가지고 있다. 이벤트 리스너를 제거하거나 reactive subscription을 제거하고자 한다면 이 훅이 제격이다. 서버 렌더링시 호출되지 않는다.

destroyed

이 훅은 해체(뷰 인스턴스 제거)된 후에 호출된다. Vue 인스턴스의 모든 디렉티브가 바인딩 해제 되고 모든 이벤트 리스너가 제거되며 모든 하위 Vue 인스턴스도 삭제된다. 서버 렌더링시 호출되지 않는다.

컴포넌트가 무엇인가요?

컴포넌트는 Vue의 가장 강력한 기능 중 하나입니다. 기본 HTML 엘리먼트를 확장하여 재사용 가능한 코드를 캡슐화하는 데 도움이 됩니다. 상위 수준에서 컴포넌트는 Vue의 컴파일러에 의해 동작이 추가된 사용자 지정 엘리먼트입니다. 경우에 따라 특별한 is 속성으로 확장 된 원시 HTML 엘리먼트로 나타날 수도 있습니다.

Vue 컴포넌트는 Vue 인스턴스이기도 합니다. 그러므로 모든 옵션 객체를 사용할 수 있습니다. (루트에만 사용하는 옵션은 제외) 그리고 같은 라이프사이클 훅을 사용할 수 있습니다.

컴포넌트 사용하기

전역 등록

이전 섹션에서 다음을 사용하여 새 Vue 인스턴스를 만들 수 있음을 알게 되었습니다.

new Vue({
el: '#some-element',
// 옵션
})

전역 컴포넌트를 등록하려면, Vue.component(tagName, options)를 사용합니다.

Vue.component('my-component', {
// 옵션
})

Vue는 사용자 지정 태그 이름에 대해 W3C 규칙을 적용하지 않습니다 (모두 소문자이어야 하고 하이픈을 포함해야합니다). 그러나 이 규칙을 따르는 것이 좋습니다.

일단 등록되면, 컴포넌트는 인스턴스의 템플릿에서 커스텀 엘리먼트,<my-component></my-component>로 사용할 수 있습니다. 루트 Vue 인스턴스를 인스턴스화하기 전에 컴포넌트가 등록되어 있는지 확인하십시오. 전체 예제는 다음과 같습니다.

<div id="example">
<my-component></my-component>
</div>
// 등록
Vue.component('my-component', {
template: '<div>사용자 정의 컴포넌트 입니다!</div>'
})

// 루트 인스턴스 생성
new Vue({
el: '#example'
})

아래와 같이 렌더링 됩니다.

<div id="example">
<div>사용자 정의 컴포넌트 입니다!</div>
</div>
사용자 정의 컴포넌트 입니다!



<script th:inline="javascript">
1.         new Vue({
            el: '#myTagCategory',
            data: {
                parameters: {
                    page: 1,
                    //pageSize: 50
                },
                list: {
                    items: []
                },
                totalCount: '',
                loadedCount: true,
            },
1번은 뷰 인스턴스 생성후 element 요소 #myTagCategory로 위에 html의 id와 일치를 시켜준다.
그 이후 data값을 넣어야하는데 parameters를 통해서 페이지수와 pageSize를 할당해주고
list를 통해서 items배열을 만들어 DB에서 받아온 값을 바인딩 시켜주기위한 작업을 시작한다.
전체 데이터 건수 측정을 위해 totalCount를 초기화해준다.
2.            mounted: function () {
                this.initializeSearch();
            },
2번은 Mounting 단계는 초기 렌더링 직전에 컴포넌트에 직접 접근 할 수 있다. 서버 렌더링에서는 지원하지 않는다.
초기 렌더링 직전에 돔을 변경하고자 한다면 이 단계를 활용할 수 있다. 그러나 컴포넌트 초기에 세팅되어야 할 데이터 페치는 
created단계를 사용하는 것이 낫다.
생성,생성+활성화 에 대한 연결 유지 서버 측 렌더링 하는 동안 해당 데이터를 ,구성요소를 대신합니다.
mounted훅에서는 컴포넌트,템플리스렌더링된 돔에 접근할 수 있다. 모든 하위 컴포넌트가 마운트된 상태를 보장하지 않는다.
서버렌더링에서는 호출되지 않는다.
mounted훅에서 유의할 점은 , 부모와 자식 관계의 컴포넌트에서 우리가 생각한 순서대로 mounted가 발생하지 않는다.
즉, 부모의mounted훅이 자식의 mounted훅보다 먼저 실행되지 않는다. 오히려 자식먼저 그다음 부모 순서이다.
3.            methods: {
      3-1          initializeSearch: function () {
                    const self = this;
                    let param = {};
                    Object.assign(param, this.parameters);
                    (this.doSearch = function (page, requestCount = true) {
                        param.page = page;
                        if (requestCount) {
                            //self.parameters.page = 1; 얘가 왠지 다시 1로 만들어 버리는 주범인듯 하다. 아니었다.
                            self.count(param);
                        }
                        self.load(param);
                    })(1);
                },
      3-2.          doSearch: function (page) {
                },
     3-3.           count: function (params) {
                    const self = this;
                    self.loadedCount = false;
   3-4.              if (!params) {
                        Object.assign(params, self.parameters);
                    }
                     axios.get("/api/service/myTagCategory/totalCount", {
                        params: params
                    }).then(function (response) {
                        const data = response.data;
                        if (!isNaN(parseInt(data))) {
                            self.totalCount = parseInt(data);
                            self.totalPage = Math.ceil(self.totalCount / params.pageSize);
                            self.loadedCount = true//이거 해야지 밑에 숫자 창이 생긴다.
                        }
                    }).catch(function (error) {
                        console.log(error);
                    });
                },
3번은 method를 사용한다. 처음에 3-1에서 initializeSearch 함수를 이용해서 현재 페이지값을 파라미터로 받아온다.
3-2번은 doSearch를 활용해 페이지 함수를 찾아 받아온다.
3-3번은 count함수를 사용해서 파라미터 값으로 로드된 수를 센다.-->? 근데 왜 false?
3-4번은 만약 파라미터 값이 없다면 자기자식 파라미터를 다시 할당하고
**axios로 데이터 값을 HTTP통신을 활용하여 url값을 get으로 매핑해서 데이터를 받아온다.
axios.get('URL주소') : 해당 URL을 get방식으로 요청
.then() : 반환값 로직 작성
.catch() : 오류 발생시 로직 작성
axios.get(url) 여기서 url은 controller에서 url매핑했을떄 데이터베이스가 들어있을 url으로 가서 매핑 즉, totalCount필요해서 마지막에 totalCount라고 써줌
.then여기서 response로 반환값 받아오고 
const(상수) 고정 데이터를 response.data로 할당
만약 isNaN(parseInt(data)) 매개변수가 숫자인지 검사하는 함수(Not a Number) 가 아니면
self.해서 전체 건수(totalCount)넣어주고 totalPage,loadedCount(이거 해야되나)? 물어보기
.catch로 에러 생길거 받아올거 console.log(error)로 찍어주기
 
  4.              load: function (params) {
                    const self = this;
     4-1.           if (!params) {
                        Object.assign(params, self.parameters);
                    }
                axios.get("/api/service/myTagCategory/lists", {
                        params: params
                    }).then(function (response) {
                        self.list.items = response.data;
                    }).catch(function (error) {
                        console.log(error);
                    });
                },
4번은 load 함수를 이용해서 파라미터 값은 싣는다.
4-1번은 만약 파라미터가 없다면 자신의 파라미터를 할당한다.
axios.get('URL주소') : 해당 URL을 get방식으로 요청
.then() : 반환값 로직 작성
.catch() : 오류 발생시 로직 작성
5.                onPageChange: function (page) {
                    this.parameters.page = page;
                    this.doSearch(page, false);
                },
            },
6.            components: {
                datepicker: common.datepicker.component(),
                pager: common.pager.component()
            }
        });
    </script>
Vue.js를 사용한다면, 라이프사이클 훅을 알고 있다고 생각한다. (라이프사이클 다이어그램)
그 중에서 created, mounted을 대부분 사용한다.
Vue 인스턴스 생성에 있어, 가장 먼저 호출되는 함수들로써, 스크립트로 보자면, window.onload 와 비슷한 느낌이 될 것이다.
created
인스턴스가 작성된 후 동기적으로 호출됩니다. 이 단계에서 인스턴스는 데이터 처리, 계산된 속성, 메서드, 감시/이벤트 콜백 등과 같은 옵션 처리를 완료합니다. 그러나 마운트가 시작되지 않았으므로 $el 속성을 아직 사용할 수 없습니다.
mounted
el이 새로 생성된 vm.$el로 대체된 인스턴스가 마운트 된 직후 호출됩니다. 루트 인스턴스가 문서 내의 엘리먼트에 마운트 되어 있으면, mounted가 호출 될 때 vm.$el도 문서 안에 있게 됩니다.
created와 mounted를 완벽히 이해하지 않아도, 사실상 크게 문제가 없을 수 있다.
하지만 규모가 커지면서, 컴포넌트간 통신이 있을 경우 문제가 발생할 수 있다.
부모에서 created 훅 안에서 값을 변경하는 것이 아닌 mounted에서 변경하는 것이다.
그렇다면, 처음에 초기화된 number값이 자식에 전달되고, 그 값을 통해 자식은 가지고 있다.
그리고 부모에서 mounted 훅이 일어나 값을 변경하기 때문에, 자식은 값이 변했다는 것을 인지하고 watch를 발생한다.
많은 경우 중 하나의 예로 들었지만, created와 mounted는 확실히 인지해야한다.
사용에 있어, 하나의 예로 created는 데이터 초기화에 대한 목적, mounted는 DOM 조작에 대한 목적으로 사용할 수 있다.
만약 이와 같이 예기치 못한 경우가 발생한다면, 라이프 사이클 훅에 의해 발생할 수 있으니, 확실히 이해해야한다.
출처: https://mygumi.tistory.com/201 [마이구미의 HelloWorld]


1. axios란?

- 동적으로 데이터를 가져오기 위한 라이브러리
- axios와 vue-resource가 있다. axios가 업데이트가 빠르고 커뮤니티가 활성화 되어 있어 많은 사람들이 추천한다.


엑시오스란?

Promise 기반의 API 형식 .


Promis란 비동기 로직 처리에 유용한 자바스크립트 객체이다


 API유형

처리결과 

 axios.get('URL주소').then().catch()

해당 URL로 get방식으로 요청.

then()안에 반환값 로직 작성.

catch()안에는 오류발생시 로직 작성. 

 axios.post('URL주소').then().catch()

 해당 URL로 POST방식으로 요청.

then()안에 반환값 로직 작성.

catch()안에는 오류발생시 로직 작성. 

 axios({옵션})

 HTTP요청에 대한 자세한 속성들을 직접 정의하여 보낼 수 있음

<<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <!--vue  -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js" ></script>
    <!--엑시오스 CDN -->
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <title>Http 통신, 뷰 리소스</title>
  </head>
  <body>
    <div id="app1">
        <button v-on:click="getData"> 호출 </button>
    </div>
 
    <script>
      new Vue({
        el: '#app1',
        methods:{
                  getData: function(){
                    axios.get('https://raw.githubusercontent.com/joshua1988/doit-vuejs/master/data/demo.json')
                    .then(function(response){
                        alert(response);
                        console.log(response); // 객체 형태로 반환. 파싱작업 불필요
                    });
                  }
                }
      });
    </script>
 
  </body>
</html>


https://cchoimin.tistory.com/93


axios를 사용하세요

axios는 현재 가장 성공적인 HTTP 클라이언트 라이브러리 중 하나입니다. 아직 1.x 버전이 릴리즈 되지 않았지만 스타가 1만개가 넘을 정도로 인기가 좋습니다. 특별히 언급할만한 부분은 요청 취소와 TypeScript를 사용할 수 있는 것 입니다. 이 글에서는 기본적인 vue와 axios의 사용 방법을 알아봅니다. axios의 github 프로젝트를 살펴보시면 더 많은 내용을 익힐 수 있을 것입니다.


axios 설치

vue-cli를 사용하고 계신다면 간단하게 추가할 수있습니다. vue-cli에 대한 간략한 설명은 vue.js 한국어 사용자 모임의 한국어 번역을 확인하세요.

터미널에서 npm 명령어를 이용하여 설치합니다.

npm install --save axios

이제 main.js 파일을 열어 axios를 추가하고 vue 앱의 전역으로 사용할 수 있도록 메소드를 추가하면 됩니다.


http://vuejs.kr/update/2017/01/04/http-request-with-axios/

+ Recent posts