开发者问题收集

无法在 React 中使用 state 读取 null 的属性

2017-04-09
1871

我发现下面的代码是有意义的,它只是在用户上传文件时显示文件名,但我收到无法读取文件名未定义属性的错误?为什么?我不是已经将文件名设置为空了吗?

export default class fileUpload extends Component {
    constructor(props) {
        super(props);

        React.defaultProps = {
            filename: null
        }
    }

    handleOnChange = (e) => {
        this.setState({filename: e.target.files[0].name})
    }

    render() {
        return(
            <div>
                <input type="file" onChange={this.handleOnChange}/>
                {this.state.filename && <span className="filename-placeholder">{this.state.filename}</span>}
            </div>
        )
    }
}
1个回答

添加此行,它将起作用:

constructor(props) {
    super(props);
    this.state = {};   //line
    React.defaultProps = {
        filename: null
    }
}

您需要在构造函数中定义 state

一些建议:

1. defaultProps 用于设置 props 的默认值,而不是 state 变量的默认值。这里不需要 defaultProps ,因为您正在使用 state 变量。查看示例。

2. 您将类名定义为 fileUpload (以小写字母开头),而不是使用 FileUpload (以大写字母开头)。

查看工作示例:

class FileUpload extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
           filename: null
        }
    }

    handleOnChange = (e) => {
        this.setState({filename: e.target.files[0].name})
    }

    render() {
        return(
            <div>
                <input type="file" onChange={this.handleOnChange}/>
                {this.state.filename && <span className="filename-placeholder">{this.state.filename}</span>}
            </div>
        )
    }
}

ReactDOM.render(<FileUpload/>, document.getElementById('app'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id='app'/>
Mayank Shukla
2017-04-09