2016-12-02 2 views
2

나는 간단한 타이머 앱을 만들고있다. 타이머, 프로젝트 및 사용자 등 서버에서 3 가지 데이터를 얻습니다. 나는 타이머를 올바르게 반복하고 있다고 생각하지만, 이런 식으로 데이터를 전달해야하는지 확신 할 수 없다. 내 앱의 다른 부분에서 프로젝트 이름이 변경되는 경우 사용자와 프로젝트에 동일한 데이터 세트를 사용하기를 원합니다. 지금까지 질문이 포함 된 코드가 있습니다. 한 번에 모든 데이터를 한 번 호출하고 싶습니다.Vue.js : 부모/액세스 vue 메소드가 아닌 데이터를 전달하는 방법은 무엇입니까?

<script> 
Vue.component('sidebar-timer', { 
    props: ['timer','projects','users'], 
    computed: { 

     /***** SHOULD PROJECT AND USER BE SET A DIFFERENT WAY? *****/ 
     project: function() { 
      return this.projects[this.timer.project_id.toString()]; 
     }, 
     user: function() { 
      return this.users[this.timer.user_id.toString()]; 
     } 
    }, 

    template: '<li class="project-item"><div class="timer-proj-name"> @{{ project.name }}</div><div class="timer-name"> @{{ user.name }}</div> <button class="timer-start-btn">Start</button><div class="timer-duration">@{{ timer.duration }}</div><div class="timer-status">@{{ timer.status }}</div><div id="toggle-timer-notes"><div class="timer-task"> @{{ timer.notes }}</div><div>timer id: @{{ timer.id }}<input :value="timer.id"></li></div>', 
}) 

var TimerSidebar = Vue.extend({ 
    methods: { 
     updateData: function() { // GET DATA FROM THE SERVER 
      var self = this; 
      $.get('/timers/getJson', function(response){ 
       var userObj = response.users; 
       var projectObj = response.projects; 
       var timerObj = response.timers; 
       var timerArr = Object.keys(timerObj).map(function (key) {return timerObj[key]; }); 

/***** IS THERE A WAY TO SET projects AND users AT A LEVEL OUTSIDE OF TimerSidebar? *****/ 
       self.$set(self, 'users', userObj); 
       self.$set(self, 'projects', projectObj); 
       self.$set(self, 'timers', timerArr); 
      }) 
     } 
    } 
}) 
var timerSidebar = new TimerSidebar({ 
    el: '#timer-sidebar', 
    data: { 
      timers: [], 
      projects: [], 
      users: [] 
    }, 
}) 
methods: { 

/***** HOW TO ONCLICK CALL updateTimers FROM OUTSIDE THE COMPONENT? *****/ 
     updateTimers: function(){ // ADD TIME RECORD FROM CLICK EVENT 
      var newTimers = this.timers; 
      newTimers.push({id: 166, project_id: 123, user_id: 1}); 
      newTimers.sort(function(timer1, timer2){ 
       if(timer1.id > timer2.id){ 
        return 1; 
       } else if(timer1.id < timer2.id){ 
        return -1; 
       } else { 
        return 0; 
       } 
      }); 
      this.timers = newTimers; 
     } 
    } 

답변

2

이 당신이 centralised state management가는되어야한다 표준 경우입니다. 여러 구성 요소에서 사용할 데이터가 있으므로 데이터 흐름이 부모에서 자식으로 한 방법으로 제한되는 경우 관리가 가능하지만 하위 변경시 상위 데이터를 업데이트해야하는 즉시 다른 형제가 그것을 바꿀 때 형제 데이터를 업데이트하면 더 나 빠지게됩니다.

Vue는 자신에게 Flux like implementation을 제공하지만 일반적인 관행은 vuex입니다. 이렇게하면 모든 프로젝트/사용자를 vuex state에 저장하고 각 구성 요소는 중앙 상태의 read/update 일 수 있습니다. 한 구성 요소에 의해 변경된 경우 업데이트 된 버전을 모든 구성 요소에서 반응 적으로 사용할 수 있습니다. vuex 자체에서 actions을 사용하여 한 곳에서 데이터를 시작할 수 있습니다. 당신은 비슷한 질문에 대한 내 대답 here에서 모양과 API를 호출하고 저장소에 데이터를 저장하는 방법에 대한 예를 살펴 가질 수

enter image description here

: 다음

아키텍처도이다.

관련 문제