将Vue组件数据绑定到外部状态

时间:2017-04-21 12:12:52

标签: javascript ajax vue.js vuejs2 vue-component

我有一个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>

这样做有什么最好的做法,还是我目前最好的方法?

1 个答案:

答案 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>