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

Val*_*ine 3 javascript vue.js vuejs2 vuejs3

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

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

Che*_*tha 9

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

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

1.在父组件 (App.vue) 中声明您的“共享”变量

data () {
  return { 
    favorite_count: 0, 
  }
},
Run Code Online (Sandbox Code Playgroud)

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

export default {
  props: { favorite_count: Number },
  ...
}
Run Code Online (Sandbox Code Playgroud)

3.favorite_count作为 prop传递给Favorites

<template>
  ...
    <Favorites :favorite_count="favorite_count" ... />
</template>
Run Code Online (Sandbox Code Playgroud)

如果您需要更新favorite_count- 向父组件发出事件。更多关于它的信息请参见Vue 文档

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

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

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

...

changeFavoriteCount(newVal) { 
    this.favorite_count = newVal;
},
Run Code Online (Sandbox Code Playgroud)