- 具体应用场景是这样子的,我在
app.vue
中有个路由,这个路由会加载c.vue
,m来自c.vue
,如何把m传给app.vue,我想在app.vue中监听m的变化如何做?就是c.vue中的m值变化,app.vue中也会跟着变化。
<router-link>{{m}}<router-link>
我查到可以用emit
触发,但是emit父组件中貌似是要有事件的,如何让c.vue
中m变化实时传给app.vue
.
app.vue
中有个路由,这个路由会加载c.vue
,m来自c.vue
,如何把m传给app.vue,我想在app.vue中监听m的变化如何做?就是c.vue中的m值变化,app.vue中也会跟着变化。<router-link>{{m}}<router-link>
我查到可以用emit
触发,但是emit父组件中貌似是要有事件的,如何让c.vue
中m变化实时传给app.vue
.
你的问题可以分成两个点:1. 怎么监听一个值的变化; 2. 怎么从子组件向父组件发送一个值;
this.emit
向上传值可以参照下面我打过的例子:
<div id="app">
<p>{{total}}</p>
<button-counter @click="incrementTotal"></button-counter>
<button-counter @click="incrementTotal"></button-counter>
</div>
<script src="https://unpkg.com/vue"></script>
<script type="text/javascript">
Vue.component('button-counter', {
template: '<button @click="incrementCounter">{{counter}}</button>',
data: function () {
return {
counter: 0
}
},
methods: {
incrementCounter: function () {
this.counter += 1
this.$emit('click')
}
}
})
new Vue({
el: '#app',
data: {
total: 0
},
methods: {
incrementTotal: function () {
this.total += 1
}
}
})
vuex
用vuex
话比较简单,你只要声明一个state
状态树,mutations
以及getters
。state
用来存储全局状态,mutations
用来设置state
,getters
用来获取state
这样在子组件向父组件传值的话只需要设置相应的state
,在父组件就可以直接获取了,如果要监听变化的话最好在父组件再加一个computed
属性
以上
你应该在app.vue传递一个对象过去,c.vue用props接受,然后c.vue改变了app.vue会同步变化的,注意是对象之间引用,不要直接改变值。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>/title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<style>
</style>
<script src="vue.js"></script>
<script>
window.onload=function(){
new Vue({
el:'#box',
data:{
giveData:{
a:'我是父组件数据'
}
},
components:{
'child-com':{
props:['msg'],
template:'#child',
methods:{
change(){
//this.msg='被更改了' 不要这样做
this.msg.a='被改了'; //传递的是msg,要改变msg.a才能同步
}
}
}
}
});
};
</script>
</head>
<body>
<template id="child">
<div>
<span>我是子组件</span>
<input type="button" value="按钮" @click="change">
<strong>{{msg.a}}</strong>
</div>
</template>
<div id="box">
父级: ->{{giveData.a}}
<br>
<child-com :msg="giveData"></child-com>
</div>
</body>
</html>
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答4.7k 阅读✓ 已解决
4 回答4.3k 阅读✓ 已解决
4 回答1.9k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
用vuex试试。
或者弄个 bus,用 bus.$emit bus.$on