📌

【Vue.js】基本テンプレート

2023/03/21に公開

全体

<script>
export default {
  data() {
    // 1. 宣言的レンダリング
    return {
      データプロパティ: '値(文字列や数値、配列、クラスなど)'
      message: 'Hello World!',
      titleClass: 'title',
      count: 0,
      text: '',
      awesome: true,
      newTodo: '',
      todos: [
        { id: id++, text: 'Learn HTML' },
        { id: id++, text: 'Learn JavaScript' },
        { id: id++, text: 'Learn Vue' }
      ]
    }
  },
  mounted() {
    this.$refs.p.textContent = 'mounted!'
  },
  computed: {
    算出プロパティ() {
      if (this.データプロパティ) {
        return '値1'
      }
      return '値2'
    }
  }
  methods: {
    関数名() {
      // 処理
    },
    increment() {
      this.count++
    },
    toggle() {
      this.awesome = !this.awesome
    },
    addTodo() {
      this.todos.push({ id: id++, text: this.newTodo })
      this.newTodo = ''
    },
    removeTodo(todo) {
      this.todos = this.todos.filter((t) => t !== todo)
    }
  }
}
</script>

<template>
  <!-- 1. 宣言的レンダリング -->
  <h1>{{ message }}</h1>
  
  <!-- 2. 属性バインディング(v-bind) -->
  <h1 :class="titleClass">Make me red</h1>
  
  <!-- 3. イベントリスナー(v-on) -->
  <button @click="increment">count is: {{ count }}</button>
  
  <!-- 
  4. フォームバインディング(v-model)
  https://ja.vuejs.org/guide/essentials/forms.html
  -->
  <input v-model="text">
  <p>{{ text }}</p>
  
  <!-- 5. 条件付きレンダリング(v-if) -->
  <button @click="toggle">toggle</button>
  <h1 v-if="awesome">Vue is awesome!</h1>
  <h1 v-else>Oh no 😢</h1>
  
  <!-- 6. リストレンダリング(v-for) -->
  <form @submit.prevent="addTodo">
    <input v-model="newTodo">
    <button>Add Todo</button>    
  </form>
  <ul>
    <li v-for="todo in todos" :key="todo.id">
      {{ todo.text }}
      <button @click="removeTodo(todo)">X</button>
    </li>
  </ul>
  
  <!-- 8. ライフサイクルとテンプレート参照 -->
  <!-- コンポーネントがマウントされた後でないとアクセスできない -->
  <p ref="p">hello</p>
</template>

<style>
.title {
  color: red;
}
</style>

スクリプト内

<script>
import 他のコンポーネント from './ChildComp.vue'

export default {
  // 自身のコンポーネントが他のコンポーネントから呼び出される際にpropを指定できる
  // ex) <MyComp :msg="データプロパティ" :引数="データプロパティ">
  props: {
    msg: String
    // 引数: 型
  },
  components: {
    他のコンポーネント,
    // ...
  },
  data() {
    return {
      データプロパティ: '値(文字列や数値、配列、クラスなど)'
      // ...
    }
  },
  mounted() {
    // https://ja.vuejs.org/guide/essentials/lifecycle.html#lifecycle-diagram
    // マウントされたあとに実行する関数
  },
  watch: {
    データプロパティ() {
      // 該当のデータプロパティの値が変化したときに実行される
      // ex) 値が更新されたらAPIをコールする
    }
  },
  methods: {
    関数() {
      // 処理
    },
    引数付き関数(a) {
      // 呼び出し方の例: <button @click="引数付き関数(データプロパティ)">X</button>
    }
  },
  computed: {
    算出プロパティ() {
      // https://ja.vuejs.org/tutorial/#step-8
      // テンプレートからデータプロパティのように呼び出せる
    },
    書き込み可能な算出プロパティ {
      // https://ja.vuejs.org/guide/essentials/computed.html#writable-computed
      // getter
      get() {
        return '値'
      },
      set(newValue) {
        this.データプロパティ = newValue
      }
    }
  }
}
</script>

親子コンポーネント間でイベントを発行

this.$emits

子コンポーネント.vue
<script>
export default {
  emits: ['イベント名'],
  mounted() {
    this.$emit('イベント名',)
  }
}
</script>

<template>
  <h2>Child component</h2>
</template>
親コンポーネント.vue
<script>
import 子コンポーネント from './子コンポーネント.vue'

export default {
  components: {
    子コンポーネント
  },
  data() {
    return {
      データプロパティ: '親コンポーネントの値'
    }
  }
}
</script>

<template>
  <子コンポーネント @イベント名="(値) => データプロパティ = 値" />
  <p>{{ データプロパティ }}</p>
</template>

Discussion