[Vue.js] 상위 구성 요소에 의해 정의된 이벤트 동적을 하위 구성 요소 내 목록 렌더링 버튼에 대응하는 예제 코드

9754 단어 Vue.js

입문


서브어셈블리의 목록 렌더링 버튼

상위 어셈블리에 정의된 이벤트
동적으로 대응하고 싶어서 샘플 코드를 남겼어요.
※ 복제품으로 행동을 확인할 수 있습니다.

환경

OS: macOS Catalina 10.15.3
Vue: 2.6.10

결론: 결과 출력



모든 단추는 단독의 방법이 있다.

서브어셈블리


Child.vue
<template>
  <div id="child">
    <h1>{{ title }}</h1>
    <!-- 親コンポーネントのbtns内のオブジェクト数に応じてbuttonの数を変更する -->
    <div v-for="btn in btns" :key="btn.id">
      <!-- $emitにて、親コンポーネントでv-onに指定する名前、第2引数には親コンポーネントに渡したい値をセット -->
      <button @click="$emit('click-button', btn.action)">{{ btn.name }}</button>
    </div>
  </div>
</template>

<script>
  export default {
    name: 'Child',
    props: {
      title: String, //型を指定しておくと予定外の型になった場合エラーが出て気付ける
      btns: Array,
    }
  }
</script>

상위 어셈블리


Parent.vue
<template>
  <div id="parent">
    <!-- 子コンポーネントからpropsで渡した属性を親コンポーネントで指定 -->
    <Child
      title="Chile to Parent"
      :btns='btns'
      @click-button="toggleClick"
    ></Child>
  </div>
</template>

<script>
  import Child from './Child.vue'

  export default {
    name: 'Parent',
    components: {
      Child,
    },
    data() {
      return {
        //表示したい数だけbtnsにオブジェクトを記載
        btns: [
          {id: 1, name: 'run console.log', action: 'consoleLog'},
          {id: 2, name: 'run alert', action: 'alert'},
          {id: 3, name: 'run console.error', action: 'error'}
        ]
      }
    },
    methods: {
      //どのメソッドを発火するかを動的に変更するために定義
      toggleClick(action) {
        if (action === "consoleLog") {
          this.consoleLog() //thisをつけることで親コンポーネントで定義済のメソッドと紐づく
        } else if (action === "alert") {
          this.alert()
        } else if (action === "error") {
          this.error()
        }
      },

      //実際に発火するメソッド
      consoleLog() {
        console.log('one!')
      },
      alert() {
        alert('two!')
      },
      error() {
        console.error('three!')
      }
    }
  }
</script>

끝내다


끝까지 읽어주셔서 감사합니다
누구한테 참고가 됐으면 좋겠어요

참고로 사이트 (항상 감사합니다)

  • 서브어셈블리에서 Vue 상위 어셈블리 데이터 / 메서드 사용하기 -Qiita
  • 【Vue.js】Vue warn: Error in v-on handler: "TypeError: handler.apply is not a function - Qiita
  • 좋은 웹페이지 즐겨찾기