Vue.js VueJS:在没有集中存储(vuex或eventBus)的情况下直接访问子级(使用vue路由器)时访问子级中的父级属性
在这种情况下,父Vue.js VueJS:在没有集中存储(vuex或eventBus)的情况下直接访问子级(使用vue路由器)时访问子级中的父级属性,vue.js,vuejs2,vue-router,Vue.js,Vuejs2,Vue Router,在这种情况下,父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
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>
<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>
<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>
<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>
从“/components/common/appHeader”导入appHeader;
导出默认值{
名称:“应用程序”,
组成部分:{
appHeader
}
};
appHeader.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>
<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>
<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>
<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>
家
添加项
Home.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>
<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>
<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>
<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>
水果清单
- {{{fruit}
从“/addItem”导入addItem;
导出默认值{
名称:“应用程序”,
数据(){
返回{
水果:[“苹果”、“芒果”、“橙子”、“菠萝”]
};
},
组成部分:{
增加列表项
}
};
附加项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>
<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>
<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>
<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>
输入水果名称:
加水果
导出默认值{
数据(){
返回{
项目:“
};
},
道具:[“水果沙尔”],
方法:{
addFruit(){
this.frutsarr.push(this.frutsitem);
}
},
};
问题是,当使用路由器链接(vue路由器)直接访问孩子时,家长的道具:fruitsArr=“fruits”
不可用
任何好友都可以告诉我,当当前路径为子路径时,如何或以正确的方式将父路径的道具传递给子路径,以便子路径能够将道具添加到父路径的列表中。我更喜欢不使用VueX或任何其他集中式存储(如eventBus)的解决方案
谢谢有几种解决方案
提供/注入
可以使用“提供/注入”沿子层次结构发送数据。如果只需要在单个父子分支上进行通信,并且您不想使用Vuex
,则建议使用此方法将数据从父分支共享给非直接子分支
元域
您可以将项目存储在路由的元字段中,并在导航保护中对其进行初始化。然后它在所有组件中都可用
话虽如此,Vue
的方法是向上发出事件,向下接收属性,因此,如果您的用例允许,请尝试使用该体系结构。Steven Spungin的答案很好。但您应考虑到提供/注入数据不是被动的
const myStore = new Vue({
data:{
fruits: ["Apple", "Mango", "Orange", "PineApple"]
}
})
export myStore;
也就是说,你需要做一些集中的“真相来源”。
如果您不想使用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;
}
}
....