繁体   English   中英

Vue JS 3:如何将数据从一个组件传递到另一个组件?

[英]Vue JS 3: How to pass data from one component to another other?

我正在尝试共享存储在Favorites.vue文件中的收藏夹组件中的变量favorite_count中的数据。 我想与App.vue文件中的 App 组件共享该数据,但我无法共享。 我希望如果我在“收藏夹”组件中更改favorite_count的值,它会在 App 组件中更改。 在网上做了很多研究,但还没有成功。 关于我可能做错了什么的任何想法?

Favorites.vue file

<template>
    <div class="row m-5">
        <h3 class="col-8">Your Favorites</h3>
        <div class="col-4">
            <p class="pull-right m-1">Picks 
            <span >{{ favorite_count }}</span>  / 5</p>
        </div>
        <hr>
    </div>
</template>
<script>
export default {
    name: 'favorites',
    data() {
        return {
            favorite_count: 5,
        }
    },
    methods: {
        changeFavoriteCount() { 
            this.favorite_count = this.favorite_count + 2;
        },
        emitToParent (event) {
          this.$emit('childToParent', this.favorite_count)
        }
    }
}
</script>

App.vue文件

<template>
    <div class="navbar navbar-expand-md navbar-dark bg-primary">
        <div class="collapse navbar-collapse" id="navbarResponsive">
            <ul class="navbar-nav"> 
                <li class="nav-item">
                    <router-link to="/favorites" class="btn btn-info">
                      Favorites ( {{ favorite_count }} )
                    </router-link>
                </li>
            </ul>
        </div>
    </div> 
</template>
<script> 
import Favorites from './components/Favorites.vue'
 
export default {
  name: 'App',
  components: {
    Favorites
  },
  data () {
    return { 
      favorite_count: 0, 
    }
  }
}
</script>

如果您打算稍后在应用程序中使用<router-view> ,我会建议使用此解决方案

如果你打算在App.vue <template>中包含Favorites ,你可以使用props

1.在父组件(App.vue)中声明你的'shared'变量

data () {
  return { 
    favorite_count: 0, 
  }
},

2.在你的子组件中定义 props (Favorites.vue)

export default {
  props: { favorite_count: Number },
  ...
}

3. 将favorite_count作为道具传递给Favorites

<template>
  ...
    <Favorites :favorite_count="favorite_count" ... />
</template>

如果您需要更新favorite_count - 向父组件发出一个事件。 Vue 文档中的更多信息

编辑:澄清一下:如果您要从Favorites.vue更新favorite_count ,您需要向App.vue发出一个事件以避免改变 props。

这也意味着您需要将您的changeFavoriteCount()函数移动到App.vue并将侦听器应用于您的子组件,它将调用此函数:

// App.vue
<template>
  ...
    <Favorites 
       @your-update-event="changeFavoriteCount" 
       :favorite_count="favorite_count" ...
    />
</template>

...

changeFavoriteCount(newVal) { 
    this.favorite_count = newVal;
},

像这样更改您的Favourite.vue文件

<template>
  <div class="row m-5">
    <h3 class="col-8">Your Favorites</h3>
    <div class="col-4">
      <p class="pull-right m-1">
        Picks <span>{{ favorite_count }}</span> / 5

        <button @click="changeFavoriteCount">Click me to change favorite_count</button>
      </p>
    </div>
    <hr />
  </div>
</template>
<script>
export default {
  name: "favorites",
  data() {
    return {
      favorite_count: 5,
    };
  },
  methods: {
    changeFavoriteCount() {
      this.favorite_count = this.favorite_count + 2;
      this.emitToParent();
    },
    emitToParent() {
      this.$emit("childToParent", this.favorite_count);
    },
  },
};
</script>

和这样的 App.vue 文件

<template>
    <div class="navbar navbar-expand-md navbar-dark bg-primary">
        <div class="collapse navbar-collapse" id="navbarResponsive">
            <ul class="navbar-nav"> 
                <li class="nav-item">
                    <router-link to="/favorites" class="btn btn-info">
                      
                      <Favorites @childToParent="updateFavorite" />
                      Favorites ( {{ favorite_count }} )
                    </router-link>
                </li>
            </ul>
        </div>
    </div> 
</template>
<script> 
import Favorites from './components/Favorites.vue'
 
export default {
  name: 'App',
  components: {
    Favorites
  },
  data () {
    return { 
      favorite_count: 0, 
    }
  },
  methods: {
    updateFavorite(data) {
      this.favorite_count = data;
    },
  },
}
</script>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM