【发布时间】:2022-12-07 12:10:48
【问题描述】:
我有一个组件保留 Pinia 存储数据的本地部分副本。
<template>
<h3>Order idx {{ idx }}: sum = {{ localSum }}, store sum = {{ getOrderSum() }}</h3>
<input type="number" v-model="localSum" />
<button @click="updateSum">Save</button>
</template>
<script setup>
import { useCounterStore } from '../store/counter'
import { watchEffect, ref, defineProps, watch } from 'vue'
const props = defineProps({
idx: 0
})
const store = useCounterStore()
const localSum = ref(0)
function getOrderSum() {
return store.getOrderIdxSumMap[props.idx]
}
function updateSum() {
store.setOrderSum(props.idx, localSum.value)
}
watch(
() => getOrderSum(),
(newValue) => {
console.log('i am updated')
localSum.value = newValue
}, {
immediate: true,
}
)
/*
watchEffect(() => {
console.log('i am updated')
localSum.value = getOrderSum()
})
*/
</script>
每当外部数据更改时,本地副本都应更新。使用 watchEffect 而不是 watch 会导致具有已修改和未保存数据的组件丢失用户输入。
watchEffect行为描述1:
- 更改一阶数据
- 点击保存
- 您将在控制台中看到两次
i am updated。watchEffect行为描述2:- 更改首单数据
- 更改二阶数据
- 在第一个订单上点击保存
- 您会看到第二个订单更改丢失
注释掉
watchEffect并取消注释watch。现在一切正常。是我的误解还是值得报告的错误?
【问题讨论】: