Передача данных компонентам в vue.js



Я изо всех сил пытаюсь понять, как передавать данные между компонентами в vue.js. Я прочитал документы несколько раз и посмотрел на многие вопросы, связанные с vue, и учебники, но я все еще не получаю его.



чтобы обернуть голову вокруг этого, я надеюсь на помощь в завершении довольно простого примера




  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,
}
},
})


обновление



хорошо,я понял второй шаг. Вот новая скрипка, показывающая прогресс: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,
}
},
})
2241   5  

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

    Ничего не найдено.