Tạo mới ứng dụng

<meta charset="UTF-8">
<
script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<
div id="app">
  <
h1>{{ message }}</h1>
</
div>
<
script>
 
new Vue({
     el:
'#app',
     data: {
        message:
'Hello'
     }
  });
</
script>

        Sau khi tạo xong file, mở file bằng trình duyệt (chrome/firefox/edge …) để xem kết quả chương trình:

Chạy ứng dụng bằng cách mở file html với trình duyệt

 new Vue({...})

Trong đối tượng này có các thành phần cơ bản sau:

Chi tiết về các thành phần này sẽ được trình bày trong các phần sau

<div id="app">
  <
h1>{{ message }}</h1>
</
div>

Nội dung bên trong element gốc này thực chất là một Vue template, không phải html thuần túy. Vue sử dụng template này kết hợp với phần data của ứng dụng để sinh ra html cuối cùng, sau đó mới hiển thị trên trình duyệt.

Ví dụ:  {{ message }}, thực chất là một cú pháp của Vue template,  nó sẽ được thay bằng giá trị của biến message trong phần data của ứng dụng:

data: {
   message:
'Hello'
}

Do đó, nội dung html cuối cùng được hiển thị ra trình duyệt sẽ là:

<div id="app">
  <
h1>Hello</h1>
</
div>

Gắn dữ liệu, thuộc tính cho các thẻ html

<div> {{ message }} </div>

<span> {{ message }} </span>

....

<input v-bind:value="message" />

Đây là cách gắn dữ liệu một chiều. Mỗi khi giá trị của biến message trong phần data của ứng dụng thay đổi thì thuộc tính value của thẻ input sẽ thay đổi theo. Tuy nhiên, khi người dùng thay đổi giá trị trong ô input này thì giá trị biến message không thay đổi.

Cú pháp v-bind:value có thể viết ngắn thành :value . Cú pháp này có tác dụng với cả các thuộc tính khác của các thẻ html (rows, cols, width, height, …). Một cách đơn giản, có thể hiểu v-bind:<attr> hay :<attr> sẽ được dịch thành thuộc tính <attr> của thẻ html:

+ v-bind:value, :value  → value

+ v-bind:rows, :rows → rows

+ v-bind:cols, :cols → cols

Lưu ý: Giá trị của v-bind:<attr> là một biểu thức javascript, không phải một string.

<input v-model="message" />

Đây là cách gắn dữ liệu 2 chiều (two-way-binding): Khi giá trị của biến message bị thay đổi trong chương trình, giá trị của thẻ input thay đổi theo, ngược lại khi người dùng thay đổi nội dung của ô input, giá trị của biến message cũng được cập nhật.

Cách gắn style cũng tương tự như gắn các thuộc tính html khác, có thể sử dụng v-bind:style hoặc :style. Tuy nhiên, lưu ý là giá trị của biểu thức truyền vào là một javascript object, không phải một string như style của css thông thường:

<input :style="{color: 'red', fontSize: '40px'}" />

Bên trong javascript object của :style, các thuộc tính css chứa ký tự gạch ngang ('-') được chuyển thành dạng camel case (ví dụ font-size → fontSize)

Tương tự, sử dụng v-bind:class hoặc :class để gắn css class cho các thẻ html. Nội dung của biểu thức truyền vào có một trong các dạng sau:

<div :class="['active', 'displayError']">

Trường hợp này truyền vào danh sách các css class mà thẻ html sẽ nhận.

<div :class="{ active: isActive, 'displayError': hasError }">

Trường hợp này truyền vào một danh sách kèm điều kiện của các css class. Trong trường hợp trên, thẻ div sẽ nhận class "active" nếu biến isActive (trong phần data) bằng true, và nhận class "displayError" nếu biến hasError (trong phần data) bằng true.

<div :class="[isActive ? 'active' : '', hasError? 'displayError' : '']">

Cách này tương tự cách 2.

Gắn hàm xử lý sự kiện cho các thẻ html

v-on:<event>="<eventHandler>"  

Trong đó <event> là sự kiện cần xử lý (click, change, …), <eventHandler> là hàm xử lý sự kiện.

Ví dụ:

<meta charset="UTF-8">
<
script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<
div id="app">
  <
input v-model="message" v-on:change="inputChangeHandler()"/>
  <
button v-on:click="buttonClickHandler()">Test</button>
</
div>
<
script>
 
new Vue({
     el:
'#app',
     data: {message:
""},
     methods: {
       
inputChangeHandler() {
         alert(
this.message);
       },


       
buttonClickHandler() {
         alert(
"Clicked");
       }
     }
  });
</
script>

Hiển thị có điều kiện

        

        Ví dụ:

<meta charset="UTF-8">
<
script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<
div id = "app">
   <
div v-if="show"> {{ message }}  </div>
   <
button v-on:click="show=true">Show</button>
   <
button v-on:click="show=false">Hide</button>
</
div>
<
script>
   
var vm = new Vue({
      el:
'#app',
      data: {
         show:
true,              
         message:
"Hello"
      }
   });
</
script>

Hiển thị từ một danh sách

Ví dụ:                

<meta charset="UTF-8">
<
script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<
div id="app">
 <
ul>
   <
li v-for="st in students"> {{ st }} </li>
 </
ul>
</
div>
<
script>
 
new Vue({
   el:
'#app',
   data: {
     students: [
"Nguyễn Văn A", "Nguyễn Văn B", "Nguyễn Văn C"]
   }
 });
</
script>

Trong trường hợp muốn lấy thêm chỉ số của vòng lặp có thể dùng:

v-for="(st, i) in students"

Ngoài ra, với v-for, nên truyền thêm thuộc tính :key để giúp Vue dễ update việc hiển thị danh sách khi dữ liệu thay đổi. Giá trị của :key cần duy nhất giữa các element với nhau, do đó thông thường sẽ sử dụng thuộc tính id của mỗi bản ghi trong tập dữ liệu. Nếu các bản ghi không có id, có thể dùng biến chỉ số vòng lặp để làm :key, ví dụ:

<meta charset="UTF-8">
<
script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<
div id="app">
 <
ul>
   <
li v-for="(st, i) in students" :key="i"> {{i+1}} . {{ st }} </li>
 </
ul>
</
div>
<
script>
 
new Vue({
   el:
'#app',
   data: {
     students: [
"Nguyễn Văn A", "Nguyễn Văn B", "Nguyễn Văn C"]
   }
 });
</
script>

Thuộc tính thứ cấp (computed)

  • Các biến trong phần data của ứng dụng có thể được dùng để gắn dữ liệu cho các thẻ html. Trong một số trường hợp chúng ta muốn tạo ra một thuộc tính trung gian từ phần data, sau đó mới gắn vào cho các thẻ, khi đó có thể dùng chức năng computed của Vue.

Ví dụ:

<meta charset="UTF-8">
<
script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<
div id="app">
 <
p>Họ: <input v-model="ho"/> </p>
 <
p>Tên đệm: <input v-model="ten_dem"/> </p>
 <
p>Tên: <input v-model="ten"/> </p>
 
<span> {{ hoten }} </span>
</div>
<
script>
 
new Vue({
   el:
'#app',
   data: {
     ho:
'', ten_dem: '', ten: ''
   },
   
computed: {
     hoten() {
       
return this.ho + ' ' + this.ten_dem + ' ' + this.ten;
     }
   }

 });
</
script>

Ở ví dụ trên, thuộc tính hoten đã được sinh ra từ 3 trường dữ liệu trong phần data là : ho, ten_dem, ten

Theo dõi sự thay đổi các biến dữ liệu

Ví dụ:

<meta charset="UTF-8">
<
script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<
div id="app">
 <
input v-model="message"/>
</
div>
<
script>
 
new Vue({
   el:
'#app',
   data: {
     message:
''
   },
   
watch: {
     message(newValue, oldValue) {
       alert(
"Old:" + oldValue + ",new:" + newValue);
     }
   }

 });
</
script>

Lưu ý là tên hàm trong phần watch phải trùng với tên biến trong phần data.

Hàm khởi tạo ứng dụng

Ví dụ:

<meta charset="UTF-8">
<
script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<
div id="app">
 {{ message }}
</
div>
<
script>
 
new Vue({
   el:
'#app',
   data: {
     message:
''
   },
   
created() {
     
this.message = "Hello";
   }

 });
</
script>

Lấy dữ liệu từ server

Ví dụ:

<meta charset="UTF-8">
<
script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<
div id="app">
 <
button v-on:click="getWeather()">Lấy thông tin thời tiết</button>
 <
div v-if="weather">
   <
p><b>Thời tiết Hà Nội hiện tại</b></p>
   <
p>Nhiệt độ : {{ weather.main.temp }} °C</p>
   <
p>Độ ẩm : {{ weather.main.humidity }} %</p>
   <
p>Áp suất khí quyển : {{ weather.main.pressure/1000 }} atm</p>
 </
div>
</
div>

<
script>
 
new Vue({
   
el: "#app",
   
data: {
     
weather: null,
     
server_url: "http://api.openweathermap.org/data/2.5/weather",
     
location_id: "1581129",
     
api_key: "d6477696b63c2e661af64eead58c11d9",
   },

   
methods: {
     
async getWeather() {
       
var url = this.server_url + `?id=${this.location_id}&units=metric&appid=${this.api_key}`;
       
var response = await fetch(url);
       
this.weather = await response.json();
     }

   },
 });
</
script>