【问题标题】:this.setState not updating statethis.setState 不更新状态
【发布时间】:2020-02-09 11:25:05
【问题描述】:

由于某种原因,我的this.state 调用没有更新我的roleClicked 函数中的状态。我似乎无法弄清楚问题是什么。代码如下:

import React, { Component } from 'react'
import { Redirect } from 'react-router-dom';
import instance from '../../../config/axios';
import ls from 'local-storage';
import Sidenav from '../../layout/Sidenav'
import isLoggedIn from '../../../helpers/isLoggedIn';
import redirectToLogin from '../../../helpers/redirectToLogin';
import apiErrorHandler from '../../../helpers/apiErrorHandler';
import RolesHeader from './RolesHeader';
import '../../../App.css'
import { Table, Pagination, Input, Alert } from 'antd';

export default class ViewRoles extends Component {

    state = {
        loggedIn: true,
        roleSelected: false, 
        roleSelectedId: null,
        rolesTable: {
            columns: null,
            dataSource: null,
            currentPageNumber: null,
            currentPageSize: null,
            total: null,
        },
        filters: {
            roleName: null
        },
        displays: {
            createRoleView: false,
            roleCreatedAlert: false,
        },
        errors: null
    }

    componentDidMount = () => {
      //here i make AJAX calls to set rolesTables
    } 

    roleClicked = (record) => {
        console.log("clicked")
        this.setState({
            roleSelected: true,
            roleSelectedId: record.key
        })
    }

    render() {

        if(this.state.roleSelected) {
            const roleUrl = "/roles/" + this.state.roleSelectedId
            return <Redirect to={roleUrl}/>
        }

        return (
            <React.Fragment>
                <Sidenav activeLink="roles"/>
                <Table 
                     className="border"
                     columns={this.state.rolesTable.columns} 
                     dataSource={this.state.rolesTable.dataSource} 
                     pagination={false}
                     onRow={(record) => {
                        return {
                           onClick: () => this.roleClicked(record)
                     }}}
                />
                <Pagination 
                    className="m-3"
                    current={this.state.rolesTable.currentPageNumber} 
                    pageSize={this.state.rolesTable.currentPageSize} 
                    total={this.state.rolesTable.total}
                    onChange={this.loadRolesTable}
                />
           </React.Fragment>)
    }
}

函数按预期运行,但状态未更新。知道可能是什么问题吗?

我在其他任何地方使用 this.setState 它都有效。完整代码可以在 link 上找到。

【问题讨论】:

  • 调用这个函数有什么结果吗?函数调用后你试过console.log(this.state)吗?
  • onRow 能正常工作吗?
  • 检查record是否正确传递,是否未定义
  • 此外,在您上面链接的代码中,您有this.setState({ roleSelected: true, roleSelectedId: 1 }),因此无论您触发该处理程序多少次,它总是会得到相同的结果。仔细检查传递给roleClicked 的内容是否正确。
  • 我怀疑 onRow 工作不正常

标签: reactjs antd


【解决方案1】:

我将 roleClicked 更新为此,它可以工作。我仍然不知道为什么初始代码不起作用。

viewRole = async (record) => {
     var currentState = this.state;
     currentState.roleSelected = true;
     currentState.roleSelectedId = record.key;
     await this.setState(currentState);
     console.log(this.state)
} 

只是将其更改为 Async 是行不通的。只有将状态分配给currentState,然后更新currentState 并在setState 中使用它才有效。现在它可以同步和异步工作。

【讨论】:

    【解决方案2】:

    试试这样的

        this.setState(function(state, props) {
          return {
            ...state,
            roleSelected: true,
            roleSelectedId: record.key
               };
       });
    

    【讨论】:

    • 我这样做了roleClicked = (record) =&gt; { console.log(record) this.setState((state, props) =&gt; { return { roleSelected: true, roleSelectedId: record.key} }) } 仍然无法正常工作。
    猜你喜欢
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2021-06-09
    • 2018-04-27
    相关资源
    最近更新 更多