【问题标题】:Tables don't render after first click in react第一次点击反应后表格不呈现
【发布时间】:2020-01-03 22:35:27
【问题描述】:

当我点击导航按钮时,表格数据会加载,但第二次点击表格数据不会加载,但每次点击 react js 时都会加载数据

我已将代码放入componentdidMount() {} 以在每次加载时加载它。我做了一个异步函数来加载表并设置标题。

{this.state.numofbugs.map((data)=> {
    return (
        <li key={data}>
            <Link to={'/applogs/' + data}
                     className="waves-effect" className={this.props.location.pathname === '/applogs/' + data ? 'active': ''}>
                <span className="font-size waves-effect" >{data}</span>
            </Link>
        </li>
    )
})} 

在它呈现的文件中

componentDidMount() {
    if (this.props.location.pathname.includes('app_')) {
        this.showTable(this.props.location.pathname.split('/')[2]);
    }
}

async showTable(col_name) {
    // empty data
    this.state.logtable = []
    let conf = { headers: { Authorization: 'Bearer ' + localStorage.getItem('session') }}
    Axios.get(links.baseURL + 'sample?collection=' + col_name, conf).then((response) => {
        // get headers
        this.state.tableHeaders = [
            Object.keys(response.data.result[0])[0], 
            Object.keys(response.data.result[0])[1],
            Object.keys(response.data.result[0])[2],
            Object.keys(response.data.result[0])[3],
        ]

        Object.keys(response.data.result).map((key) => {
            this.state.logtable[key] = response.data.result[key];
            this.state.logtable[key]['key'] = key.toString()
        }); 
        this.setState({'logtable': this.state.logtable});
    });
}

我希望在表格中的每个按钮单击时都会在表格中获取数据,但是在单击表格中折叠数据 laods 的选项卡后,第二次将数据加载到标记而不是表格中

【问题讨论】:

  • 为什么showTable的开头有this.state.logtable = []?不应该在构造函数中定义吗?然后你定义this.state.tableHeaders = 我不明白你对状态使用的看法。您应该只使用 setState 来改变状态,而不是使用 this.state.sometinhg = something
  • showTable(col_name) 这个函数只渲染一次而不是每次,我怎样才能让它每次都渲染。
  • 您好 Ansh,请阅读此内容 - stackoverflow.com/help/someone-answers,然后尝试关闭问题。
  • 感谢这些解决方案的贡献帮助了我很多,并寻求了大量的知识

标签: javascript reactjs components axios rendering


【解决方案1】:

首先,你不需要清空你的状态,

this.state.logtable = []

如果你想用新的状态替换你现有的状态,你可以简单地用新的数据设置状态。

另一个问题是,你正在直接改变你的状态,就像这样

this.state.tableHeaders = [
    Object.keys(response.data.result[0])[0], 
    Object.keys(response.data.result[0])[1],
    Object.keys(response.data.result[0])[2],
    Object.keys(response.data.result[0])[3],
]

还有这个

Object.keys(response.data.result).map((key) => {
    this.state.logtable[key] = response.data.result[key];
    this.state.logtable[key]['key'] = key.toString()
}); 

您应该使用局部变量来创建临时数组,然后需要将它们设置为您的状态,例如,

async showTable(col_name) {

    let conf = { headers: { Authorization: 'Bearer ' + localStorage.getItem('session') }}
    Axios.get(links.baseURL + 'sample?collection=' + col_name, conf).then((response) => {
        // get headers
        let tableHeaders = Object.keys(response.data.result[0]).map((key,index) => index <=3 && key.toString())

        let logtable = Object.keys(response.data.result).map((key) => ({
            logtable[key] : response.data.result[key];
            logtable[key]['key'] : key.toString()
        })); 
        this.setState({logtable, tableHeaders});
    });
}

【讨论】:

  • 是的,非常感谢您的解决方案。我这样做了,它起作用了,但是当我必须在页面加载时加载它时,我在 componentDidMount 中调用 API,它在页面加载时不起作用:(@ravibagul91,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 2016-07-14
  • 2018-08-11
  • 2021-03-15
  • 1970-01-01
  • 2011-11-17
  • 2023-03-14
相关资源
最近更新 更多