将数据传递给vue.js中的组件
我正在努力了解如何在vue.js中的组件之间传递数据。 我已经多次阅读文档,看了很多与vue相关的问题和教程,但是我仍然没有得到它。
为了包围我的头,我希望帮助完成一个非常简单的例子
- 显示一个组件中的用户列表(完成)
- 当点击链接(完成)时,将用户数据发送到新组件 – 请参阅底部的更新。
- 编辑用户数据并将其发送回原始组件(还没有到此为止)
这是一个小提琴,第二步失败: https : //jsfiddle.net/retrogradeMT/d1a8hps0/
我明白,我需要使用道具来传递数据到新的组件,但我不知道如何在function上做到这一点。 如何将数据绑定到新组件?
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
好的,我已经find了第二步。 这是一个新的小提琴展示进展: https : //jsfiddle.net/retrogradeMT/9pffnmjp/
因为我正在使用Vue路由器,所以我不使用道具将数据发送到新组件。 相反,我需要在v-link上设置参数,然后使用转换钩来接受它。
V-link更改请参阅vue-router文档中的命名路由 :
<a v-link="{ name: 'new', params: { name: user.name }}"> Show new component</a>
然后在组件上,将数据添加到path选项中, 参见转换钩子 :
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, } }, })
————-以下仅适用于Vue 1 ————–
传递数据可以通过多种方式完成。 该方法取决于使用的types。
如果您想在添加新组件时从您的html传递数据。 这是使用道具完成的。
<my-component prop-name="value"></my-component>
只有在您的props
属性中添加了道具名称prop-name
,这个道具值才可用于您的组件。
当数据由于某些dynamic或静态事件而从组件传递到另一个组件时。 这是通过使用事件调度员和广播员完成的。 所以举个例子,如果你有这样的组件结构:
<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改变时,这个方法被使用。 我可以看到你已经了解他们。
决定你想要什么types的数据通信,并适当地select。
我认为这个问题在这里:
<template id="newtemp" :name ="{{user.name}}">
当你在prop前加上:
你正在向Vue表明它是一个variables,而不是一个string。 所以你不需要user.name
周围的{{}}
。 尝试:
<template id="newtemp" :name ="user.name">
编辑 – – –
以上是真实的,但更大的问题在于,当您更改URL并转到新路线时,原始组件将消失。 为了让第二个组件编辑父数据,第二个组件需要是第一个组件的子组件,或者只是同一个组件的一部分。
我已经find了一种方法来将父数据传递给Vue中的组件作用域,我认为这有点破解,但也许这会帮助你。
1)Vue Instance中的引用数据作为外部对象(data:dataObj)
2)然后在子组件的数据返回函数中只返回parentScope = dataObj和瞧。 现在你不能做像{{parentScope.prop}}这样的事情,并且会像魅力一样工作。
祝你好运!