Vue 3 Composition API:当值从父组件更新时动态更新子组件道具
Vue 3 Composition API: Update Child components props dynamically when values update from the parent component
当来自父组件的数据更新并通过 prop 时,我正在尝试更新 prop 值。当我向下传递父值时,父值总是更新但不会在子组件中更新或重新呈现。它在第一次访问子组件时传递给 prop,但在父组件中更新数据时不传递。
下面是父组件:
<script setup>
import { inject, watchEffect, ref } from "vue";
import ChildComponent from "@/components/ChildComponent.vue"
const { state } = inject("store");
const cart = ref(state.cart);
watchEffect(() => (cart.value = state.cart));
</script>
<template>
<ChildComponent
v-for="(item, index) in cart?.items"
:key="index"
:cartItem="item"
/>
</template>
下面是子组件(只在第一次加载时登录,不再加载):
<script setup>
import { ref, watchEffect } from "vue";
const { cartItem } = defineProps({
cartItem: !Object
});
const item = ref(cartItem);
watchEffect(() => {
console.log(item.value)
});
</script>
我尝试过以多种方式使用 Watch,但它无法检测到旧值或新值。它不记录任何输出
使用 watch 的示例子组件:
<script setup>
import { ref, watch } from "vue";
const { cartItem } = defineProps({
cartItem: !Object
});
const item = ref(cartItem);
watch(() => item.value, (oldValue, newValue) => {
console.log(oldValue)
console.log(newValue)
});
</script>
我遇到了同样的问题,这很令人沮丧,有时我不得不做一个解决方法来获得我需要的东西,但是在 子组件:
<script>
import { ref, watch } from "vue";
export default {
props: {
cartItem: {
type: !Object,
},
},
setup(props) {
const item = ref(null);
watch(props, () => {
item.value = props.cartItem;
});
return { item }
}
</script>
我最终通过使用 v-if 重新渲染子组件解决了这个问题。
<script setup>
import { inject, watchEffect, ref } from "vue";
import ChildComponent from "@/components/ChildComponent.vue"
const { state } = inject("store");
const cart = ref(state.cart);
const render = ref(true);
// Checks when the cart changes from the store
watchEffect(() => {
if(cart.value) {
render.value = true
}
else {
render.value = true
}
};
</script>
<template>
<div v-if="render">
<ChildComponent
v-for="(item, index) in cart?.items"
:key="index"
:cartItem="item"
/>
</div>
</template>
当来自父组件的数据更新并通过 prop 时,我正在尝试更新 prop 值。当我向下传递父值时,父值总是更新但不会在子组件中更新或重新呈现。它在第一次访问子组件时传递给 prop,但在父组件中更新数据时不传递。
下面是父组件:
<script setup>
import { inject, watchEffect, ref } from "vue";
import ChildComponent from "@/components/ChildComponent.vue"
const { state } = inject("store");
const cart = ref(state.cart);
watchEffect(() => (cart.value = state.cart));
</script>
<template>
<ChildComponent
v-for="(item, index) in cart?.items"
:key="index"
:cartItem="item"
/>
</template>
下面是子组件(只在第一次加载时登录,不再加载):
<script setup>
import { ref, watchEffect } from "vue";
const { cartItem } = defineProps({
cartItem: !Object
});
const item = ref(cartItem);
watchEffect(() => {
console.log(item.value)
});
</script>
我尝试过以多种方式使用 Watch,但它无法检测到旧值或新值。它不记录任何输出
使用 watch 的示例子组件:
<script setup>
import { ref, watch } from "vue";
const { cartItem } = defineProps({
cartItem: !Object
});
const item = ref(cartItem);
watch(() => item.value, (oldValue, newValue) => {
console.log(oldValue)
console.log(newValue)
});
</script>
我遇到了同样的问题,这很令人沮丧,有时我不得不做一个解决方法来获得我需要的东西,但是在 子组件:
<script>
import { ref, watch } from "vue";
export default {
props: {
cartItem: {
type: !Object,
},
},
setup(props) {
const item = ref(null);
watch(props, () => {
item.value = props.cartItem;
});
return { item }
}
</script>
我最终通过使用 v-if 重新渲染子组件解决了这个问题。
<script setup>
import { inject, watchEffect, ref } from "vue";
import ChildComponent from "@/components/ChildComponent.vue"
const { state } = inject("store");
const cart = ref(state.cart);
const render = ref(true);
// Checks when the cart changes from the store
watchEffect(() => {
if(cart.value) {
render.value = true
}
else {
render.value = true
}
};
</script>
<template>
<div v-if="render">
<ChildComponent
v-for="(item, index) in cart?.items"
:key="index"
:cartItem="item"
/>
</div>
</template>