代码之家  ›  专栏  ›  技术社区  ›  ItsPronounced Finn

从子组件筛选数组数据表

  •  2
  • ItsPronounced Finn  · 技术社区  · 6 年前

    我正在将一个旧的PHP/jquery单页应用程序迁移到VueJS/Webpack中,以适应后者的使用。这是一个简单的表,它从jsonapi获取数据,并使用过滤器控件(在它们自己的组件中)。一切正常,除了我尝试使用子组件中的控件筛选表。我已经为用作表数据源的数组设置了一个道具。

    我的 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>
    

    我正在尝试将我在旧应用程序中使用的重构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) 所以我猜它在遍历我的 风扇 数组。

    我知道有更好的方法,但我对VueJS很陌生。我错过了什么很明显的东西吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   tony19 thanksd    6 年前

    这个问题可能是在使用按钮的事件处理程序绑定时出现的。例如,您可能有:

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

    问题是缺少函数参数(即。, fans )那个 filterFans 要求。 $.grep fans.length

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

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

    或更新 阅读 this.fans 直接:

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