javascript - 数据未从父组件传播到子组件

标签 javascript vuejs2

Vue 建议使用属性向下和事件向上模式在父组件和子组件之间传播数据。基于此,我创建了一个简单的选择框组件,其中列出了美国所有州并发出“州选择”事件。我在我的家长类(class)中订阅了此事件,一切正常。 这是我的代码:

<template>
    <select v-model="selectedStatus" id="orderStatusSelectBox" class="form-control" name="status" v-on:change="onChange" v-bind:preselectedStatus="filters.selectedStatus">
        <option value="" selected="selected" disabled>Select status</option>
        <option value="1">New</option>
        <option value="2">Scheduling</option>
        <option value="3">In production</option>
        <option value="4">Completed</option>
        <option value="5">On hold</option>
        <option value="6">Cancelled</option>
        <option value="7">Problem</option>
    </select>
</template>

<script>
    export default {
        data: function () {
            return {
                selectedStatus: ''
            }
        },
        mounted() {

            this.selectedStatus = (this.preselectedStatus ? this.preselectedStatus : '');
        },
        component: 'select-order-status',
        methods: {
            onChange() {
                this.$emit('statusSelected', this.selectedStatus);
            }
        },
        props: ['preselectedStatus'],
    }
</script>

在我的父组件中,除了这个选择框子组件之外,我还有几个按钮(快速过滤器),您可以在其中快速过滤新订单或已完成订单。我在这些按钮上添加了单击事件,以便我可以选择新状态并将该值传播到我的子组件。

这是代码:

<template>
    <div>
        <div class="row filters">
            <div class="col-md-12">
                <h4>QUICK FILTERS:</h4>
            </div>
        </div>

        <div class="row filters">
            <div class="col-md-4">
                <div class="row">
                    <div class="col-md-3">
                        <button type="button" class="btn btn-yellow m5 fixed-width-btn" v-on:click="statusSelected('1')">New Order</button>
                        <button type="button" class="btn btn-success m5 fixed-width-btn" v-on:click="statusSelected('4')">Completed</button>
                    </div>
                </div>
            </div>
        </div>
        <hr>
        <div class="row">

            <div class="col-md-2">
                <div class="form-group">
                    <order-status-select v-on:statusSelected="statusSelected" v-bind:selectedStatus="filters.selectedStatus"></order-status-select>
                </div>
            </div>

        </div>
        <hr>
        <span>
            <div class="col-md-3">
                <div class="form-group">
                    <select id="agentSelectBox" class="form-control" name="actions">
                        <option value="" selected="selected">Select action</option>
                        <option value="1">Action 1</option>
                    </select>
                </div>
            </div>
            <div class="col-md-2">
                <button type="button" class="btn btn-default">Apply</button>
            </div>
            <div class="col-md-2">
                <button type="button" class="btn btn-default">Export CSV</button>
            </div>
        </div>
    </div>

</template>

<script>
    import OrderStatusSelectComponent from '../../reusable/OrderStatusSelectComponent.vue';
    export default {
        data: function () {
            return {
                filters: {
                    selectedStatus: '',
                    resultsPerPage: 10,
                    currentPage: 1,
                },
            }
        },
        mounted() {
        },
        component: 'filters',
        methods: {
            search() {
                this.$emit('search', this.filters);
            },
            statusSelected(selectedStatus) {
                this.filters.selectedStatus = selectedStatus;
            }
        },
        components: {
            'order-status-select': OrderStatusSelectComponent,
        },
    }
</script>

问题是,当我单击任何按钮(快速过滤器)时,数据不会传播到子组件。

我看到其他几篇文章建议使用 Vuex 和 Vue Bus,但是还有其他推荐的方法来处理这个问题吗?

这里是产生问题的和平代码。

<order-status-select v-on:statusSelected="statusSelected" v-bind:selectedStatus="filters.selectedStatus"></order-status-select>

因此,我想从父组件将 filters.selectedStatus 传递给子组件。当应用程序首次渲染时,在我的子组件中正确选择了filters.selectedStatus中的状态,但是当我之后更改filters.selectedStatus变量时,这不会反射(reflect)在子组件中。

最佳答案

您的子组件仅检查 mount 上的 preselectedStatus,并且在组件完成安装后,即使其值发生变化,它也不会再次查看该属性。

处理此问题的一种方法是让子组件监视其属性的更改,并根据需要进行响应:

...
watch: {
  preselectedStatus() {
    // property value changed:
    this.selectedStatus = (this.preselectedStatus ? this.preselectedStatus : '');
  }
},
...

关于javascript - 数据未从父组件传播到子组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49099825/

相关文章:

javascript - JS中构造函数 "creates"无限循环

javascript - 如何在一个页面上多次重复使用一个函数?

javascript - 将嵌套的 PHP 循环传递给 javascript

vue.js - Vue - 在没有 webpack 的情况下添加 CDN 组件

node.js - 将数据从 Node-Express 后端传递到 Vue 组件

javascript - Angular Material 垫卡宽度作为内部文本宽度

javascript - Django ajax查看csrf失败并出现500错误

javascript - vue js v-for 指令中的函数调用使循环进入无限循环,我不知道为什么

unit-testing - 如何在 Jest 中模拟 i18next 模块

javascript - 为什么我在 jsPdf 输出上得到空白页?