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

3
我试图在“Favorites.vue”文件的Favorites组件中共享存储在变量“favorite_count”中的数据。我希望与“App.vue”文件中的App组件共享该数据,但是我做不到。如果我在Favorites组件中更改了“favorite_count”的值,我希望它也能在App组件中更改。我在网上做了一些研究,但还没有成功。有什么想法吗?
“Favorites.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</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>

你应该使用 Vuex。 - Lawrence Cherone
1
请看示例 https://codesandbox.io/s/nervous-tree-w0lq8,它可以避免使用变量污染所有内容。 - Lawrence Cherone
2个回答

9
如果您将在应用程序中稍后使用<router-view>,我建议此解决方案
如果您要在App.vue中的<template>中包含Favorites,则可以使用props
1. 在父组件(App.vue)中声明您的“共享”变量。
data () {
  return { 
    favorite_count: 0, 
  }
},

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

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

3.favorite_count 作为属性传递给 Favorites

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

如果您需要更新favorite_count,请向父组件发出事件。有关详细信息,请查看Vue文档

编辑:仅澄清:如果您要从更新favorite_count,则需要向发送一个事件以避免突变属性。

这也意味着您需要将changeFavoriteCount()函数移动到并对其子组件应用监听器,该监听器将调用此函数:

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

...

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

2
将您的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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接