首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从vue组合API向Array添加item对象

从vue组合API向Array添加item对象
EN

Stack Overflow用户
提问于 2020-08-19 16:40:11
回答 1查看 7.2K关注 0票数 1

我试图使用ref将从道具中传递的项添加到vue-composition API属性中。但是,我不知道为什么没有将项添加到数组中。也许我用错了扩展操作符,或者我的实现是错误的,但是项目没有被添加。

vue-composition方法位于不同的文件中,它跨组件使用。

我正以这种方式将道具传递给产品组件:

代码语言:javascript
复制
 <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,如下所示:

代码语言:javascript
复制
   <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

代码语言:javascript
复制
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数组在从不同组件调用时总是空的。

最新问题:

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

发布于 2020-08-19 17:30:21

我没有看到任何地方,在那里,您实际上正在更新basket数组。

而且,您没有捕获返回的值,因此可以删除它,并且可能不需要async函数

您应该能够使用basket.value.push(item);

ShoppingCart.js

代码语言:javascript
复制
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

代码语言:javascript
复制
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时都要创建一个新的存储

如果您像这样运行它,它将创建一个新实例:

代码语言:javascript
复制
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 };
}

但是如果你把它更新到这个

代码语言:javascript
复制
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中的错误。

代码语言:javascript
复制
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 };
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63491408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档