【Vue】02 - 響應式變數與DOM Element 的互動

  • 25
  • 0
  • Vue
  • 2024-12-25

在script 中宣告好vue 組件之後,下一步就是要將這先變數與DOM Element 綁定,才能達到雙向互動

ref()

代表響應式變量,將變數宣告成響應式變量,則代表vue 能夠自動追蹤這些變數

<script setup>
  import { ref } from 'vue'
  // 將inputName 宣告為型態為字串的響應式變量
  const inputName = ref('name')
  
  const append = (appendString) => {
    // 響應式變量需要透過.value 才能存取其值
    inputName.value += appendString;
  };
</script>

v-bind

將javascript 變數的值綁定到DOM 上

<script setup>
  import { ref } from 'vue'
  const inputId = ref('name')
</script>

<template>
  <!-- h1的id 就會是上面宣告的 'name' -->
  <h1 v-bind:id="inputId">Header</h1>
  
  <!-- v-bind 也可以簡寫成":",如下 -->
  <!-- <h1 :id="inputId">Make me red</h1> -->
</template>

v-on

監聽事件觸發方法

<script setup>
  import { ref } from 'vue'
  const count = ref(0)
  function increment() {
    count.value++
  }
</script>

<template>
  <!-- 綁定click事件,會觸發function: increment -->
  <!-- 進一步因為button 文字有綁定渲染 count -->
  <!--所以javascript 變數count 的修改會及時渲染,改變button 文字 -->
  <button v-on:click="increment">Count is: {{ count }}</button>
  
  <!-- v-bind 也可以簡寫成":",如下 -->
  <!-- <button @click="increment">Count is: {{ count }}</button> -->  
</template>

v-model

v-bind + v-on,實現雙向綁定: DOM 的值與javascript 變數

<script setup>
  import { ref } from 'vue'
  const text = ref('')
  
  function appendOne(){
    text.value += '1'
  }
</script>

<template>
  <!-- 當修改input 內容,p 會顯示綁定的text 值 -->
  <input v-model="text" placeholder="Type here">
  <!-- 點擊p 修改text,input 的值也會隨之改變 -->
  <p @click="appendOne">{{ text }}</p>
</template>

v-if, v-else-if, v-else

當後方的呼叫的function 或判斷式成立,才會渲染tag

<script setup>
  import { ref } from 'vue'
  const loginType = ref('')  
  function toggleLoginType (){
    switch(loginType.value){
      case 'username':
        loginType.value = 'email';
        break;
      case 'email':
        loginType.value = 'username';
        break;
      default:
        loginType.value = 'username';
        break;        
    }
  }
</script>

<template >
  <div v-if="loginType === 'username'">
    <label>Username</label>
    <input placeholder="Enter your username">
  </div>
  <div v-else>
    <label>Email</label>
    <input placeholder="Enter your email address">
  </div>
  <button @click="toggleLoginType ">Toggle login type</button>
</template>

另外有關渲染,vue 會傾向於重新利用不同template 中的相同元素,請參考以下連結: 条件渲染 — Vue.js (vuejs.org)

v-for

就是for 迴圈

<script setup>
  import { ref } from 'vue'
  const todos = ref([
    { id: 1, text: 'Learn HTML' },
    { id: 2, text: 'Learn JavaScript' },
    { id: 3, text: 'Learn Vue' }
  ])

</script>

<template>
  <ul>
    <!-- 有趣的是後面,可以在for-loop 順便綁定li.key attribute -->
    <li v-for="todo in todos" :key="todo.id">
      {{ todo.text }}
    </li>
  </ul>
</template>

References:
https://zh.wikipedia.org/zh-tw/Node.js