2015-12-30 41 views
39

我很努力地理解如何在vue.js中的组件之间传递数据。我已经多次阅读文档并查看了许多与vue相关的问题和教程,但我仍然没有得到它。将数据传递给vue.js中的组件

要总结我解决这个头,我希望帮助完成一个非常简单的例子

  1. 显示用户的列表中一个组件(完成)
  2. 用户数据发送到一个新的组件时,点击链接(完成) - 请参阅底部的更新。
  3. 编辑用户数据,并发送回原来的组件(还没有得到这一步)

这里是一个小提琴,从而未能在步骤二:https://jsfiddle.net/retrogradeMT/d1a8hps0/

我明白,我需要使用道具将数据传递给新组件,但我不确定如何在功能上做到这一点。我如何将数据绑定到新组件?

HTML:

<div id="page-content"> 
     <router-view></router-view> 
    </div> 

<template id="userBlock" > 
    <ul> 
    <li v-for="user in users">{{user.name}} - <a v-link="{ path: '/new' }"> Show new component</a> 
    </li> 
    </ul> 
</template> 

    <template id="newtemp" :name ="{{user.name}}"> 
    <form> 
     <label>Name: </label><input v-model="name"> 
     <input type="submit" value="Submit"> 
    </form> 
    </template> 

JS为主要成分:

Vue.component('app-page', { 
    template: '#userBlock', 

    data: function() { 
    return{ 

     users: [] 
     } 
    }, 

ready: function() { 
    this.fetchUsers(); 
}, 

methods: { 
    fetchUsers: function(){ 
     var users = [ 
      { 
      id: 1, 
      name: 'tom' 
      }, 
      { 
      id: 2, 
      name: 'brian' 
      }, 
      { 
      id: 3, 
      name: 'sam' 
      }, 
     ]; 

     this.$set('users', users); 
    } 
    } 
    }) 

JS为第二组分:

Vue.component('newtemp', { 
    template: '#newtemp', 
    props: 'name', 
    data: function() { 
    return { 
     name: name, 
     } 
    }, 
}) 

UPDATE

好的,我已经弄清楚了第二步。这里是一个新的小提琴展示进展:https://jsfiddle.net/retrogradeMT/9pffnmjp/

因为我使用Vue路由器,我不使用道具发送数据到一个新的组件。相反,我需要在v-link上设置参数,然后使用转换钩来接受它。

V-LINK改变see named routes in vue-router docs

<a v-link="{ name: 'new', params: { name: user.name }}"> Show new component</a> 

然后在组件上,将数据添加到路由选项see transition hooks

Vue.component('newtemp', { 
    template: '#newtemp', 
    route: { 
    data: function(transition) { 
     transition.next({ 
      // saving the id which is passed in url 
      name: transition.to.params.name 
     }); 
    } 
    }, 
data: function() { 
    return { 
     name:name, 
     } 
    }, 
}) 

回答

26

-------------继才Vue公司是适用1点--------------

传递的数据可以通过多种方式来完成。该方法取决于使用的类型。


如果您想在添加新组件时从您的html传递数据。这是使用道具完成的。只有当你添加道具名称prop-nameprops属性

<my-component prop-name="value"></my-component> 

此道具值将提供给您的组件。


当数据由于某些动态或静态事件而从组件传递到另一个组件时。这是通过使用事件调度员和广播员完成的。因此,举例来说,如果你有一个组件结构是这样的:

<my-parent> 
    <my-child-A></my-child-A> 
    <my-child-B></my-child-B> 
</my-parent> 

而且要从<my-child-A>数据发送到<my-child-B>然后<my-child-A>你将不得不分派事件:

this.$dispatch('event_name', data); 

此事件一路走上母链。从任何一位家长你有一个分支<my-child-B>您随着数据广播事件。所以在父母:

events:{ 
    'event_name' : function(data){ 
     this.$broadcast('event_name', data); 
    }, 

现在这个广播将沿着儿童链。而在任何一个孩子,你要抢的情况下,在我们的例子<my-child-B>我们将添加另一个事件:

events: { 
    'event_name' : function(data){ 
     // Your code. 
    }, 
}, 

第三种方式来传递数据是通过V-链接参数。当组件链被完全销毁或者当URI改变时,这个方法被使用。我可以看到你已经了解他们。


决定您想要什么类型的数据通信,并进行适当的选择。

+0

谢谢,这真的很有帮助。唯一我仍在努力的是命名约定。即:我有通过v链接作为名称传递的user.name。我现在可以编辑名称变量并将其作为名称传回原始组件,但原始组件没有名为var的变量。我在这里错过了什么?不可能通过v-link传递一个对象? – retrograde

+0

您已经传递了一个对象。 “params”是一个对象。名称密钥可以分配给组件中的this.user.name。如果你需要帮助,创建一个小提琴,并让我知道。检查了这一点:http://vuejs.github.io/vue-router/en/route.html – notANerdDev

+0

啊,好吧,我已经得到它。再次感谢。我感谢你的帮助,它让事情变得更加清晰。 – retrograde

8

我认为这个问题是在这里:

<template id="newtemp" :name ="{{user.name}}"> 

当你用:作为道具的前缀时,你是指示对Vue说,它是一个变量,而不是一个字符串。所以你不需要{{}}user.name。尝试:

<template id="newtemp" :name ="user.name"> 

编辑-----

以上是真实的,但这里的更大的问题是,当你更改URL,去一个新的路线,原来的分量消失。为了让第二个组件编辑父数据,第二个组件需要是第一个组件的子组件,或者只是同一个组件的一部分。

+0

谢谢杰夫。我试图删除{{}},但我仍然得到相同的错误。 – retrograde

2

我发现一种方法可以将父数据传递给Vue中的组件范围,我认为这有点破解,但也许这会帮助你。作为外部对象在Vue的实例

1)参考的数据(数据:dataObj)

2)然后在子组件中的数据返回功能只是返回parentScope = dataObj瞧。现在你不能做像{{parentScope.prop}}这样的事情,并且会像魅力一样工作。

祝你好运!

+0

这就是说,将两个组件连接在一起对树和它的节点可以是可以的,但通常不受欢迎。 我会尽量避免这种情况。 – dec

0

将数据从父组件发送给孩子的最佳方式是使用props

经由props

  • 从父传递数据到子声明props在子(阵列或object
  • 经由<child :name="variableOnParent">

它传递给孩子观看演示下面:

Vue.component('child-comp', { 
 
    props: ['message'], // declare the props 
 
    template: '<p>At child-comp, using props in the template: {{ message }}</p>', 
 
    mounted: function() { 
 
    console.log('The props are also available in JS:', this.message); 
 
    } 
 
}) 
 

 
new Vue({ 
 
    el: '#app', 
 
    data: { 
 
    variableAtParent: 'DATA FROM PARENT!' 
 
    } 
 
})
<script src="https://unpkg.com/[email protected]/dist/vue.min.js"></script> 
 

 
<div id="app"> 
 
    <p>At Parent: {{ variableAtParent }}</p> 
 
    <child-comp :message="variableAtParent"></child-comp> 
 
</div>