【问题标题】:(VueJS) Update parent data from child component(VueJS) 从子组件更新父数据
【发布时间】:2017-11-02 09:58:02
【问题描述】:

我有一个父母将道具传递给孩子,孩子向父母发出事件。然而,这并没有完全发挥作用,我不知道为什么。有什么建议吗?

家长:

<template>
<div class="natural-language">
    <div class="natural-language-content">
        <p class="natural-language-results">
            <msm-select :options="payments" :model="isShowingUpdate" />
        </p>
    </div>
</div>
</template>

<script>
import msmSelect from '../form/dropdown.vue'

export default {
    components: {
        'msm-select': msmSelect
    },
    data() {
        return {
            isShowingUpdate: true,
            payments: [
                {'value': 'paying anuualy', 'text': 'paying anuualy'},
                {'value': 'paying monthly', 'text': 'paying monthly'}
            ],
        }
    }
}
</script>

孩子:

<template>
<div class="form-pseudo-select">
    <select :model="flagValue" @change="onChange($event.target.value)">
        <option disabled value='Please select'>Please select</option>
        <option v-for="(option, index) in options" :value="option.value">{{ option.text }}</option>
    </select>
</div>
</template>

<script>
export default {
    props: {
        options: {
            elType: Array
        },
        isShowingUpdate: {
            type: Boolean
        }
    },
    data() {
        return {
            selected: '',
            flagValue: false
        }
    },
    methods: {
        onChange(value) {
            if (this.selected !== value) {
                this.flagValue = true;
            } else {
                this.flagValue = false;
            }
        }
    },
    watch: {
        'flagValue': function() {
            console.log('it changed');
            this.$emit('select', this.flagValue);
        }
    },
    created() {
        console.log(this.flagValue);
        this.flagValue = this.isShowingUpdate;
    }
}
</script>

基本上,当选择框中的选项发生变化时,应该更新布尔标志。但是,在我的孩子身上,我的 isShowingUpdate 得到了 undefined。我错过了什么?

【问题讨论】:

    标签: javascript vuejs2


    【解决方案1】:

    这两个组件之间没有你所说的关系。

    您称为parent 的组件实际上是孩子……而孩子是parent

    在您的情况下,父组件始终是调用另一个的组件:

    //Parent component
    <template>
     ...
      <msm-select :options="policies" :model="isShowingUpdate" /> << the child
     ...
    </template>
    

    您应该更改两个组件之间的道具/事件。

    编辑:

    您可以编辑:

    onChange(value) {
                if (this.selected !== value) {
                    this.flagValue = true;
                } else {
                    this.flagValue = false;
                }
            }
    

    像下面这样的一个新的:

    关于孩子:

    onChange(value) {
                if (this.selected !== value) {
                    this.flagValue = true;
                } else {
                    this.flagValue = false;
                }
                this.$emit('flagChanged', this.flagValue)
            }
    

    在父级上使用emit 事件捕获并调用其他方法:

    //HTML part:
        <msm-select :options="payments" :model="isShowingUpdate" v-on:flagChanged="actionFlagChanged" />
    
    //JS part:
        methods: {
            actionFlagChanged () {
                 //what you want
            }
        }
    

    我可以给你一些tips吗?

    • 这不是一个(非常)好名字的函数:onChange 在 onChange 事件中......尝试类似:updateFlag(更多 语义)。

    • 我认为你可以删除手表部分并在onChange中进行 事件

    • 尝试找一个好的文档/教程(即官方文档)来了解更多关于父子通信的知识。

    记得添加事件总线导入:

    import { EventBus } from './event-bus'
    

    希望对你有帮助!

    【讨论】:

    • 嗨@JP。奥莱特。你上面说的很有道理,我已经修改了我的代码。但是,我仍然无法将 prop 值从父级传递给子级(获取 undefined)。如果我发布更新后的代码会有帮助吗?
    • 是的,更新代码以便为社区获得更好的帮助!但也许首先尝试阅读一些关于组件之间的父子通信(双重数据绑定、道具、事件等)
    猜你喜欢
    • 2017-04-16
    • 2018-07-20
    • 2017-08-03
    • 1970-01-01
    • 2017-12-31
    • 2019-02-17
    • 2017-03-17
    相关资源
    最近更新 更多