gpt4 book ai didi

javascript - Immer数据未在Vue中更新

转载 作者:行者123 更新时间:2023-12-03 06:43:54 26 4
gpt4 key购买 nike

我正在尝试将Immer与Vue一起使用。看来状态正在更新,但Vue并未更新UI

// immutable.js
import produce, { applyPatches } from "immer"

let undo_buffer = []
export var state = { items: [] }
const handle_add_patch = (patch, inverse_patches) => {
console.log("Inverse Patches: ", inverse_patches)
undo_buffer.push(inverse_patches)
}
export const add_item = (item_name) => {
console.log("Starting add_item call")
const next_state = produce(
state,
draft => {
draft.items.push({ name: item_name })
},
handle_add_patch
)
console.log("next state: ", next_state)
state = next_state
}
export const undo = () => {
const undo_patch = undo_buffer.pop()
if (!undo_patch) return
let new_state = applyPatches(state, undo_patch)
console.log("New State: ", new_state)
state = new_state
}

<!-- item_list.Vue -->
<template>
<div>
<button @click.prevent="add_item()">Add Item</button>
{{ items }}
<button @click.prevent="undo()">Undo</button>
</div>
</template>
<script>
import * as immutable from './immutable.js'
export default {
computed: {
items: function(){ return immutable.state.items }
},
methods: {
add_item(){
console.log("State Before: ", immutable.state)
immutable.add_item("Hello")
console.log("State After: ", immutable.state)
},
undo(){
console.log("State Before: ", immutable.state)
immutable.undo()
console.log("State After: ", immutable.state)
}
}
}
</script>

console.log显示items数组正在更改,但是Vue模板中的item只显示一个空数组。如何在Vue中显示此内容?

最佳答案

计算的属性将被缓存,直到更改了相关的组件数据后才重新计算它们。由于Immer对象不是组件的一部分,因此永远不会进行重新计算。

可以通过使用getter方法而非计算的属性来防止缓存:

{{ getItems() }}

...

methods: {
getItems: () => immutable.state.items
addItem() {
immutable.add_item("Hello");
this.$forceUpdate();
}
}

一种更直接的方法是强制重新计算属性:
data() {
return { _itemsDirtyFlag: 0 }
},
computed: {
items: {
get() {
this._itemsDirtyFlag; // associate it with this computed property
return immutable.state.items;
}
},
methods: {
updateItems() {
this._itemsDirtyFlag++;
},
addItem() {
immutable.add_item("Hello");
this.updateItems();
}
}

Vue.util.defineReactive 使用类似的使用 vue-recomputed内部方法。

关于javascript - Immer数据未在Vue中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60058783/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com