我试图使用ref将从道具中传递的项添加到vue-composition API属性中。但是,我不知道为什么没有将项添加到数组中。也许我用错了扩展操作符,或者我的实现是错误的,但是项目没有被添加。
vue-composition方法位于不同的文件中,它跨组件使用。
我正以这种方式将道具传递给产品组件:
<product
:id="12345667"
title="Pampers 9x Sensitive Baby Wet Wipes Filler, 576 Diaper Wipes"
price="14.59"
:rating="4"
image="https://images-na.ssl-images-amazon.com/images/I/41Yo4bc2uiL._AC_US160_.jpg"
>
</product>类似地,产品组件是setup,如下所示:
<template>
<div class="product">
<button type="button" @click="addToCart(item)">Add to Basket</button>
</div>
</template>
<script>
import { useCart } from "../js/ShoppingCart";
export default {
setup(props) {
let item = props;
const { addToCart } = useCart();
return { item, addToCart };
},
props: {
id: Number,
title: String,
image: String,
price: String,
rating: Number,
}
};
</script>ShoppingCart.js,我在这里使用@vue-composition-api
import { ref } from "@vue/composition-api";
export function useCart() {
let basket = ref([]);
const addToCart = async (item) => {
// eslint-disable-next-line no-debugger
debugger;
return {
...basket,
item,
};
};
console.log(JSON.stringify(basket));
return { basket, addToCart };
}我不知道我在哪里做错了,basket数组在从不同组件调用时总是空的。
最新问题:
<template>
<div class="home">
<img
class="home__image"
src="https://images-na.ssl-images-amazon.com/images/G/01/AmazonExports/Fuji/2020/May/Hero/Fuji_TallHero_45M_es_US_2x._CB432534552_.jpg"
/>
<div class="home__row">
<product
:id="12345667"
title="Pampers 9x Sensitive Baby Wet Wipes Filler, 576 Diaper Wipes"
price="14.59"
:rating="4"
image="https://images-na.ssl-images-amazon.com/images/I/41Yo4bc2uiL._AC_US160_.jpg"
>
</product>
<product
:id="12345667"
title="Pampers 9x Sensitive Baby Wet Wipes Filler, 576 Diaper Wipes"
price="14.59"
:rating="4"
image="https://images-na.ssl-images-amazon.com/images/I/41Yo4bc2uiL._AC_US160_.jpg"
>
</product>
{{ basket }}
basket length {{ basket.value ? basket.value.length : 0 }}
</div>
</div>
</template>
<script>
// @ is an alias to /src
import Product from "@/components/Product.vue";
import { useCart } from "../js/ShoppingCart";
export default {
setup() {
const { basket } = useCart();
return { basket };
},
name: "Home",
components: {
Product,
},
};
</script>发布于 2020-08-19 17:30:21
我没有看到任何地方,在那里,您实际上正在更新basket数组。
而且,您没有捕获返回的值,因此可以删除它,并且可能不需要async函数
您应该能够使用basket.value.push(item);
ShoppingCart.js
import { ref } from "@vue/composition-api";
export function useCart() {
let basket = ref([]);
const addToCart = (item) => {
basket.value.push(item);
};
return { basket, addToCart };
}如果您切换ref for reactive,则为reactive。
ShoppingCart.js
import { reactive } from "@vue/composition-api";
export function useCart() {
let basket = reactive([]);
const addToCart = (item) => {
basket.push(item);
};
return { basket, addToCart };
}更新1:
在模板中使用的是{{ basket.value ? basket.value.length : 0 }}
一个问题是,value是通过模板解决的,因此不应该在模板中使用它。
更新2:
看起来你在尝试使用useCart作为一个全球性的商店。它不起作用的原因是每次实例化useCart时都要创建一个新的存储
如果您像这样运行它,它将创建一个新实例:
import { ref } from "@vue/composition-api";
export function useCart() {
let basket = ref([]); // <--- new store, local to function
const addToCart = (item) => {
basket.value.push(item);
};
return { basket, addToCart };
}但是如果你把它更新到这个
import { ref } from "@vue/composition-api";
let basket = ref([]); // <--- same store, global
export function useCart() {
const addToCart = (item) => {
basket.value.push(item);
};
return { basket, addToCart };
}useCart()现在将重用相同的引用
更新3:
还没有经过测试,但是您可以尝试这样做,以避免Vue2中的错误。
import { ref, isRef } from "@vue/composition-api";
let basket;
export function useCart() {
if (! isRef(basket)) basket = ref([]);
const addToCart = (item) => {
basket.value.push(item);
};
return { basket, addToCart };
}https://stackoverflow.com/questions/63491408
复制相似问题