Programing

구성 요소 외부에서 Vue.js 구성 요소 메서드를 호출하십시오.

c10106 2022. 3. 5. 17:59
반응형

구성 요소 외부에서 Vue.js 구성 요소 메서드를 호출하십시오.

예를 들어, 하위 구성 요소를 포함하는 기본 Vue 인스턴스가 있다고 합시다.이러한 구성 요소 중 하나에 속하는 방법을 Vue 인스턴스 외부에서 전체적으로 호출하는 방법이 있는가?

예를 들면 다음과 같다.

var vm = new Vue({
  el: '#app',
  components: {
    'my-component': { 
      template: '#my-template',
      data: function() {
        return {
          count: 1,
        };
      },
      methods: {
        increaseCount: function() {
          this.count++;
        }
      }
    },
  }
});

$('#external-button').click(function()
{
  vm['my-component'].increaseCount(); // This doesn't work
});
<script src="http://vuejs.org/js/vue.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="app">
  
  <my-component></my-component>
  <br>
  <button id="external-button">External Button</button>
</div>
  
<template id="my-template">
  <div style="border: 1px solid; padding: 5px;">
  <p>A counter: {{ count }}</p>
  <button @click="increaseCount">Internal Button</button>
    </div>
</template>

그래서 내부버튼을 누르면increaseCount()메소드는 클릭 이벤트에 바인딩되어 있기 때문에 호출된다.이벤트를 jQuery로 듣고 있는 클릭 이벤트인 외부 버튼에 바인딩할 방법이 없으므로 다른 호출 방법이 필요하겠다.increaseCount.

편집

이 방법이 효과가 있는 것 같다:

vm.$children[0].increaseCount();

그러나 자식 배열에서 구성요소의 색인을 기준으로 구성요소를 참조하고 있으며, 많은 구성요소가 있는 경우 이것은 일정하게 유지될 가능성이 낮고 코드를 판독할 수 없기 때문에 이것은 좋은 해결책이 아니다.

결국 나는 Vue의 지시를 사용하기로 선택했다.이것은 부모로부터 직접 접근을 위해 구성요소를 참조할 수 있게 한다.

예시

부모 인스턴스에 컴퍼멘트가 등록되어 있음:

var vm = new Vue({
    el: '#app',
    components: { 'my-component': myComponent }
});

참조를 사용하여 구성 요소를 템플릿/html로 렌더링:

<my-component ref="foo"></my-component>

이제 다른 곳에서 외부적으로 구성 요소에 액세스할 수 있음

<script>
vm.$refs.foo.doSomething(); //assuming my component has a doSomething() method
</script>

https://jsfiddle.net/xmqgnbu3/1/의 예제를 보려면 이 fiddle을 참조하십시오.

(예: Vue 1 사용: https://jsfiddle.net/6v7y6msr/)

부모 구성 요소에서 $ref를 통해 호출할 수 있는 하위 구성 요소에 대한 참조를 설정할 수 있다.

하위 구성 요소에 참조 추가:

<my-component ref="childref"></my-component>

상위 항목에 클릭 이벤트 추가:

<button id="external-button" @click="$refs.childref.increaseCount()">External Button</button>

var vm = new Vue({
  el: '#app',
  components: {
    'my-component': { 
      template: '#my-template',
      data: function() {
        return {
          count: 1,
        };
      },
      methods: {
        increaseCount: function() {
          this.count++;
        }
      }
    },
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  
  <my-component ref="childref"></my-component>
  <button id="external-button" @click="$refs.childref.increaseCount()">External Button</button>
</div>
  
<template id="my-template">
  <div style="border: 1px solid; padding: 2px;" ref="childref">
    <p>A counter: {{ count }}</p>
    <button @click="increaseCount">Internal Button</button>
  </div>
</template>

Vue2의 경우 다음과 같이 적용된다.

var bus = new Vue()

// 성분 A의 방법으로

bus.$emit('id-selected', 1)

// 구성 요소 B가 만든 후크에서

bus.$on('id-selected', function (id) {

  // ...
})

Vue 문서를 보려면 여기를 참조하십시오.그리고 여기 이 이벤트 버스를 정확히 설정하는 방법에 대한 더 자세한 설명이 있다.

속성, 이벤트 및/또는 중앙 집중식 상태 관리를 사용해야 하는 시기에 대한 자세한 내용은 이 문서를 참조하십시오.

Vue 3에 대한 Thomas의 아래 의견을 참조하십시오.

Vue 이벤트 시스템 사용 가능

vm.$broadcast('event-name', args)

그리고

 vm.$on('event-name', function())

여기 fiddle: http://jsfiddle.net/hfalucas/wc1gg5v4/59/

수용된 답변의 약간 다른 (시뮬러) 버전:

상위 인스턴스에 등록된 구성 요소:

export default {
    components: { 'my-component': myComponent }
}

참조를 사용하여 구성 요소를 템플릿/html로 렌더링:

<my-component ref="foo"></my-component>

구성 요소 메서드에 액세스:

<script>
    this.$refs.foo.doSomething();
</script>

Say you have a .child_method()하위 구성 요소:

export default {
    methods: {
        child_method () {
            console.log('I got clicked')
        }
    }
}

이제 당신은 실행하기를 원한다.child_method상위 구성 요소:

<template>
    <div>
        <button @click="exec">Execute child component</button>
        <child-cmp ref="child"></child_cmp> <!-- note the ref="child" here -->
    </div>
</template>

export default {
    methods: {
        exec () { //accessing the child component instance through $refs
            this.$refs.child.child_method() //execute the method belongs to the child component
        }
    }
}

하위 구성 요소에서 상위 구성 요소 메서드를 실행하려는 경우:

this.$parent.name_of_method()

참고: 이와 같이 자식 및 부모 구성 요소에 접근하는 것은 권장하지 않는다.

대신 모범 사례로 부모-자녀 간 커뮤니케이션을 위한 소품 & 이벤트를 사용하십시오.

구성 요소 간의 통신을 원할 경우 vuex 또는 이벤트 버스를 사용하십시오.

이 매우 도움이 되는 을 읽어보십시오.


이것은 다른 구성요소로부터 구성요소의 메서드에 접근하는 간단한 방법이다.

// This is external shared (reusable) component, so you can call its methods from other components

export default {
   name: 'SharedBase',
   methods: {
      fetchLocalData: function(module, page){
          // .....fetches some data
          return { jsonData }
      }
   }
}

// This is your component where you can call SharedBased component's method(s)
import SharedBase from '[your path to component]';
var sections = [];

export default {
   name: 'History',
   created: function(){
       this.sections = SharedBase.methods['fetchLocalData']('intro', 'history');
   }
}

여기 간단한 것이 있다.

this.$children[indexOfComponent].childsMethodName();

Vue 3 사용:

const app = createApp({})

// register an options object
app.component('my-component', {
  /* ... */
})

....

// retrieve a registered component
const MyComponent = app.component('my-component')

MyComponent.methods.greet();

https://v3.vuejs.org/api/application-api.html#component

나는 그것이 옳은 방법인지 확실하지 않지만 이것은 나에게 효과가 있다.
먼저 구성 요소를 호출할 메서드가 포함된 구성 요소를 가져오십시오.

import myComponent from './MyComponent'

그런 다음 MyCompenent의 모든 방법을 호출하십시오.

myComponent.methods.doSomething()

다음과 같은 구성 요소에 기능을 선언하십시오.

export default {
  mounted () {
    this.$root.$on('component1', () => {
      // do your logic here :D
    });
  }
};

이런 페이지에서 호출하십시오.

this.$root.$emit("component1");

때때로 당신은 이러한 것들을 당신의 구성 요소 안에 포함시키고 싶어한다.DOM 상태(Vue 구성 요소가 인스턴스화될 때 수신 중인 요소가 DOM에 존재해야 함)에 따라 Vue 구성 요소 내에서 구성 요소 외부의 요소에 대한 이벤트를 청취할 수 있다.구성 요소 외부에 요소가 있다고 가정해 봅시다. 사용자가 해당 요소를 클릭하면 구성 요소가 응답하도록 하십시오.

html에서 사용하는 기능:

<a href="#" id="outsideLink">Launch the component</a>
...
<my-component></my-component>

Vue 구성 요소:

    methods() {
      doSomething() {
        // do something
      }
    },
    created() {
       document.getElementById('outsideLink').addEventListener('click', evt => 
       {
          this.doSomething();
       });
    }
    

나는 아주 간단한 용액을 사용해 왔다.내가 선택한 Vue Component에 메소드를 호출하는 HTML 요소를 바닐라 JS를 사용하여 포함시키고 클릭을 트리거한다!

부에 컴포넌트에 다음과 같은 내용을 포함시켰다.

<span data-id="btnReload" @click="fetchTaskList()"><i class="fa fa-refresh"></i></span>

바닐라 JS 사용:

const btnReload = document.querySelector('[data-id="btnReload"]');
btnReload.click();                

참조URL: https://stackoverflow.com/questions/33682651/call-a-vue-js-component-method-from-outside-the-component

반응형