Передача данных компонентам в vue.js
Я изо всех сил пытаюсь понять, как передавать данные между компонентами в vue.js. Я прочитал документы несколько раз и посмотрел на многие вопросы, связанные с vue, и учебники, но я все еще не получаю его.
чтобы обернуть голову вокруг этого, я надеюсь на помощь в завершении довольно простого примера
- отображение списка пользователей в одном компоненте (готово)
- отправить данные пользователя в новый компонент при нажатии на ссылку (готово) - см. обновление в сущности.
- изменить данные пользователя и отправить его обратно в исходный компонент (не вышло)
вот скрипка, которая терпит неудачу на втором шаге: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,
}
},
})
обновление
хорошо,я понял второй шаг. Вот новая скрипка, показывающая прогресс: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>
затем в компоненте добавьте данные в параметры маршрута посмотреть переход крючки:
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,
}
},
})
5 ответов:
-------------следующее применимо только к Vue 1 --------------
передача данных может быть выполнена несколькими способами. Способ зависит от типа использования.
если вы хотите передать данные из HTML при добавлении нового компонента. Это делается с помощью реквизита.
<my-component prop-name="value"></my-component>это значение prop будет доступно для вашего компонента только в том случае, если вы добавите имя prop
prop-nameна .
когда данные передается от компонента к другому компоненту из-за какого-либо динамического или статического события. Это делается с помощью диспетчеров событий и вещателей. Так, например, если у вас есть такая структура компонентов:
<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-links. Этот метод используется, когда цепи компонентов полностью разрушены или в случаях, когда URI изменяется. И я вижу, что ты уже понимаешь их.
решите, какой тип передачи данных вы хотите, и выбрать соответствующим образом.
Я думаю, что проблема здесь:
<template id="newtemp" :name ="{{user.name}}">когда вы префикс опоры с
:вы указываете Vue, что это переменная, а не строка. Так что вам не нужно{{}}вокругuser.name. Попробуйте:<template id="newtemp" :name ="user.name">правка-----
вышеизложенное верно, но большая проблема здесь заключается в том, что при изменении URL-адреса и переходе на новый маршрут исходный компонент исчезает. Чтобы второй компонент редактировал родительские данные, второй компонент будет нужно быть дочерним компонентом первого или просто частью одного и того же компонента.
лучший способ отправить данные из родительского компонента в дочерний-это использовать реквизит.
передача данных от родителя к ребенку через
props
- объявить
props(массив или объект) в детей- передайте его ребенку через
<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>
Я нашел способ передать родительские данные в область компонентов в Vue, я думаю, что это немного хак, но, возможно, это поможет вам.
1) ссылочные данные в экземпляре Vue как внешний объект
(data : dataObj)2) затем в функции возврата данных в дочернем компоненте просто верните
parentScope = dataObjи вуаля. Теперь вы не можете делать такие вещи, как{{ parentScope.prop }}и будет работать как шарм.Удачи!
глобальная переменная JS (объект) может использоваться для передачи данных между компонентами. Пример: передача данных из Ammlogin.vue к вариантам.Ву. В Аммлогине.vue rspData устанавливается в ответ от сервера. в настройках.vue ответ от сервера становится доступным через rspData.
.html:<script> var rspData; // global - transfer data between components </script>Ammlogin.vue:
.... export default { data: function() {return vueData}, methods: { login: function(event){ event.preventDefault(); // otherwise the page is submitted... vueData.errortxt = ""; axios.post('http://vueamm...../actions.php', { action: this.$data.action, user: this.$data.user, password: this.$data.password}) .then(function (response) { vueData.user = ''; vueData.password = ''; // activate v-link via JS click... // JSON.parse is not needed because it is already an object if (response.data.result === "ok") { rspData = response.data; // set global rspData document.getElementById("loginid").click(); } else { vueData.errortxt = "Felaktig avändare eller lösenord!" } }) .catch(function (error) { // Wu oh! Something went wrong vueData.errortxt = error.message; }); }, ....параметры.vue:
<template> <main-layout> <p>Alternativ</p> <p>Resultat: {{rspData.result}}</p> <p>Meddelande: {{rspData.data}}</p> <v-link href='/'>Logga ut</v-link> </main-layout> </template> <script> import MainLayout from '../layouts/Main.vue' import VLink from '../components/VLink.vue' var optData = { rspData: rspData}; // rspData is global export default { data: function() {return optData}, components: { MainLayout, VLink } } </script>
Comments