VueJS: передача дочернего метода родительскому не выполняется

#javascript #vue.js

#javascript #vue.js

Вопрос:

Здесь родительский метод передает name amp; age реквизиты дочернему. Дочерний компонент генерирует пользовательское событие, changeAgeFn которое передает свой changeAge метод родительскому.

В родительском (переданном) changeAge событии прикреплено событие click on button[change age] .

Однако этот способ не работает. Я хотел бы знать стандартный / рекомендуемый способ выполнения дочернего события из родительского.

Parent.vue

 <template>
    <div class="parent-wrap">
        <p>UserName: {{user}}, age: {{age}}
        <button @click="changeAge()"> Change Age</button></p>
        <child :user="user" :age="age" @userChanged="user = $event" @changeAgeFn="$event" ></child>
    </div>
</template>

<script>
    import child from './child.vue'

    export default {
        data: function() {
            return {
                user: 'John',
                age: 35
            }
        },
        components: {
            child
        },        
    }
</script>

<style>
.child-wrap {
  border: 3px solid #000;
  max-width: 300px;
  padding: 20px;
  background: lightblue;
}

.parent-wrap {
  padding: 30px;
  background-color: lightcoral;
  border: 3px solid #000;
}
</style>
  

дочерний.vue

 <template>
    <div class="child-wrap">
        <p>UserName: {{user}}, age: {{age}}
        <button @click="changeName"> Change Name</button></p>
    </div>
</template> 

<script>
    export default {
        props: ['user', 'age'],
        methods: {
            changeName() {
                this.user = 'Rahul'
                this.$emit('userChanged', this.user)
                this.$emit('changeAgeFn', this.changeAge)
            },
            changeAge() {
                this.age = '20'
            }
        }
    }
</script>
  

Спасибо

Ответ №1:

Я думаю, вы здесь немного запутались. Вам нужно ввести changeAge в качестве поддержки дочернему компоненту от родительского, чтобы он обновлял состояние родительского компонента, и это запускает повторный рендеринг дочернего компонента.

Итак, вашему дочернему объекту нужен prop со следующей подписью:

 changeAge: () => void
  

Затем вы определяете изменение в родительском:

 // parent, NOT child 
methods: {
    ...
    changeAge() {
            this.age = '20'
        }
...
  

}

А затем внедрите его в дочерний:

 <template>
    ...
    <child :changeAge=“changeAge” etc.../>
    ...
</template>
  

Надеюсь, это поможет.