Задать вопрос

Как правильно отследить изменение props в дочернем компоненте Vue JS?

Добрый день, помогите разобраться с тем как правильно в Vue JS отслеживать изменения свойства props в дочернем компоненте и на основе этого изменения запускать функцию.

В моем случае есть родительский компонент и два дочерних. В родительском компоненте определено свойство userid = false.

В дочернем компоненте users выводится список пользователей, при клике на ссылку “Подробнее” запускается событие pickuser и в родительский компонент передается ID выбранного пользователя, где оно сохраняется в свойство userid.

В компоненте current-user выводится информация о выбранном пользователе, сейчас там выводится только ID текущего выбранного пользователя, этот ID передается в компонент через props [‘userid’] от родителя. В current-user я указываю через watch слежение за свойством props [‘userid’] и каждый раз когда это свойство получает новое значение, я запускаю в блоке watch метод getUserDetaile - этот будет обращаться на внешний API для получения данных по ID текущего пользователя, сейчас там просто выводится log в консоль.

Вопрос как правильно реализовать слежение за изменением свойства props и как правильно добавить к слежению метод, который будет запускаться только при изменении свойства props ? Я делал слежение как через watch так и через updated
метод запускается, но непонятно насколько вообще грамотно я реализовал этот механизм? В каком случае код будет работать быстрее?

Код html документа:
<html>
<head>
<title>Компоненты Vue.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="style.css">
</head>
<body>
<div id="app">   


<current-user :userid="userid" @useridreset="reset"></current-user>

<users :userid="userid" @pickuser="changeID"></users>
</div>
<script src="https://unpkg.com/vue"></script>
<script src="main.js"></script>

</body>
</html>


Код js файла:
// пользователи
Vue.component('users', { 
    props: ["userid"],
    template: `
        <div>
        <h3>Список пользователей</h3>
        <div class="users">
                <div class="user" v-for="(user, index) in users" :key="index">
                    <p>User id:{{ user.userid  }}</p>
                    <p>Name:{{ user.name  }}</p>
                    <div class="detail-info"><span @click="pickID(user.userid)">Подробнее</span></div>
                </div>
        </div></div>
    `,
    methods:{
        pickID: function(ID){
            // отправляем событие в родительский компонент
            this.$emit("pickuser", ID);
          }
    },
    data(){
        return {
            users:[ // массив пользователей получаем из обращения к API  (здесь просто сохранен ввиде массива)              
                {name:'Sasha', position:'frontend web developer', userid:5},
                {name:'Masha', position:'designer', userid:7},
                {name:'Lena', position:'accountant', userid:12}
            ]
        }
    }
});

// блок где выводится информация о текущем выбранном пользователе
Vue.component('current-user', {
    props: ["userid"],    
    data(){
        return{
            buttonReset: false
        }
    },
    methods: {
        reset(){
               this.$emit("useridreset");
               this.buttonReset = false;
        },
        // здесь получаем детальную информацию по пользователю
        getUserDetaile(ID){             
            // здесь будет обращение у удаленному API на сервер
            // пока выводим сообщение в консоль
            console.log('Получаем данные пользователя по его ID = ' + ID);
        }
    },
    // updated: function(){ // блок кода который запускается при изменении props
        
    //     if(this.userid !== false){           
    //         this.buttonReset = true;
    //     }
    // },
    watch:{
        userid: function(val){
            if(val !== false){           
                this.buttonReset = true;
                this.getUserDetaile(this.userid);
            }
        }
    }, 
    template:`
            <div>
                <h3 v-if="userid">ID выбранного пользователя: {{ userid }}</h3>
                <div v-if="buttonReset">


                    <h3>button: {{ buttonReset }}</h3>
                    <p><button @click="reset">Reset</button></p>
                </div>
            </div>`,
    
});

// главный компонент
new Vue({
    el: "#app",
    data:{
        userid:false
    },
    methods:{
        changeID: function(ID){
          this.userid = ID;
        },
        reset:function(){
           this.userid = false;
        }
    }
    
});
  • Вопрос задан
  • 3312 просмотров
Подписаться 2 Простой 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы