Map 타입

in javascript, es6

1. Map 생성하기

1
2
3
4
5
6
7
let map = new Map();
let map = new Map([
["key1", "value1"],
["key2", "value2"],
["key3", "value3"],
["key4", "value4"],
])

new Map([{id: 1},{id: 2},{id: 3},{id: 4}])이런식으로 작성하려고 하니까 안됨. Map생성시 파라미터는 이차원배열로 넣어야 할듯

2. Map에 값 추가하기

1
2
let map = new Map();
map.set('key', 'value')

값을 추가하는 부분에서 Map와 Object의 차이점이 나타남. Map의 경우에는 Key로 문자열이외에도 모든걸 Key로 가능

3. Map의 값 호출하기

1
2
3
4
let key = {name: 'name'}
let map = new Map();
map.set(key, 'value')
map.get(key)

4. Map의 사이즈 확인

1
2
3
4
5
let key = {name: 'name'}
let map = new Map();
map.set(key, 'value')

console.log(map.size)

5. 배열로 만들기

1
2
3
4
5
6
let map = new Map();
map.set('key1', 'value1')
map.set('key2', 'value2')

let array = [...map]
console.log(map) // map: [['key1', 'value1'], ['key2', 'value2']]

Object와는 다르게 Map은 [...map]을 통해서 Array로 만들수 있습니다. 결과값은 [[key, value], [key, value]]의 형태로 만들어 진다.

6. 순회하기

1
2
3
4
5
6
7
8
9
let map = Map()

for (let [key, value] of map) {

}

map.forEach((key, value) => {

})

Object와는 다르게 forof와 forEach를 사용할수 있다.
Array에서 제공하는 map, filter등에 대한 메서드는 제공하지 않는 것으로 판단된다.

7. Iterator 사용하기

1
2
3
4
5
let map = new Map()

map.keys() // key모음
map.values() // value모음
map.entries() // key와 value 한쌍의 모음

Iterator이다 보니 for문과 함께 사용하면 좋을 듯

기타 메서드

has : 해당 Key 존재 여부

1
2
3
4
let map = new Map()
map.set('key', 'value')

console.log(map.has('key')) // true

delete : 해당 Key의 값 삭제

1
2
3
4
5
let map = new Map()
map.set('key', 'value')
console.log(map.delete('key')) // true => 존재했으면 true 없었으면 false

console.log(map.has('key')) // false

clear : 모든 데이터 삭제

1
2
let map = new Map()
map.clear()

Comment and share

JSON파일 출력(파일 작성)

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public void writeJSON() {
String jsonString = "json파일에 저장할 내용",
path = "C:/json/",
fileName = "jsonTest.json";

FileWriter fileWriter = null;

File dirFile = new File(path),
fullFile = new File(path + fileName);

if (!dirFile.exists()) {
dirFile.mkdirs();
}

try {
fileWriter = new FileWriter(fullFile);
fileWriter.write(jsonString);
fileWriter.flush();
} catch(Exception e) {

} finally {
fileWriter.close();
}
}

설명

json파일을 작성하는 것은 기타 다른 파일을 작성하는 것과 별반 차이가 없다. 예제에서는 일반 string문자열을 저장하고 있지만 실제 JSON 데이터를 저장할 때도 JSONData를 JSONString으로 변환후에 저장하면 된다.

JSON파일 호출

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import com.google.gson.Gson;

public void readJSON() {
String path = "C:/json/",
fileName = "jsonTest.json";

JsonParser jsonParser = new JsonParser();

FileReader fileReader = null;

File file = new File(path + fileName);

if (file.isFile()) {
throw new Exception("존재하지 않는 파일입니다.");
}

try {
fileReader = new FileReader(file); // 1. FileReader 인스턴스를 생성합니다.

Object resultObj = gson.fromJson(fileReader, Object.class); // gson의 fromJson메서드의 첫번째 파라미터로는 Reader를 두번째 파라미터로는 Json 데이터 타입을 넘겨주면 된다.

// Map map = (Map) gson.fromJson(fileReader, Object.class); // 타입을 Object로 하고 casting 가능
// Map map = gson.fromJson(fileReader, Map.class); // 타입을 바로 Map으로 해서 casting 없이 사용 가능
} catch(Exception e) {

} finally {
fileReader.close();
}
}

설명

해당 소스코드는 구글에서 제공하는 Gson을 이용해서 parse를 한다. Gson의 fromJson은 첫번째 파라미터로 Reader와 두번째 파라미터로 데이터 타입을 받는다. 두번째 파라미터로 Object.class를 넘겨주니 모든 데이터 타입(원시 타입 포함)의 값을 오류없이 가져올수 있었다.

gson.fromJson(Reader, Type) : JSON 파일로 부터 데이터 가져오기
gson.fromJson(String, type) : JSONString 으로부터 각 데이터 타입으로 변환

Comment and share

1. json 출력

1
2
3
4
5
6
7
8
9
10
11
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", "아이언맨");
map.put("name", "어벤저스");

Gson gson = new Gson();

String path = "C:\\test\\test1.json";

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path), "UTF-8"));
writer.write(gson.toJson(map, Map.class));
writer.close();

2. json 입력

1
2
3
4
5
6
7
8
9
Gson gson = new Gson();

String path = "C:\\test\\test1.json";

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"));

Map<String, Object> map = gson.fromJson(reader, Map.class);

System.out.println(map);

json의 입력은 Gson을 사용하면 간편하게 처리할수 있다

Comment and share

1. 텍스트 파일 출력

1
2
3
4
5
6
7
8
9
10
String path = "./test.txt",
text = "안녕하세요\n"
+ "어서오세요\n"
+ "인사합니다";

BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(path), "UTF-8"));

writer.write(text);
writer.close();

2. 텍스트 파일 입력

1
2
3
4
5
6
7
8
9
10
11
String path = "./test.txt",
str = "";

StringBuilder sb = new StringBuilder();

BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream(path), "UTF-8"));

while((str = reader.readLine()) != null) {
sb.append(str);
}

FileReader/FileWriter는 인코딩 설정이 불가능 하므로 FileInputStream/FileOuputStream을 쓰자
많은 양의 데이터를 입출력 할시에 Buffer를 쓰는것과 안 쓰는것의 차이가 크다 => 버퍼를 쓰자
InputStream/OutputStream은 단위가 바이트단위라서 한글이 깨지므로 InputStreamReader/OutputStreamReader를 쓰자

Comment and share

1. 리스트의 메서드

.retainAll(Collection)

List와 Collection에서 중복되는 값만 남기고 모두 삭제한다. 결과는 바로 List에 적용 된다

1
2
3
4
5
6
7
8
9
10
11
12
List list1 = new ArrayList();
List list2 = new ArrayList();

list1.add("아이언맨");
list1.add("헐크");

list2.add("아이언맨");
list2.add("윈터솔져");

list1.retainAll(list2);

System.out.println(list1); // [아이언맨]

.removeAll()

List와 Collection에서 중복되는 내용을 모두 삭제한다. 결과는 바로 List에 적용 된다

1
2
3
4
5
6
7
8
9
10
11
12
List list1 = new ArrayList();
List list2 = new ArrayList();

list1.add("아이언맨");
list1.add("헐크");

list2.add("아이언맨");
list2.add("윈터솔져");

list1.removeAll(list2);

System.out.println(list1); // [헐크]

2. List와 Array 변환

List => Array로 변환

1
2
3
List<String> list = new ArrayList<String>();

String[] array = list.toArray();

Array => List로 변환

이건 배열 자체적인 기능은 제공하지 않아서 배열 util인 Arrays의 asList메서드를 활용한다

1
2
3
String[] array = new String[3];

List<String> list = Arrays.asList(array);

Comment and share

foreach 확장

1. foreach에서 배열사용하기

기존에는 foreach에서는 List만 사용이 가능하다고 알고 있었는데 배열도 사용가능하다.

List 사용방법

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- JAVA -->
List list = new ArrayList();
list.add("value1");
list.add("value2");

Map map = new Map();
map.put("list", list);


<!-- MYBATIS -->
<foreach collection="list" item="item">
#{item}
</foreach>

배열 사용방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- JAVA -->
String[] array = {
"value1",
"value2"
};

Map map = new Map();
map.put("array", array);


<!-- MYBATIS -->
<foreach collection="array" item="item">
#{item}
</foreach>

배열이나 리스트나 사용방법은 동일 하다

2. foreach에서 Map 사용하기

foreach에서 Map을 지원하는건 아니다. Map의 메서드들 중 하나인 entrySet을 이용하여 작성한다

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- JAVA -->
Map paramMap = new Map();
paramMap.put("id", "value");
paramMap.put("name", "value");

Map map = new Map();
map.put("paramMap", paramMap);


<!-- MYBATIS -->
<foreach collection="paramMap.entrySet()" index="key" item="value">
#{value}
</foreach>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- WHERE 절에서 사용 -->
Map paramMap = new Map();
paramMap.put("id", "value");
paramMap.put("name", "value");

SELECT *
FROM TABLE
WHERE
<!-- WHERE 절에 사용 -->
<foreach collection="paramMap.entrySet()" index="key" item="value">
${key} = #{value}
</foreach>

<!-- UPDATE문에서 활용 -->
Map paramMap = new Map();
paramMap.put("id", "value");
paramMap.put("name", "value");

UPDATE TABLE
SET
<foreach collection="paramMap.entrySet()" index="key" item="value">
${key} = #{value}
</foreach>

Map을 활용해서 where 조건을 걸때나 update시에 값 변경할때 동적으로 사용가능하다

Comment and share

Vue.component를 사용하는 전역 컴포넌트로는 구조 파악이나 스타일 적용등에 있어서 어려움이 많아서 복잡한 뷰 프로젝트에서 사용하기가 힘듭니다. 그래서 .vue 파일로 프로젝트를 구성하는 방식인 싱글파일컴포넌트를 사용합니다. 1개의 .vue파일은 1개의 컴포넌트가 됩니다.

구조

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<template>

</template>

<script>
export defualt {
data() {
return {

}
},

methods: {

},

created() {

}
}
<script>

<style>

</style>

template 영역은 HTML 요소가 들어가는 부분입니다. script 영역은 컴포넌트에 대한 속성이 들어가는 부분입니다. style은 HTML 요소에 대한 스타일을 적용 할수 있습니다.

Comment and share

CLI는 .vue파일을 웹브라우저가 인식할수 있는 형태의 파일로 변환해주는 웹팩이나 브라우저리파이 같은 도구들이 적용된 초기 프로젝트 구조를 쉽게 구성하게 해주는 역할을 합니다.

설치 방법

1
npm install vue-cli -global

사용방법

  1. 고급 웹팩 기능을 활용한 구성입니다.
1
vue init webpack
  1. 웹팩의 최소 기능만을 구성합니다.
1
vue init webpack-simple
  1. 고급 브라우저리파이 기능을 활용합니다.
1
vue init browserify
  1. 브라우저리아피의 최소기능만을 구성합니다.
1
vue init browserify-simple
  1. 최소 뷰 기능만이 들어간 HTML 파일 1개를 생성합니다.
1
vue init simple
  1. 웹팩 기반의 프로그래시브 웹앱기능을 지원합니다.
1
vue init pwa

기타

고급기능들은 테스팅, 문법 검사등도 지원합니다.
CLI를 통해 설치 후에 npm install을 통해 뷰 애플리케이션 구동을 위한 라이브러리를 다운 받아야 합니다.
웹팩은 자체 서버(노드 서버)를 제공해 주기 때문에 npm run dev를 통해서 실행 가능합니다.

Comment and share

1. v-if

v-if는 조건부로 렌더링을 할때 사용을 합니다. 조건부가 참이면 렌더링을 거짓이면 렌더링을 하지 않습니다. 조건을 만족하지 않으면 렌더링 자체를 하지 않기때문에 돔에 추가 되지 않습니다.

1
<div v-if="type === 'A'">v-if를 사용해보겠습니다.</div>

v-else도 사용 가능합니다.

1
2
<div v-if="type === 'A'">참이면 실행하세요.</div>    
<div v-else>거짓이면 실행하세요.</div>

v-else-if도 사용가능합니다.

1
2
<div v-if="type === 'A'">type이 A이면 실행하세요.</div>   
<div v-else-if="type === 'B'">type이 B이면 실행하세요.</div>

조건에 따라서 화면에 보이거나 숨겨야 하는 경우 v-if를 사용하면 좋습니다. 하지만 토글기능을 사용해야 할 경우에는 렌더링을 다시 해주어야 하기 때문에 v-if 보다는 v-show가 좋을수있습니다. template 태그에서도 사용가능합니다.(template 태그 그 자체는 사용해도 화면에 렌더링 되지 않고 내부 자식 태그들만 렌더링 해줍니다.)

2. v-show

v-show는 v-if랑 비슷한 역할을 합니다. v-if랑 다른 건 렌더링은 모두 하지만 숨기고 보이는 건 css의 display none 속성을 사용합니다. v-if와 마찬가지로 조건을 만족하면 화면에 보이고 만족하지 않으면 보이지 않습니다.

1
<div v-show="true">v-if를 사용해보겠습니다.</div>

잦은 보이거나 숨기는 기능을 사용하게 된다면 v-show를 사용하면 좋습니다(렌더링을 다시 하는 것보단 css로 none또는 block하는게 더 효율적). v-show는 초기 렌더링 비용이 높기 때문에 유의 해야 합니다.

3. v-for

v-for는 지정한 뷰 데이터의 개수만큼 해당 HTML 태그를 반복해서 출력 합니다. 대상은 Array뿐아니라 Object도 가능합니다.

1
2
3
<ul>
<li v-for="item in list">{{item}}</li>
</ul>

for문에 대한 index도 사용 가능합니다.

1
2
3
<ul>
<li v-for="(item, index) in list">{{index + ' : ' + item}}</li>
</ul>

정리

  1. 하나의 태그에 두개 이상의 다중 for문은 작성이 불가능합니다.
  2. v-if랑 함께 사용은 가능 하나 공식가이드에서는 권고하지 않습니다.
  3. for문을 사용할때는 :key 속성을 부여하는게 좋습니다(값은 유일값으로).
  4. 컴포넌트에도 v-for를 사용 가능합니다.
  5. 2.2 버전 이상부터는 :key 속성을 사용하여야 합니다(유일 값).
  6. template 태그에서도 사용 가능합니다.
  7. 리스트뿐 아니라 객체도 사용가능 => Collection에서 사용가능

4. v-bind

v-bind는 HTML 속성 값에 데이터를 바인딩하거나 하위 컴포넌트의 props 속성에 값을 바인딩 할때 사용합니다. 사용방법은 v-bind:속성명="데이터" 또는 축약으로 :속성명="데이터"으로도 사용가능합니다.

1
2
<div v-bind:id="type"></div>    <!-- 데이터 type의 값이 바인딩 됩니다. -->
<div v-bind:id="'type'"></div> <!-- type이라는 문자열으로 설정합니다. -->

class 속성에 객체를 전달할 수도 있습니다. 객체를 활용하면 여러개의 class를 쉽게 바인딩 할수 있습니다. 객체의 값이 true면 해당 객체의 key명이 class로 지정됩니다.

1
2
<div v-bind:class="{active: true}"></div>
<div v-bind:class="{active: true, on: true}"></div>

5. v-model

v-model은 form에서 주로 사용되는 속성입니다. 폼에 입력한 값을 뷰의 데이터와 바인딩하는 역할을 합니다. 다른 디렉티브와는 다르게 양방향으로 바인딩 되기 때문에 input에 값을 입력하면 뷰의 데이터도 변경이
됩니다. v-model에서 사용하는 태그는 input, select, textarea 등이 있습니다.

1
<input type="text" v-model="value">

여러 체크박스를 하나의 배열로 바인딩 할수 있습니다. 체크를 하게 되면 배열에 하나씩 추가 됩니다.

1
2
3
<input type="checkbox" value="김씨" v-model="checkboxNames">
<input type="checkbox" value="이씨" v-model="checkboxNames">
<input type="checkbox" value="박씨" v-model="checkboxNames">

.number 수식어를 사용하면 자동으로 숫자로 형변환은 해줍니다.

1
<input type="text" v-model.number="num">

.trim 수식어를 사용하면 자동으로 trim을 해줍니다.

1
<input type="text" v-model.trim="value">

6. v-on

v-on은 이벤트를 감지하는 기능입니다. 사용하는 방법은 v-on:이벤트명="실행부"이고 축약은 @이벤트명="실행부" 입니다. 이벤트가 발생해서 메서드를 호출하면 파라미터로 아무것도 넘기지 않았다면 event가 넘어옵니다.

1
<button v-on:click="onClick">클릭</button>  <!-- onClick은 메서드로써 괄호()는 넣지 않아도 됨 -->

이벤트를 실행시킬때 파라미터를 넘겨줄수 있습니다.

1
<button v-on:click="onClick('type')"></button>   <!-- 해당 버튼을 눌렀을 때 onClick 메서드를 호출하면서 type이라는 문자열을 파라미터로 전달 -->

사용자 파라미터를 넘겨주면서 이벤트 객체도 넘겨 줄때는 $event를 사용합니다.

1
<button v-on:click="onClick('type', $event)"></button>

.stop 수식어를 통해서 버블링을 막을수 있습니다.

1
<button v-on:click.stop="onClick">버튼</button>

.prevent 수식어를 통해서 event.preventDefault() 역할을 대신 할수있습니다.

1
<form v-on:submit.prevent="onSubmit"></form>

.once 수식어는 최대 한번만 실행 가능하도록 설정합니다.

1
<form v-on:submit.once="onSubmit"></form>

키에 대한 수식어를 사용 가능합니다. 종류에는 .enter, .tab, .delete(Delete와 Backspace 모두), .esc, .up, .down, .left, .right가 존재하며 config.keyCodes를 통해서 사용자 정의 키 수식어를 만들수도 있습니다.

1
<input type="text" v-on:keyup.enter="onSubmit">

수식어는 체이닝이 됩니다.
이벤트는 기본이벤트 뿐 아니라 사용자 정의 이벤트도 사용가능합니다.

Comment and share

1. 인스턴스 생성시에 옵션

1) template

해당 하는 타겟에 HTML 요소를 삽입해줍니다.

사용방법

루트 태그는 오직 하나만 존재하여야 합니다. 하위 태그는 상관 없습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<div id="app"></div>

<script src="https://unpkg.com/vue"></script>
<script>
var app = new Vue({
el: '#app',
template: '<div><p>안녕하세요</p><button>클릭</button></div>'
});
</script>
</body>
</html>

2) data

뷰 인스턴스의 데이터 값을 설정할때 사용합니다.

사용방법

1
2
3
4
데이터 바인딩 할때 사용이 가능합니다.
template 영역에도 {{}}를 사용해서 데이터 바인딩이 가능합니다.
데이터 타입은 number, string, object, array등 모두 가능합니다.
뷰 인스턴스의 메서드 속성에서 this.data키 로 접근 가능합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<div id="app"></div>

<script src="https://unpkg.com/vue"></script>
<script>
var app = new Vue({
el: '#app',
template: '<div><p>{{message}}</p><button>{{obj.button}}</button></div>',
data: {
message : '안녕하세요',
obj : {
button: '클릭'
}
}
});
</script>
</body>
</html>

3) methods

말그대로 메서드를 정의 할수있는 속성입니다. 맨 뒤에 s를 잊지 맙시다.

사용방법

1
2
뷰 인스턴스의 각 메서드 내부에서 this.메서드이름으로 호출 가능합니다
{{}} 내부에서도 메서드를 호출 가능합니다. 이땐 this를 생략하고 메서드이름으로 호출 할수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<div id="app"></div>

<script src="https://unpkg.com/vue"></script>
<script>
var app = new Vue({
el: '#app',
template: '<div><p>{{message + "" + add()}}</p></div>',
data: {
message: '10 곱하기 10은 ',
num: 10
},
methods: {
add() {
return this.num * this.num
}
}
});
</script>
</body>
</html>

4) computed

복잡한 계산을 처리 한 후에 데이터를 출력해야 하는 경우에 사용할수 있습니다. 메서드를 호출할때랑 다르게 ()를 사용하지 않습니다.

사용용도

데이터를 처리하는 로직을 실행한 후에 화면에 출력 해야 하는 경우 methods 대신에 computed를 사용하도록 합시다.
computed 내부에서 사용한 값의 변화가 발생 할때 재연산해서 결과를 다시 렌더링 해줍니다.

장점

동일한 연산은 반복해서 처리하지 않고 미리 저장해 놓은 값을 불러옵니다.
여러번 호출 되어도 캐싱에 의해서 한번만 처리하기 때문에 속도 상승
methods는 호출 할때마다 실행되기 때문에 computed를 사용할수 있는 경우에는 computed를 사용합시다.

주의 사항

computed 그 자체의 값은 data 처럼 변경이 불가능 하다
computed의 set 메서드를 활용하여 우회해서 값을 변경하는 것이 가능한데 이것 또한 직접 computed의 값을 변경하는게 아닌 computed와 연계되는 대상의 값을 변경하는 방식

1
2
3
4
5
6
7
8
9
10
11
12
data() {
num1 : 10,
num2 : 20
},
computed: {
get sum() {
return this.num1 + this.num2;
},
set sum() {
this.num2 = 30;
}
}

메소드는 호출 한 횟수만큼 실행되는 것을 알수있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<div id="app"></div>

<script src="https://unpkg.com/vue"></script>
<script>
var app = new Vue({
el: '#app',
template: '<div><p>{{sum()}}</p><p>{{sum()}}</p></div>',
data: {
num1: 10,
num2: 20
},
methods: {
sum() {
console.log("sum을 실행합니다.");

return this.num1 + this.num2;
}
}
});
</script>
</body>
</html>

캡처

computed는 캐시 기능으로 값의 변화가 없으면 한번만 실행된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<div id="app"></div>

<script src="https://unpkg.com/vue"></script>
<script>
var app = new Vue({
el: '#app',
template: '<div><p>{{sum}}</p><p>{{sum}}</p></div>',
data: {
num1: 10,
num2: 20
},
computed: {
sum() {
console.log("sum을 실행합니다.");

return this.num1 + this.num2;
}
}
});
</script>
</body>
</html>

캡처

5) watch

computed와 유사한 기능을 제공하지만 데이터 호출과 같이 시간이 상대적으로 더 많이 소모되는 비동기 처리에 적합합니다. 값이 변경이 되면 포착하여 해당 메서를 호출해 줍니다.

사용방법

data 속성의 값을 메서드의 이름으로 작성하면 해당 data의 값이 변경이 되면 해당 메서드가 호출됩니다.

사용용도

사용자의 input 값 변경에 따른 로직을 처리할때 사용합니다.
DB등과 같은 비동기 처리 후에 해당 값이 변경 되었을 때 로직을 처리할때 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<div id="app"></div>

<script src="https://unpkg.com/vue"></script>
<script>
var app = new Vue({
el: '#app',
template: '<div><p>{{num2}}</p><button>{{setNum()}}</button></div>',
data: {
num1: 10,
num2: 20
},
methods: {
setNum() {
this.num1 = 30;

return this.num1;
}
},
watch: {
num1() {
this.num2 = 40;
}
}
});
</script>
</body>
</html>

Comment and share

Moon Star

author.bio


author.job