Javascript 失败的道具类型道具标记为必需,但其值为“未定义”`

Javascript 失败的道具类型道具标记为必需,但其值为“未定义”`,javascript,reactjs,react-redux,Javascript,Reactjs,React Redux,我使用的是react v4,我试图在页面“treinamentos”中列出一个数组,但在加载页面时出现了一个错误: 失败的道具类型:道具treinamentos在中标记为所需 Treinamentos,但其值是未定义的 我错过了什么?是因为我使用的版本吗 Treinamentos: import React from 'react'; import TreinamentosList from './TreinamentosList'; import { connect } from 'reac

我使用的是react v4,我试图在页面“treinamentos”中列出一个数组,但在加载页面时出现了一个错误:

失败的道具类型:道具
treinamentos
在中标记为所需
Treinamentos
,但其值是
未定义的

我错过了什么?是因为我使用的版本吗

Treinamentos:

import React from 'react';
import TreinamentosList from './TreinamentosList';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';

class Treinamentos extends React.Component {
  render() {
    return (
      <div>
        Treinamentos
        <TreinamentosList treinamentos={this.props.treinamentos} />
      </div>
    );
  }
}

Treinamentos.propTypes = {
  treinamentos: PropTypes.array.isRequired
}

function mapStateToProps(state) {
  return {
    treinamentos: state.treinamentos
  }
}

export default connect(mapStateToProps)(Treinamentos);
import React from 'react';
import PropTypes from 'prop-types';

export default function TreinamentosList({ treinamentos }) {
  const emptyMessage = (
    <p>Adicione um treinamento</p>
  );

  const treinamentosList = (
    <p>treinamentos list</p>
  );

  return (
    <div>
      {treinamentos.length === 0 ? emptyMessage : treinamentosList}
    </div>
  );
}

TreinamentosList.propTypes = {
  treinamentos: PropTypes.array.isRequired
}
从“React”导入React;
从“/TreinamentosList”导入TreinamentosList;
从'react redux'导入{connect};
从“道具类型”导入道具类型;
类Treinamentos扩展了React.Component{
render(){
返回(
特雷纳曼托斯
);
}
}
Treinamentos.propTypes={
treinamentos:PropTypes.array.isRequired
}
函数MapStateTops(状态){
返回{
treinamentos:state.treinamentos
}
}
导出默认连接(MapStateTops)(Treinamentos);
TreinamentosList:

import React from 'react';
import TreinamentosList from './TreinamentosList';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';

class Treinamentos extends React.Component {
  render() {
    return (
      <div>
        Treinamentos
        <TreinamentosList treinamentos={this.props.treinamentos} />
      </div>
    );
  }
}

Treinamentos.propTypes = {
  treinamentos: PropTypes.array.isRequired
}

function mapStateToProps(state) {
  return {
    treinamentos: state.treinamentos
  }
}

export default connect(mapStateToProps)(Treinamentos);
import React from 'react';
import PropTypes from 'prop-types';

export default function TreinamentosList({ treinamentos }) {
  const emptyMessage = (
    <p>Adicione um treinamento</p>
  );

  const treinamentosList = (
    <p>treinamentos list</p>
  );

  return (
    <div>
      {treinamentos.length === 0 ? emptyMessage : treinamentosList}
    </div>
  );
}

TreinamentosList.propTypes = {
  treinamentos: PropTypes.array.isRequired
}
从“React”导入React;
从“道具类型”导入道具类型;
导出默认函数TreinamentosList({treinamentos}){
常量空消息=(
阿迪西翁

); const treinamentosList=( 特里纳曼托斯名单

); 返回( {treinamentos.length==0?空消息:treinamentosList} ); } TreinamentosList.propTypes={ treinamentos:PropTypes.array.isRequired }
批准人:

import React from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import Greetings from './components/Greetings';
import SignUp from './components/singup/SignUp';
import NoMatch from './components/NoMatch';
import Treinamentos from './components/Treinamentos';
import NavigationBar from './components/NavigationBar';

const AppRouter = () => (
  <Router>
    <div className="container">
      <NavigationBar />
      <Switch>
        <Route path="/" component={Greetings} exact={true}/>
        <Route path="/signup" component={SignUp}/>
        <Route path="/treinamentos" component={Treinamentos}/>
        <Route component={NoMatch}/>
      </Switch>
    </div>
  </Router>
);

export default AppRouter;
从“React”导入React;
从“react Router dom”导入{BrowserRouter as Router,Route,Switch};
从“/组件/问候语”导入问候语;
从“./components/singup/SignUp”导入注册;
从“./components/NoMatch”导入NoMatch;
从“/components/Treinamentos”导入Treinamentos;
从“./components/NavigationBar”导入导航栏;
常量批准器=()=>(
);
导出默认批准程序;

当您从
treinamentos
reducer请求状态时,您肯定会收到一个空对象,您应该检查reducer,将treinamentos作为空数组返回作为初始状态(或任何您的业务逻辑需要的状态)

你有注册的名为“treinamentos”的减速器吗?@QuarK就是这样,我忘了减速器,谢谢