开发者问题收集

未捕获的类型错误:无法读取 null 的属性“showModal”

2016-08-22
8498

我尝试使用 此处 的代码并将登录重构为模态框。不幸的是,单击 登录 时出现以下错误:

Uncaught TypeError: Cannot read property 'showModal' of null

这是我的Navigation.js

import React, { Component, PropTypes } from 'react';
import { Button, Modal, Nav, Navbar } from 'react-bootstrap';
import { IndexLinkContainer } from 'react-router-bootstrap';
import Login from '../Login/Login';
import Logout from '../Logout/Logout';
import { loginUser, logoutUser } from '../../actions/actions'
import './Navigation.css'

export default class Navigation extends Component {

    constructor(props, context) {
        super(props, context);

        this.state = {
            showModal: false
        };
    }

    open() {
        this.showModal.setState = true
    }

    close() {
        this.showModal.setState = false
        }

    render() {

        const { dispatch, isAuthenticated, errorMessage } = this.props;


        return (
            <div>
                <Navbar className="navbar navbar-default navbar-fixed-top">
                    <Navbar.Header>
                        <Navbar.Brand>
                            <IndexLinkContainer to="/"><a href="/">myApp</a></IndexLinkContainer>
                        </Navbar.Brand>
                        <Navbar.Toggle />
                    </Navbar.Header>
                    <Navbar.Collapse>
                        <Nav pullRight>

                            {!isAuthenticated &&
                            <Button bsStyle="primary" onClick={this.open}>Login</Button>
                            }

                            {isAuthenticated &&
                            <Logout onLogoutClick={() => dispatch(logoutUser())} />
                            }

                        </Nav>
                    </Navbar.Collapse>
                </Navbar>

                <Modal show={this.state.showModal} onHide={this.close}>
                    <Modal.Header closeButton>
                        <Modal.Title>Login</Modal.Title>
                    </Modal.Header>
                    <Modal.Body>
                        <Login
                            errorMessage={errorMessage}
                            onLoginClick={ creds => dispatch(loginUser(creds)) }
                        />
                    </Modal.Body>
                </Modal>
            </div>
        )
    }

}

Navigation.propTypes = {
    dispatch: PropTypes.func.isRequired,
    isAuthenticated: PropTypes.bool.isRequired,
    errorMessage: PropTypes.string,
}

页面加载正常,但我的模态框无法通过单击按钮启动。我正在使用react和react-bootstrap。

1个回答

没错,您的代码中有几个错误:

当您在此处使用 ES6 类时,您的方法不会自动绑定,这意味着如果您的 JSX 上有事件处理程序(如 this.open ),则 this 是错误的上下文,因此您在函数中执行的任何操作都将无法使用 this 。要修复,请绑定到某个地方,最好是在构造函数中,但可以内联完成:

onClick={this.open.bind(this)}

第二个问题是函数本身正在做一些随机的事情。当然, this.showModal 会由于上述绑定问题而引发错误,但即使有绑定,您也不能通过这种方式访问​​/设置状态变量。相反,请切换到:

this.setState({ showModal: true }) // or false for `close`

然后它应该开始正常工作。

ZekeDroid
2016-08-22