经过长时间的实验,我找到了一个实用的解决方案:
项目文件结构:
src/
assets/
components/
Home.vue
App.vue
main.js
package.json
config.js
index.html
现在,我们要访问根组件 --App
子组件内的 vm 字段Home.vue
,使用vue-route
on。
主.js:
import Vue from 'vue'
import VueRouter from 'vue-router'
import App from './App'
Vue.use(VueRouter);
let router = new VueRouter();
router.map({
'/': {
name: 'home',
component: require('./components/Home')
}
});
router.start(App, 'body');
应用程序.vue:
<template>
<p>The current path: {{ $route.path }}.</p>
<p>Outer-Value: {{ outer_var }}</p>
<hr/>
<!-- The below line is very very important -->
<router-view :outer_var.sync="outer_var"></router-view>
</template>
<script>
import Home from './compnents/Home.vue'
export default {
replace: false,
components: { Home },
data: function() {
return {
outer_var: 'Outer Var Init Value.'
}
}
}
</script>
主页.vue
<template>
<div>
<p><input v-model="outer_var" /></p>
<p>Inner-Value: {{ outer_var }}</p>
</div>
</template>
<script>
export default {
// relating to the attribute define in outer <router-view> tag.
props: ['outer_var'],
data: function () {
return {
};
}
}
</script>
结论
请注意,内部道具将属性绑定在组件标签的属性上(<router-view>
在本例中为 Tag。),而不是直接在父组件上。
因此,我们必须手动将传递的 props 字段绑定为组件标签上的属性。见:http: //vuejs.org/guide/components.html#Passing-Data-with-Props
另外,请注意我.sync
在该属性上使用了 a ,因为默认情况下绑定是单向的:http: //vuejs.org/guide/components.html#Prop-Binding-Types
可以看到,通过嵌套组件共享状态有点混乱。为了更好地实践,我们可以使用Vuex。