将数据从一个 Vue.js 实例输出到另一个
Output data from one Vue.js instance into another
我有一个很大的页面,其中包含很多内容。所以我有 2 个 Vue 实例用于页面的 2 个部分。如何将数据从一个 Vue 实例绑定到另一个实例?
这个例子应该展示我正在尝试做的事情。 (这样不行)
<div class="app1">...</div>
...
<div class="app2">{{app1.$data.msg}}</div>
var app1 = new Vue({
el: '.app1',
data: {msg: "test"}
});
var app2 = new Vue({
el: '.app2'
});
我仍在寻找最佳解决方案。以下感觉有点hacky,但它有效。
您可以使用watch option来监听表达式的变化并触发函数。在此函数中,您可以更新另一个 Vue 实例的所需数据。在你的例子中,我们会这样做:
var app1 = new Vue({
el: '.app1',
data: {msg: 'test'},
watch: {
'msg': function() { app2.msg = this.msg; }
}
});
var app2 = new Vue({
el: '.app2',
data: { msg: app1.$data.msg },
watch: {
'msg': function() { app1.msg = this.msg; }
}
});
您可以在 this jsbin 中看到这一点。
此外,我想知道您是否需要这样做。如果这是现实生活中的情况,可能会有更好的方法来避免这种 hacky 解决方案。
事先,我知道这不是你要问的问题,但我不知道你为什么需要两个 Vue 实例。为什么不直接将 Vue 绑定到 body
并将两个 Vue 实例都视为组件。做你想做的事情可能很困难,因为它不是有意的。也许是,我不知道。我已经在 body 上设置了 Vue,但我没有看到性能受到影响。这是一个JSBin.
HTML
<div class="container">
<div id="app1">
<h1>{{ msg }}</h1>
<input type="text" v-model="msg" class="form-control"/>
</div>
<div id="app2">
<h1>{{ msg }}</h1>
<input type="text" v-model="msg" class="form-control"/>
</div>
</div>
JavaScript
var VueComponent1 = Vue.extend({
template: '#app1',
data: function(){
return {
msg: ""
}
}
});
var VueComponent2 = Vue.extend({
template: '#app2',
data: function(){
return {
msg: ""
}
}
});
var app1 = Vue.component('app1', VueComponent1);
var app2 = Vue.component('app2', VueComponent2);
var app = new Vue({
el: 'body',
data: { msg: 'Everybody loves Vue.' }
});
如果您正在寻找一种更好的方法来分离您的代码,您可能需要查看此 Vue with Browserify example。
Laracasts has a free series 在 Vue 上也提供了很多信息。
我有一个很大的页面,其中包含很多内容。所以我有 2 个 Vue 实例用于页面的 2 个部分。如何将数据从一个 Vue 实例绑定到另一个实例?
这个例子应该展示我正在尝试做的事情。 (这样不行)
<div class="app1">...</div>
...
<div class="app2">{{app1.$data.msg}}</div>
var app1 = new Vue({
el: '.app1',
data: {msg: "test"}
});
var app2 = new Vue({
el: '.app2'
});
我仍在寻找最佳解决方案。以下感觉有点hacky,但它有效。
您可以使用watch option来监听表达式的变化并触发函数。在此函数中,您可以更新另一个 Vue 实例的所需数据。在你的例子中,我们会这样做:
var app1 = new Vue({
el: '.app1',
data: {msg: 'test'},
watch: {
'msg': function() { app2.msg = this.msg; }
}
});
var app2 = new Vue({
el: '.app2',
data: { msg: app1.$data.msg },
watch: {
'msg': function() { app1.msg = this.msg; }
}
});
您可以在 this jsbin 中看到这一点。
此外,我想知道您是否需要这样做。如果这是现实生活中的情况,可能会有更好的方法来避免这种 hacky 解决方案。
事先,我知道这不是你要问的问题,但我不知道你为什么需要两个 Vue 实例。为什么不直接将 Vue 绑定到 body
并将两个 Vue 实例都视为组件。做你想做的事情可能很困难,因为它不是有意的。也许是,我不知道。我已经在 body 上设置了 Vue,但我没有看到性能受到影响。这是一个JSBin.
HTML
<div class="container">
<div id="app1">
<h1>{{ msg }}</h1>
<input type="text" v-model="msg" class="form-control"/>
</div>
<div id="app2">
<h1>{{ msg }}</h1>
<input type="text" v-model="msg" class="form-control"/>
</div>
</div>
JavaScript
var VueComponent1 = Vue.extend({
template: '#app1',
data: function(){
return {
msg: ""
}
}
});
var VueComponent2 = Vue.extend({
template: '#app2',
data: function(){
return {
msg: ""
}
}
});
var app1 = Vue.component('app1', VueComponent1);
var app2 = Vue.component('app2', VueComponent2);
var app = new Vue({
el: 'body',
data: { msg: 'Everybody loves Vue.' }
});
如果您正在寻找一种更好的方法来分离您的代码,您可能需要查看此 Vue with Browserify example。
Laracasts has a free series 在 Vue 上也提供了很多信息。