![](/img/trans.png)
[英]Vuex & VueJS (Do not mutate vuex store state outside mutation handlers)
[英]Vuejs Vuex state overrides outside store without mutation or direct access to state
map() 中 Vuex 覆蓋的 State
預期行為 - 單擊觸發按鈕時始終count
為 1
當前的行為是每次單擊觸發按鈕時count
都在增加,如果我們查看控制台日志,我們可以看到getter
返回突變的 state
const store = new Vuex.Store({ state: { stuff: [{ count: 0 }] }, mutations: {}, getters: { stuff: s => s.stuff, } }) new Vue({ el: '#vue', store, data() { return { res: [] } }, methods: { trigger() { const stuff = this.$store.getters.stuff console.log(stuff) const res = stuff.map(p => { p.count += 1 return {...p } }) this.res = res } }, })
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script> <script src="https://unpkg.com/vuex@3.6.2/dist/vuex.js"></script> <div id="vue"> <div> <button @click=trigger()>Trigger</button> <pre>{{res}}</pre> </div> </div>
這是意料之中的。 Vuex 只是 JS 虛擬機內部的一個庫 - JS 的規則適用......
const stuff = this.$store.getters.stuff
- stuff
現在是對現有 object 的引用(本例中為數組)stuff.map()
迭代將每個項目作為p
參數傳遞的數組。 如果p
是 Object, p
是對 Vuex 內部 object 的引用 - 如果您修改它,您正在修改 Vuex 商店中的 object這很糟糕,為了確保安全,您可以將 Vuex 設置為在 Vuex 內部的數據被修改而不使用突變時拋出錯誤
const store = new Vuex.Store({
// ...
strict: process.env.NODE_ENV !== 'production'
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.