2017-12-19 25 views
1

Vuex의 기본 작업을 수행하려고하지만 어떤 이유로 작동하지 않으며 멀리서 검색 한 결과 크게 도움이됩니다. 객체의Vue2 + Vuex 커밋하지 않음 (Vue devtools 제외)

업데이트 목록 (개체) 내 가게에서 새 속성 (객체)로 : 나는을 할 노력하고있어 무엇

.

잘못 무엇을거야 : 나는 심지어 내 구성 요소에서 새 개체를 (내가 mapActions를 통해 작업을 접근하고있어) 커밋 할 작업을 파견하기 전에

, 목록에있는 기존 개체의 특정 속성이 업데이트 내 구성 요소의 입력/v- 모델에 연결된 값이 있습니다. 내 코드는 아래에서 볼 수 있듯이, 나는 물체 반응성이 문제가 알고, 그래서 ... 난 완전히 바보 같은 일을하고 있다고 생각 (하지만하지 않는 이유는 문서 (Mutations Follow Vue's Reactivity Rules)

Vue.set(...)을 사용하고 있습니다 아마도 잘못된 것입니다.)

DevTools에서 돌연변이를 확인하면 돌연변이가 예상대로 기록되고 "Commit"/ "Commit All"을 누르면 내 목록의 기존 객체가 더 이상 변경 사항에 응답하지 않습니다. 입력. 이것은 분명히 행동이 문자 그대로 국가에 변화를 저지른 것으로 가정 할 때 일어날 것으로 예상되는 행동입니다. 그럼에도 코드 내에서, 그리고 devtools 내에서만 작동하지 않는 이유는 무엇입니까? 아마 기본적인 문제가 무엇인지에 대해 다시 사과,하지만 난 유사한 문제와 우리가 무엇을 놓치고 있는지에 관한 서면 설명과 함께 몇 가지 다른 사람을 본 적이

...

초기 상태

const state = { 
    quotes: {} 
} 

돌연변이

mutations: { 
    [types.ADD_QUOTE] (state, payload) { 
    Vue.set(state.quotes, payload.id, payload) 
    } 
} 

액션

actions: { 
    addQuote ({ commit }, payload) { 
    commit(types.ADD_QUOTE, payload) 
    }  
} 

이 구성 요소

<template> 
    <div class="quote-block"> 
    <label>price</label> 
    <input type="text" v-model="quote.price"> 
    <label>id</label> 
    <input type="text" v-model="quote.id"> 
    <!-- Just displaying props below --> 
    <div>{{ quote.item }}</div> 
    <div>{{ quote.vendor }}</div> 
    <div>Qty: {{ quote.qty }}</div> 
    <button @click="addQuote(quote)">Submit quote</button> 
    </div> 
</template> 

<script> 
import { mapActions } from 'vuex' 

export default { 
    props: { 
    vendor: String, 
    item: String, 
    qty: Number 
    }, 
    data() { 
    return { 
     quote: { 
     id: '', 
     price: '', 
     timestamp: Date.now(), 
     vendor: this.vendor, 
     item: this.item, 
     qty: this.qty 
     } 
    } 
    }, 
    methods: { 
    ...mapActions([ 
     'addQuote' 
    ]) 
    } 
    } 

내가 idprice 내가 state.quotes로 설정 객체 내에서 변화에 대한 값을 참조는 DevTools로 내을 요약하면 - 그들은 분명히 묶여 구성 요소 내에서 quote.pricequote.id의 v- 모델로 devtools 내에서 "Commit All"을 사용하면 해당 객체의 속성이 변경되지 않습니다. 이 커밋을 수행하는 작업에 commit 메서드가없는 이유는 무엇입니까?

+0

다음은 동일한 기본 문제를 공유하지 않는 관련 질문입니다. https://stackoverflow.com/questions/42294030/vuex-commit-does-not-commit-to-store?rq=1 – pandycircus

+0

코드 여기는 완벽하게 잘 보인다. 그러나, 나는 잘못 이해하고있다. 그것은 다른 구성 요소에서 일어나고있는 것 같습니다. 무엇이 무엇으로 업데이트됩니까? – dube

+1

@ 감사합니다! 나는 당신의 코멘트를 알아 차리기 전에 요약을 넣었습니다. 가장 짧은 대답은 구성 요소의 입력 값이 무엇이든간에 상태가 변경된다는 것입니다. devtools 내의 "Commit All"만이 상태를 "잠그는"것처럼 보입니다. – pandycircus

답변

0

개체 참조 함정에 빠졌습니다. 견적은 페이로드로 동작에 전달되는 개체입니다. 페이로드를 커밋하면 참조이 사용자의 주에 안전합니다.

이제 구성 요소와 저장소가 같은 개체를 가리 킵니다.

이 솔루션은 하나 일반적으로 확산 운영자 또는 Object.assign

그것의 항상 뮤 테이터의 페이로드를 복사하는 것이 좋습니다으로, 새로운 객체로 입력을 복사하는 것입니다

function(state, payload){ 
    Vue.set(state.quotes, payload.id, {... payload }); 
} 
(이것은 객체 인 경우)
+0

나는 지금 이해한다 - 고마워! 그래서 나는 devtools 문서를 살펴볼 것입니다. 그러나 확산 연산자없이 돌연변이를 처리하는 유일한 이유는 "시간 이동"을 제공하기 위해 상태의 스냅 샷을 찍는 작업을 수행하고 있기 때문입니다. – pandycircus

+0

나는 그렇다고 생각한다. 엄격 모드 (개발 전용!)를 사용하면 예외가 발생합니다. 워드 프로세서보기 (미안, 전화 앱에서 링크 할 수 없음) – dube