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)
如果您稍后要<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)