【问题标题】:Filter function returning empty array in reactjs过滤函数在reactjs中返回空数组
【发布时间】:2021-09-09 10:11:01
【问题描述】:

我有一个接收参数的组件。

我使用该参数仅比较和过滤掉那些等于参数值的元素。 但是当我使用filter 函数时,它会给出一个空数组。 我在这里做错了什么?

编辑 在过滤器功能中,如果我使用parseInt(this.props.match.params) 它可以工作.. 但如果我使用parseInt(this.state.registrationId) 任何想法都行不通..

import React, {Component} from "react";
import {Link} from 'react-router-dom';
import Progress from "../Common/Progress";
class AdmissionProcess extends Component {
    state = {
        progress: true,
        enquiries: [],
        registrationId: this.props.match.params.reg_status
    }
    componentDidMount = () => {
        this.loadData()
    }
    componentDidUpdate  = (prevProps) => {
        if(prevProps.match.params.reg_status !== this.props.match.params.reg_status) {
            this.setState({registrationId: this.props.match.params.reg_status})
            console.log("I ran")
        }
    }
    loadData () {
        const url = window.domain+"/list-enquiry";
        fetch(url)
        .then(res =>  res.json())
        .then(result => this.setState({enquiries: [...result], progress: false}))
        .catch(err =>  console.log("err"+ " " +err))
    }

    checkEnquiries = () => {
        const reg2 = this.state.enquiries.filter(enq => enq.registrationId===this.state.registrationId)
        console.log(reg2)
    }

    render() {
        this.checkEnquiries()
        return(
          {/* Jsx code here*/}
        )
    }
 export default AdmissionProcess

【问题讨论】:

  • 能否请您登录您的result 获取??
  • 嗨@RyanLe,我记录了获取结果,它显示了对象数组......正如预期的那样
  • 它们是数字还是字符串?你使用 === 平等
  • "一个未定义的数组":那会是什么?要么是undefined,要么是一个数组,但不是两者兼而有之。而filter从不返回undefined,那你是什么意思?
  • @HDM91 其中之一是字符串,但我也尝试了 parseInt() 函数在字符串中但结果仍然相同

标签: javascript reactjs jsx


【解决方案1】:

请注意,您的loadData() 粉碎了最初的state,试试这个代码:

loadData () {
    const url = window.domain+"/list-enquiry";
    fetch(url)
    .then(res =>  res.json())
    .then(result => this.setState({...this.state, enquiries: [...result], progress: false}))
    .catch(err =>  console.log("err"+ " " +err))
}


checkEnquiries = () => {
    const reg2 = this.state.enquiries.filter(enq => enq.registrationId===parseInt(this.state.registrationId))
    console.log(reg2)
}

【讨论】:

  • @GiovanniEsposito this.setState({enquiries: [...result], progress: false})) => state 在这种情况下将有 2 个属性:enquiriesprogressthis.setState({...this.state, enquiries: [...result], progress: false})) => state 在这种情况下将有 3 个属性: enquiriesregistrationIdprogress,
  • @KaushikGarkoti,你能告诉我们你如何调用你的AdmissionProcess 组件,this.props.match.params.reg_status的值是什么
  • this.props.match.params.reg_status 值取决于它来自哪个页面.. 现在是 5。
  • 我编辑了我的帖子,你能告诉我它是否有效
  • 请注意,在您的state 声明中,registrationId 等于this.props.match.params.reg_status,但在您的问题正文中,您提到了parseInt(this.props.match.params)
【解决方案2】:

好的,经过几次打击和试验后,我设法让它工作了......老实说,我仍然不知道它是如何工作的,我真的很感激一些关于它是如何工作的解释,而其他人则不知道。 ..这是有变化的代码...

import React, {Component} from "react";
import {Link} from 'react-router-dom';
import Progress from "../Common/Progress";
class AdmissionProcess extends Component {
    state = {
        progress: true,
        enquiries: [],
        registrationId: this.props.match.params.reg_status,
        requiredList: []
    }
    componentDidMount = () => {
        this.loadData()
    }

    loadData () {
        const url = window.domain+"/list-enquiry";
        fetch(url)
        .then(res =>  res.json())
        .then(result => this.setState({enquiries: [...result], progress: false}, this.checkEnquiries))
        .catch(err =>  console.log("err"+ " " +err))
    }

    componentDidUpdate  = (prevProps) => {
        if(prevProps.match.params.reg_status !== this.props.match.params.reg_status) {
            this.setState({registrationId: this.props.match.params.reg_status}, this.checkEnquiries)
            console.log("I ran")
        }
    }

    checkEnquiries = () => {
        const reg2 = this.state.enquiries.filter((enq) => enq.registrationId === parseInt(this.state.registrationId))
        this.setState({requiredList: [...reg2]})
    }

    render() {
        return ({/*JSX Code Here*/})
    }
}
export default AdmissionProcess

【讨论】:

  • 正是我向您建议的:在setState 的回调上调用this.checkEnquiries... 解释仍然相同:您正在过滤一个空数组,因为数据需要来自获取。
  • @GiovanniEsposito 我同意并感谢您早先指出这一点.. 但我早些时候遵循了您的方法,但它没有用.. 可能是因为我这样称呼它 -- ``loadData () { const url = window.domain+"/list-enquiry"; fetch(url) .then(res => res.json()) .then(result => this.setState({enquiries: [...result], progress: false}, () => this.checkEnquiries() )) .catch(err => console.log("err"+ " " +err)) }``
  • 编辑的代码块 -- ``loadData () { `` const url = window.domain+"/list-enquiry"; fetch(url) .then(res => res.json()) .then(result => this.setState({enquiries: [...result], progress: false}, () => this.checkEnquiries() )) .catch(err => console.log("err"+ " " +err)) }``
  • setState({...}, () => this.checkEnquiries())setState({...}, () => {this.checkEnquiries()}) 是一样的
  • 但在我的回答中我正在做setState({...}, this.checkEnquiries)
猜你喜欢
  • 2019-11-20
  • 2019-04-23
  • 1970-01-01
  • 2023-01-25
  • 2022-10-14
  • 1970-01-01
  • 2021-11-13
  • 2019-07-22
相关资源
最近更新 更多