从子组件过滤数组数据表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从子组件过滤数组数据表相关的知识,希望对你有一定的参考价值。

我正在将我的一个旧的php / jquery单页面应用程序迁移到VueJS / Webpack,以便习惯使用后者。它是一个简单的表,它从JSON API获取数据并使用过滤器控件(在它们自己的组件中)。一切正常,除了我试图使用我的子组件中的控件过滤我的表。我为我用作数据源的数组设置了一个prop。

我的App.vue模板看起来像这样:

<template>
  <div>
      <fan-modals v-bind:fans="fans"></fan-modals>

      <div class="container">
          <filter-controls v-bind:fans="fans"></filter-controls>
          <fans v-bind:fans="fans"></fans>
      </div>  <!-- end #container -->
  </div>
</template>

<script>
  import FilterControls from './components/FilterControls.vue';
  import Fans from './components/Fans.vue';
  import FanModals from './components/FanModals.vue';


  export default {
    name: 'app',
    data: function() {
      return {
        fansUrl: 'example.com',
        fans: []
      }
    },
    components: {
      filterControls: FilterControls,
      fans: Fans,
      fanModals: FanModals
    },
    methods: {
        getFans: function (data) {
            var self = this;
            $.getJSON(self.fansUrl, function(data){
                self.fans = data;
            });
        }
    },
    mounted() {
        this.getFans();
    }
}
</script>

我正在尝试在我的<FilterControls>组件中的函数中重用我在旧应用程序中使用的重构jquery脚本。这是我的<FilterControls>子组件的脚本部分:

<script>
    export default {
        data: function() {
            return {                
                voltageArray: [],
                rpmArray: [],
                noiseLevelArray: [],

                selectedVoltage: 'Voltage',
                selectedRPM: 'Max RPM',
                selectedNoiseLevel: 'Max dBA',

                selectedImpellerSize: '',
                selectedCageSize: '',
                selectedPhase: '',
                selectedFrequency: '',
                secondVoltage: ''
            }
        },
        props: {
            fans: {
                type: Array
            }
        },
        watch: {
            fans(value) {
                this.populateControls(value);
            }
        },
        methods: {
            populateControls(fans) {

                //create emtpy arrays for dropdowns
                var voltage = [];
                var rpm = [];
                var noiseLevel = [];

                //for each fan in fans, get voltages, rpm and noiseLevel values and add them to the empty arrays
                $.each(fans, function(index, value) {
                    voltage.push(fans[index].voltage);
                    rpm.push(fans[index].rpm);
                    noiseLevel.push(fans[index].noise_level);
                });

                //deduplicate and sort arrays
                this.voltageArray = $.unique(voltage).sort();
                this.rpmArray = $.unique(rpm).sort(function(a, b){return a-b});
                this.noiseLevelArray = $.unique(noiseLevel).sort();

            },
             filterFans(fans) {
                var filtered = $.grep(fans, function(fan) {
                   if (this.selectedVoltage === "208-240++") { var secondVoltage = "230"; };

                    return  (selectedImpellerSize === ''    || fan.diameter === selectedImpellerSize);// &&
                            (selectedCageSize === ''            || fan.cage_diameter === selectedCageSize) &&
                            (selectedPhase === ''               || fan.phases === selectedPhase) &&
                            (selectedFrequency === ''           || fan.frequency === selectedFrequency) &&
                            (selectedRPM === 'Max RPM'          || fan.rpm  <= parseInt(selectedRPM)) && 
                            (selectedNoiseLevel === 'Max dBA'   || fan.noise_level <= selectedNoiseLevel) &&
                            (selectedVoltage === 'Voltage'      || fan.voltage === selectedVoltage || fan.voltage === (jQuery.isEmptyObject(secondVoltage) ? selectedVoltage : secondVoltage));
                });

                fans = filtered;
            }
        }
    }
</script>

populateControls()方法填充我的下拉列表中的可能值以进行过滤。我正在尝试使用filterFans()方法来过滤用于填充表格的fans数组。当我将此方法附加到按钮单击时,我收到错误:

Uncaught TypeError: Cannot read property 'length' of undefined

它引用了启动var filtered = $.grep(fans, function(fan)的行,所以我猜它在迭代我的fans数组时遇到了问题。

我知道有更好的方法可以做到这一点,但我对VueJS很新。我错过了一些非常明显的东西吗

答案

问题可能在于您使用按钮的事件处理程序绑定。例如,您可能有:

<button @click="filterFans()">Filter fans</button>

问题是fans需要的缺失函数参数(即filterFans)。 $.grep试图阅读fans.length,导致你看到的错误。

您可以通过更新模板中的处理程序来解决此问题:

<button @click="filterFans(fans)">Filter fans</button>

或者更新filterFans直接阅读this.fans

filterFans() {
  const filtered = $.grep(this.fans, /* ... */);
}

以上是关于从子组件过滤数组数据表的主要内容,如果未能解决你的问题,请参考以下文章

我可以从子组件获取计算数据到父组件吗?

如何在 ReactJS 中将更改的状态从子组件传递给其父组件

如何在反应中将数组从子组件发送到父组件?

从子片段访问父片段方法

为什么我不能在此片段中生成唯一对象数组?

如何将数据从子组件传递到父组件[Angular]