Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从另一个Vue组件强制重新加载一个Vue组件_Javascript_Vuejs2_Vue Component - Fatal编程技术网

Javascript 如何从另一个Vue组件强制重新加载一个Vue组件

Javascript 如何从另一个Vue组件强制重新加载一个Vue组件,javascript,vuejs2,vue-component,Javascript,Vuejs2,Vue Component,我有一个购物篮,当我从一个应用程序中选择“添加到购物篮”时,我想让购物篮重新加载。当添加到篮子中时,我将此项目发布到api。篮子从这个api获取数据,并在篮子组件中呈现数据 我正在使用EventBus通知篮组件已添加了新项,但是在我的$on函数中,$forceUpdate()或发出另一个获取请求都不会使用新项重新呈现组件 这在我的项目组件中: methods: { submit(e){ e.preventDefault() let data = this.createBasketObje

我有一个购物篮,当我从一个应用程序中选择“添加到购物篮”时,我想让购物篮重新加载。当添加到篮子中时,我将此项目发布到api。篮子从这个api获取数据,并在篮子组件中呈现数据

我正在使用EventBus通知篮组件已添加了新项,但是在我的
$on
函数中,
$forceUpdate()
或发出另一个获取请求都不会使用新项重新呈现组件

这在我的项目组件中:

methods: {
submit(e){
  e.preventDefault()
  let data = this.createBasketObject(this.experience)
  fetch('http://localhost:3000/api/basket', {
    method: 'POST',
    body: JSON.stringify(data),
    headers: { 'Content-Type': 'application/json'}
  })
  .then( eventBus.$emit('basket-updated', true))
}
这是我的篮子里的一部分:

<template lang="html">
  <div class="">
    <h3>Basket</h3>
    <basket-item
      v-for="item in items"
      :key="item._id"
      :item="item"
    />
    <p>Total: £{{ total}}</p>
  </div>

篮子
总数:{Total}


从“./BasketItem.vue”导入BasketItem;
从“../main.js”导入{eventBus};
导出默认值{
名称:“篮子”,
数据(){
返回{
项目:[],
总数:0
}
},
组成部分:{
“篮子项目”:篮子项目
},
安装的(){
取('http://localhost:3000/api/basket')
.then(res=>res.json())
.然后(data=>this.items=data)
.then(items=>this.calcTotal(items))
eventBus.$on('basket-updated',(数据)=>{
如果(数据){
这是。$forceUpdate()
}
})
}
我基本上是在尝试像React中那样的设置状态,但是在刷新页面之前,篮框不会更新

我是否可以在Vue中不使用套接字之类的东西来执行此操作


谢谢

我认为如果您需要“与服务器的往返(将新项目发送到服务器,一些计算,在购物车更新后返回前端)”,您需要在添加的新项目上重新加载购物篮项目。 因此:将篮子负载放在一个单独的方法中,从mounted调用它,然后再次在basket updated事件中调用它: 这是最简短的回答:

LoadBasket() {
 fetch('http://localhost:3000/api/basket')
    .then(res => res.json())
    .then(data => this.items = data)
    .then(items => this.calcTotal(items));
}

mounted(){
  //The first time:
  this.LoadBasket();

  eventBus.$on('basket-updated', (data) => {
      if(data){
         //on basket updated
          this.LoadBasket();
      }
    });
}
请记住,数据是一个“反应”属性:如果它发生更改,则表示也将更新(如果需要,将tnx转换为VueJS中使用的虚拟dom):无需调用“刷新UI”方法

顺便说一下,如果只需要将刚创建的项目添加到项目列表中,则只需将其推送到数组中:

this.Items.push(newItem);

PS:我建议您在Vuex()上查看应用程序的状态管理:它稍微复杂一点,但允许更好地设计应用程序。

我认为,如果您需要与服务器的往返,您需要在添加的新项目上重新加载篮项目(将新项目发送到服务器,一些Calc,返回到前端,并更新购物车)“”。 因此:将篮子负载放在一个单独的方法中,从mounted调用它,然后再次在basket updated事件中调用它: 这是最简短的回答:

LoadBasket() {
 fetch('http://localhost:3000/api/basket')
    .then(res => res.json())
    .then(data => this.items = data)
    .then(items => this.calcTotal(items));
}

mounted(){
  //The first time:
  this.LoadBasket();

  eventBus.$on('basket-updated', (data) => {
      if(data){
         //on basket updated
          this.LoadBasket();
      }
    });
}
请记住,数据是一个“反应”属性:如果它发生更改,则表示也将更新(如果需要,将tnx转换为VueJS中使用的虚拟dom):无需调用“刷新UI”方法

顺便说一下,如果只需要将刚创建的项目添加到项目列表中,则只需将其推送到数组中:

this.Items.push(newItem);

PS:我建议您看看Vuex()对于应用程序的状态管理:它稍微复杂一点,但允许对应用程序进行更好的设计。

谢谢。我尝试了类似loadbasket的功能,但在加载页面时没有反应。我一次只添加一个项目,因此传递该项目并将其推送到项目数据中。谢谢。我尝试了类似loadbasket的功能,但在加载页面时没有反应。我一次只添加一个项目,尽管如此,将该项目传递并将其推入项目数据工作。