我有一个Vue组件,需要在几个地方嵌入到大型遗留(不是Vue)系统中。 该组件根据数据库记录ID数组生成一些AJAX请求并显示信息,它通常在页面加载时接收。该数组由服务器直接嵌入到页面模板中,并作为props传递给组件,如下所示:
X display required
我的问题是,在其中一个需要嵌入的屏幕上,用户可以使用搜索和添加类型的AJAX界面动态选择数据库记录(而不是在页面加载时预先设置) ,所以我需要让组件与用户的选择保持同步,以便可以根据需要重新渲染。
我有一个有效的解决方案,但它远非理想;每当用户对其选择进行一些更改时,我正在直接调用组件上的方法,传递新的选择,以便组件可以更新自己的内部副本:
let config = {
records: {{ template_code_outputting_array }},
...otherConfigOptions
}
let app = new Vue({
el: '#app',
store,
render: h => h(ComponentName, {
props: config
})
})
但显然这不是反应性的,而且感觉有点像hacky。我觉得我不应该直接寻址一个组件,而我所调用的功能仅供外部使用;组件内部没有任何东西使用它。
我已经尝试将 data 中的值绑定到全局变量(这也不是理想但我没有太多选择)然后添加 watch 方法在变化时触发重新渲染。显然标量值不起作用,因为它们是按值而不是引用,但将它们包装在对象中似乎也不起作用。它们绑定精细并获取提供的初始值,但更新对象(直接改变其值或用新的替换对象)似乎不会触发 watch 方法或任何反应。 / p>
这样做有什么最好的做法,还是我目前最好的方法?
答案 0 :(得分:3)
事件总线(由AfikDeri在评论中建议)是一个很好的解决方案。它提供了一个简单的界面。
还可以对您的数据进行反应,with some caveats。用于初始化数据项的对象本身将被激活。如果更改数组do so in the approved ways的内容,您应该会在Vue中看到更改。
let stuff = [2, 3, 5];
const v = new Vue({
el: '#app',
data: {
reactiveStuff: stuff
},
components: {
myComponent: {
props: ['arr'],
template: '<div><div v-for="item in arr">{{item}}</div></div>'
}
}
});
setTimeout(() => {
stuff.push(7);
}, 1200);
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.2.6/vue.min.js"></script>
<my-component id="app" :arr="reactiveStuff">
</my-component>