【问题标题】:React: PropTypes in stateless functional componentReact:无状态功能组件中的 PropTypes
【发布时间】:2017-07-30 10:14:29
【问题描述】:

在 React 中,我写了一个无状态的功能组件,现在想给它添加 Prop Type 验证。

List组件:

import React from 'react';
import PropTypes from 'prop-types';

function List(props) {
  const todos = props.todos.map((todo, index) => (<li key={index}>{todo}</li>));
  return (<ul></ul>);
}

List.PropTypes = {
  todos: PropTypes.array.isRequired,
};

export default List;

App 组件,渲染List

import React from 'react';
import List from './List';

class App extends React.Component {
  constructor() {
    super();
    this.state = {
      todos: '',
    };
  }

  render() {
    return (<List todos={this.state.todos} />);
  }
}

export default App;

正如您在App 中看到的,我将this.state.todos 传递给List。由于 this.state.todos 是一个字符串,我希望 Prop 类型验证能够启动。相反,我在浏览器控制台中收到错误,因为字符串没有名为 map 的方法。

为什么道具类型验证没有按预期工作?看看this question,情况好像一模一样。

【问题讨论】:

    标签: reactjs react-proptypes


    【解决方案1】:

    您应该将属性上的大小写更改为propTypes

    - List.PropTypes = {
    + List.propTypes = {
        todos: PropTypes.array.isRequired,
      };
    

    正确

    List.propTypes = {
      todos: PropTypes.array.isRequired,
    };
    

    (PropTypes对象的instance是小写的,但是Class/Type是大写的。实例是List.propTypes。Class/Type是PropTypes。)

    【讨论】:

    • 快速简单,谢谢!我只是忽略了这一点,哦。
    • 要阐明这种肮脏的错误,您可以使用github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/…
    • 为了清楚起见,如果有人关心区别,List.propTypes 实际上不是PropTypes 的实例。这是一个普通的 javascript 对象。事实上,PropTypes 甚至不是一个类:它也是一个对象。此答案中的实例并不意味着面向对象。
    • 类是对象
    猜你喜欢
    • 2017-11-18
    • 1970-01-01
    • 2016-03-06
    • 2016-04-17
    • 2017-01-21
    • 2019-03-24
    • 2017-11-29
    • 2018-03-24
    • 1970-01-01
    相关资源
    最近更新 更多