在此codesandbox demo中,父home
组件有一个子addItem
组件。父级的传递数组(作为道具)传递给孩子,因此子级能够将项目添加到父级列表,即从父级->子级(即通过道具:fruitsArr="fruits"
传递数据的正常方式)。
Main.js
import Vue from "vue";
import VueRouter from "vue-router";
import App from "./App.vue";
import Home from "./components/Home.vue";
import addItem from "./components/addItem.vue";
Vue.use(VueRouter);
var router = new VueRouter({
mode: "history",
routes: [
{ path: "", component: Home, name: "Home" },
{
path: "/addItem",
component: addItem,
name: "Add Item"
}
]
});
Vue.config.productionTip = false;
new Vue({
router,
render: h => h(App)
}).$mount("#app");
App.vue
<template>
<div id="app">
<app-header></app-header>
<br>
<router-view></router-view>
</div>
</template>
<script>
import appHeader from "./components/common/appHeader";
export default {
name: "App",
components: {
appHeader
}
};
</script>
appHeader.vue
<template>
<ul class="nav nav-pills">
<router-link tag="li" to="/" active-class="active" exact>
<a>Home</a>
</router-link>
<router-link tag="li" to="/addItem" active-class="active">
<a>Add Item</a>
</router-link>
</ul>
</template>
Home.vue
<template>
<div>
<addItem :fruitsArr="fruits"/>
<h3>Fruits List</h3>
<ul>
<li v-for="(fruit, idx) in fruits" :key="idx">{{fruit}}</li>
</ul>
</div>
</template>
<script>
import addItem from "./addItem";
export default {
name: "App",
data() {
return {
fruits: ["Apple", "Mango", "Orange", "PineApple"]
};
},
components: {
addItem
}
};
</script>
addItem.vue
<template>
<div class="input-wrapper">
Enter Fruit Name:
<input type="text" v-model="fruitItem">
<button @click="addFruit">Add Fruit</button>
</div>
</template>
<script>
export default {
data() {
return {
fruitItem: ""
};
},
props: ["fruitsArr"],
methods: {
addFruit() {
this.fruitsArr.push(this.fruitItem);
}
},
};
</script>
问题是当使用router-link
(vue-router)直接访问孩子时,父母的道具:fruitsArr="fruits"
不可用。
当当前路线是孩子时,任何伙伴都可以告诉我如何或正确的方法将父母的道具传递给孩子,以便孩子能够将项目添加到父母的列表中。我更喜欢不使用VueX或任何其他集中存储(例如eventBus)的解决方案。
谢谢
答案 0 :(得分:0)
有两种解决方案。
您可以使用提供/注入沿子层次结构发送数据。当仅需要在单个parent to non-immediate child
上进行通信且您不想使用parent-child branch
时,这是从Vuex
共享数据的推荐方法。
https://vuejs.org/v2/api/#provide-inject
您可以将项目存储在路线的meta字段中,并在导航保护中对其进行初始化。然后在所有组件中都可用。
https://router.vuejs.org/guide/advanced/navigation-guards.html
const router = new VueRouter({
routes: [
{
path: '/foo',
component: Foo,
children: [
{
path: 'bar',
component: Bar,
// a meta field
meta: { requiresAuth: true }
}
]
}
]
})
话虽这么说,Vue
的方式是分别到emit events up
和receive properties down
,所以如果您的用例允许,请尝试使用该体系结构。
答案 1 :(得分:0)
史蒂芬·斯潘金(Steven Spungin)的回答很好。但是您应考虑到提供/注入数据不是被动的。
话虽如此-您需要建立某种集中式的“真理来源”。 如果您不想使用Vuex,最简单的解决方案是声明另一个Vue实例,并将全局数据存储在那里。 这将是反应性的。const myStore = new Vue({
data:{
fruits: ["Apple", "Mango", "Orange", "PineApple"]
}
})
export myStore;
以及您的组件中
import {myStore} from 'somewhere';
//to use prop in your template - proxy it using computed prop
....
computed:{
fruits(){
return myStore.fruits;
}
}
....