[javascript] vue.js의 구성 요소에 데이터 전달

vue.js의 구성 요소간에 데이터를 전달하는 방법을 이해하는 데 어려움을 겪고 있습니다. 문서를 여러 번 읽었고 많은 vue 관련 질문과 자습서를 보았지만 여전히 이해하지 못하고 있습니다.

이것에 대해 머리를 감싸기 위해 꽤 간단한 예제를 완성하는 데 도움이되기를 바랍니다.

  1. 하나의 구성 요소에 사용자 목록 표시 (완료)
  2. 링크를 클릭 (완료)하면 사용자 데이터를 새 구성 요소로 보냅니다. 하단의 업데이트를 참조하십시오.
  3. 사용자 데이터를 편집하고 원래 구성 요소로 다시 보냅니다 (지금까지 확인하지 않음).

다음은 2 단계에서 실패한 바이올린입니다. https://jsfiddle.net/retrogradeMT/d1a8hps0/

새 구성 요소에 데이터를 전달하기 위해 소품을 사용해야한다는 것을 이해하지만 기능적으로 수행하는 방법을 모르겠습니다. 데이터를 새 구성 요소에 어떻게 바인딩합니까?

HTML :

    <div id="page-content">
       <router-view></router-view>
     </div>

 <template id="userBlock" >
   <ul>
     <li v-for="user in users">{{user.name}} - <a v-link="{ path: '/new' }"> Show new component</a>
     </li>
   </ul>
 </template>

  <template id="newtemp" :name ="{{user.name}}">
    <form>
      <label>Name: </label><input v-model="name">
      <input type="submit" value="Submit">
    </form>
  </template>

주요 구성 요소에 대한 Node.js :

Vue.component('app-page', {
  template: '#userBlock',

  data: function() {
    return{

        users: []
      }
    },

ready: function () {
    this.fetchUsers();
},

methods: {
    fetchUsers: function(){
        var users = [
          {
            id: 1,
            name: 'tom'
          },
          {
            id: 2,
            name: 'brian'
          },
          {
            id: 3,
            name: 'sam'
          },
        ];

        this.$set('users', users);
     }
    }
  })

두 번째 구성 요소에 대한 JS :

Vue.component('newtemp', {
  template: '#newtemp',
  props: 'name',
  data: function() {
    return {
        name: name,
        }
   },
})

최신 정보

좋아, 두 번째 단계를 알아 냈다. 다음은 진행 상황을 보여주는 새로운 바이올린입니다 : https://jsfiddle.net/retrogradeMT/9pffnmjp/

Vue-router를 사용하고 있기 때문에 데이터를 새 구성 요소로 보내는 데 소품을 사용하지 않습니다. 대신 v-link에 매개 변수를 설정 한 다음 전환 후크를 사용하여 수락해야합니다.

V-link 변경 사항 은 vue-router 문서에서 명명 된 경로를 참조하십시오 .

<a v-link="{ name: 'new', params: { name: user.name }}"> Show new component</a>

그런 다음 구성 요소에서 경로 옵션에 데이터를 추가하고 전환 후크를 참조하십시오 .

Vue.component('newtemp', {
  template: '#newtemp',
  route: {
   data: function(transition) {
        transition.next({
            // saving the id which is passed in url
            name: transition.to.params.name
        });
     }
  },
 data: function() {
    return {
        name:name,
        }
   },
})



답변

————- 다음은 Vue 1에만 적용됩니다. ————–

데이터 전달은 여러 가지 방법으로 수행 할 수 있습니다. 방법은 사용 유형에 따라 다릅니다.


새 구성 요소를 추가하는 동안 html에서 데이터를 전달하려는 경우. 그것은 소품을 사용하여 수행됩니다.

<my-component prop-name="value"></my-component>

이 소품 값은 속성에 소품 이름 prop-name을 추가하는 경우에만 구성 요소에서 사용할 수 있습니다 props.


일부 동적 또는 정적 이벤트로 인해 구성 요소에서 다른 구성 요소로 데이터가 전달되는 경우. 이는 이벤트 디스패처와 브로드 캐스터를 사용하여 수행됩니다. 예를 들어 다음과 같은 구성 요소 구조가있는 경우 :

<my-parent>
    <my-child-A></my-child-A>
    <my-child-B></my-child-B>
</my-parent>

그리고 당신은 데이터를 보낼 <my-child-A><my-child-B>에 다음 <my-child-A>당신이 이벤트를 전달해야합니다 :

this.$dispatch('event_name', data);

이 이벤트는 상위 체인까지 이동합니다. 그리고 어떤 부모로부터 당신을 향한 분기를 가지고 <my-child-B>데이터와 함께 이벤트를 방송합니다. 따라서 부모에서 :

events:{
    'event_name' : function(data){
        this.$broadcast('event_name', data);
    },

이제이 방송은 자식 체인으로 이동합니다. 그리고 이벤트를 잡으려는 아이에게 우리의 경우 <my-child-B>다른 이벤트를 추가합니다.

events: {
    'event_name' : function(data){
        // Your code. 
    },
},

데이터를 전달하는 세 번째 방법은 v-link의 매개 변수를 사용하는 것입니다. 이 메서드는 구성 요소 체인이 완전히 파괴되거나 URI가 변경 될 때 사용됩니다. 그리고 나는 당신이 이미 그들을 이해하고 있음을 볼 수 있습니다.


원하는 데이터 통신 유형을 결정하고 적절하게 선택하십시오.


답변

부모 구성 요소에서 자식으로 데이터를 보내는 가장 좋은 방법은 props를 사용하는 것입니다 .

다음을 통해 부모에서 자식으로 데이터 전달 props

  • 자식에서 props(배열 또는 객체 ) 선언
  • 그것을 통해 아이에게 전달하십시오 <child :name="variableOnParent">

아래 데모를 참조하십시오.

Vue.component('child-comp', {
  props: ['message'], // declare the props
  template: '<p>At child-comp, using props in the template: {{ message }}</p>',
  mounted: function () {
    console.log('The props are also available in JS:', this.message);
  }
})

new Vue({
  el: '#app',
  data: {
    variableAtParent: 'DATA FROM PARENT!'
  }
})
<script src="https://unpkg.com/vue@2.5.13/dist/vue.min.js"></script>

<div id="app">
  <p>At Parent: {{ variableAtParent }}<br>And is reactive (edit it) <input v-model="variableAtParent"></p>
  <child-comp :message="variableAtParent"></child-comp>
</div>


답변

문제가 여기에 있다고 생각합니다.

<template id="newtemp" :name ="{{user.name}}">

prop에 접두사 :를 붙이면 Vue에 문자열이 아니라 변수임을 나타냅니다. 따라서 {{}}주위 가 필요하지 않습니다 user.name. 시험:

<template id="newtemp" :name ="user.name">

편집하다—–

위는 사실이지만 여기서 더 큰 문제는 URL을 변경하고 새 경로로 이동하면 원래 구성 요소가 사라진다는 것입니다. 두 번째 구성 요소가 상위 데이터를 편집하도록하려면 두 번째 구성 요소가 첫 번째 구성 요소의 하위 구성 요소이거나 동일한 구성 요소의 일부 여야합니다.


답변

Vue의 구성 요소 범위에 부모 데이터를 전달하는 방법을 찾았습니다. 약간의 해킹이라고 생각하지만 아마도 이것이 도움이 될 것입니다.

1) Vue 인스턴스의 데이터를 외부 개체로 참조 (data : dataObj)

2) 그런 다음 하위 구성 요소의 데이터 반환 기능에서 그냥 반환 parentScope = dataObj하고 짜잔합니다. 이제 당신은 같은 일을 할 수 없으며 {{ parentScope.prop }}매력처럼 작동합니다.

행운을 빕니다!


답변

위에서 언급 한 응답은 잘 작동하지만 두 형제 구성 요소간에 데이터를 전달하려는 경우 이벤트 버스도 사용할 수 있습니다. 더 잘 이해하는 데 도움이되는이 블로그를 확인하십시오.

두 가지 구성 요소가 있다고 가정합니다 : CompA 및 CompB는 동일한 부모를 가지며 main.js는 main vue 앱을 설정합니다. 상위 구성 요소를 포함하지 않고 CompA에서 CompB로 데이터를 전달하려면 다음을 수행 할 수 있습니다.

main.js 파일에서 이벤트 버스가 될 별도의 글로벌 Vue 인스턴스를 선언하십시오.

export const bus = new Vue();

이벤트가 생성되는 CompA에서 : 이벤트를 버스로 내 보내야합니다.

methods: {
      somethingHappened (){
          bus.$emit('changedSomething', 'new data');
      }
  }

이제 작업은 방출 된 이벤트를 수신하는 것이므로 CompB에서 다음과 같이 수신 할 수 있습니다.

created (){
    bus.$on('changedSomething', (newData) => {
      console.log(newData);
    })
  }

장점 :

  • Less & Clean 코드.
  • 부모는 1 개의 하위 구성 요소에서 다른 구성 요소로 데이터를 전달하는 데 관여해서는 안됩니다 (자녀 수가 증가함에 따라 유지 관리가 어려워 짐).
  • pub-sub 접근 방식을 따릅니다.


답변

을 사용하여 주요 속성에 액세스합니다 $root.

Vue.component("example", {
    template: `<div>$root.message</div>`
});
...
<example></example>


답변

전역 JS 변수 (객체)를 사용하여 구성 요소간에 데이터를 전달할 수 있습니다. 예 : Ammlogin.vue에서 Options.vue로 데이터 전달. Ammlogin.vue에서 rspData는 서버의 응답으로 설정됩니다. Options.vue에서 서버의 응답은 rspData를 통해 사용할 수 있습니다.

index.html :

<script>
    var rspData; // global - transfer data between components
</script>

Ammlogin.vue :

....
export default {
data: function() {return vueData},
methods: {
    login: function(event){
        event.preventDefault(); // otherwise the page is submitted...
        vueData.errortxt = "";
        axios.post('http://vueamm...../actions.php', { action: this.$data.action, user: this.$data.user, password: this.$data.password})
            .then(function (response) {
                vueData.user = '';
                vueData.password = '';
                // activate v-link via JS click...
                // JSON.parse is not needed because it is already an object
                if (response.data.result === "ok") {
                    rspData = response.data; // set global rspData
                    document.getElementById("loginid").click();
                } else {
                    vueData.errortxt = "Felaktig avändare eller lösenord!"
                }
            })
            .catch(function (error) {
                // Wu oh! Something went wrong
                vueData.errortxt = error.message;
            });
    },
....

Options.vue :

<template>
<main-layout>
  <p>Alternativ</p>
  <p>Resultat: {{rspData.result}}</p>
  <p>Meddelande: {{rspData.data}}</p>
  <v-link href='/'>Logga ut</v-link>
</main-layout>
</template>
<script>
 import MainLayout from '../layouts/Main.vue'
 import VLink from '../components/VLink.vue'
 var optData = { rspData: rspData}; // rspData is global
 export default {
   data: function() {return optData},
   components: {
     MainLayout,
     VLink
   }
 }
</script>