Đăng nhập

BÀI 6: COMPUTED & WATCH – TÍNH TOÁN VÀ THEO DÕI DỮ LIỆU

  • Hiểu sự khác nhau giữa computedwatch
  • Biết khi nào nên dùng cái nào
  • Làm ví dụ tính họ tên đầy đủ, và theo dõi biến count thay đổi
Tiêu chícomputedwatch
Hoạt độngTrả về giá trị mới khi dữ liệu liên quan thay đổiTheo dõi thay đổi của biến, để thực hiện hành động phụ
Dùng đểHiển thị giá trị đã xử lýGửi API, log, kiểm tra điều kiện…
Có cache không?✅ Có cache (chỉ tính lại khi cần)❌ Không cache
<!DOCTYPE html>
<html lang="vi">
<head>
  <meta charset="UTF-8">
  <title>Vue Computed & Watch</title>
  <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
  <style>
    body {
      font-family: Arial;
      display: flex;
      gap: 30px;
      padding: 20px;
    }
    .code {
      width: 50%;
    }
    .output {
      width: 50%;
      border-left: 2px solid #ccc;
      padding-left: 20px;
    }
    input {
      padding: 5px;
      margin: 5px 0;
    }
    .log {
      font-style: italic;
      color: gray;
    }
  </style>
</head>
<body>

  <div class="code">
    <h2>Mã nguồn Vue:</h2>
<pre><code>&lt;div id="app"&gt;

  &lt;!-- 1. Computed: Họ tên đầy đủ --&gt;
  &lt;h3&gt;Họ:&lt;/h3&gt;
  &lt;input v-model="firstName"&gt;

  &lt;h3&gt;Tên:&lt;/h3&gt;
  &lt;input v-model="lastName"&gt;

  &lt;p&gt;&lt;strong&gt;Họ tên đầy đủ:&lt;/strong&gt; {{ fullName }}&lt;/p&gt;

  &lt;!-- 2. Watch: Theo dõi biến count --&gt;
  &lt;h3&gt;Bộ đếm: {{ count }}&lt;/h3&gt;
  &lt;button @click="count++"&gt;Tăng&lt;/button&gt;

  &lt;p class="log"&gt;Log: {{ logMessage }}&lt;/p&gt;

&lt;/div&gt;

&lt;script&gt;
const { createApp } = Vue;
createApp({
  data() {
    return {
      firstName: '',
      lastName: '',
      count: 0,
      logMessage: ''
    }
  },
  computed: {
    fullName() {
      return this.firstName + ' ' + this.lastName;
    }
  },
  watch: {
    count(newVal, oldVal) {
      this.logMessage = `Giá trị count thay đổi từ ${oldVal} → ${newVal}`;
    }
  }
}).mount('#app')
&lt;/script&gt;
</code></pre>
  </div>

  <div class="output">
    <h2>Kết quả hiển thị:</h2>
    <div id="app">
      <!-- Computed -->
      <h3>Họ:</h3>
      <input v-model="firstName">
      <h3>Tên:</h3>
      <input v-model="lastName">
      <p><strong>Họ tên đầy đủ:</strong> {{ fullName }}</p>

      <!-- Watch -->
      <h3>Bộ đếm: {{ count }}</h3>
      <button @click="count++">Tăng</button>
      <p class="log">Log: {{ logMessage }}</p>
    </div>
  </div>

  <script>
    const { createApp } = Vue;
    createApp({
      data() {
        return {
          firstName: '',
          lastName: '',
          count: 0,
          logMessage: ''
        }
      },
      computed: {
        fullName() {
          return this.firstName + ' ' + this.lastName;
        }
      },
      watch: {
        count(newVal, oldVal) {
          this.logMessage = `Giá trị count thay đổi từ ${oldVal} → ${newVal}`;
        }
      }
    }).mount('#app')
  </script>

</body>
</html>
Câu lệnhTác dụng
computed: { fullName() { ... } }Trả về họ tên đầy đủ khi firstName hoặc lastName thay đổi
watch: { count(newVal, oldVal) { ... } }Theo dõi count mỗi khi thay đổi, cập nhật log
  1. Dùng computed tạo biến greeting → trả về "Xin chào, fullName!"
  2. Dùng watch theo dõi firstName, nếu đổi thì log "Bạn đã đổi họ!"
  3. Đếm số lần count thay đổi và hiển thị tổng số lần đó

Thảo luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Đăng ký nhận tin mới

Nhận bài học, tài nguyên và cơ hội việc làm qua email hàng tuần.

Chúng tôi cam kết không spam. Bạn có thể hủy bất cứ lúc nào.