繁体   English   中英

警告:道具类型失败:道具“ todos [0] .title”在“ TodoList”中标记为必需,但其值为“ undefined”

[英]Warning: Failed prop type: The prop `todos[0].title` is marked as required in `TodoList`, but its value is `undefined`

如您在图片中所见,我想为服务器添加标题,在此处输入图片说明

它可以使用值,但不能使用title,title在我的数组中,就像您可以在图片中看到的一样,但是它仍然会出现此错误,Props是在其他JS文件中定义的,请在此处寻求帮助

import React from 'react';
import todoInputProps from './TodoInput.props';

const TodoInput = (props) => {
  let input;
  const handleClick = () => {
    props.onAdd(input.value, input.title);
    input.title = '';
    input.value = '';

    input.focus();
  };

  return (
    <div>
      <input
        type="text"
        ref={(currentElement) => { input = currentElement; }}
        placeholder="title"
      />

      <input
        type="text"
        ref={(currentElement) => { input = currentElement; }}
        placeholder="value"
      />

      <button
        type="button"
        onClick={handleClick}
      >
      add item
      </button>
    </div>
  );
};

TodoInput.propTypes = todoInputProps;

export default TodoInput;

import React from 'react';

import todoItemProps from './TodoItem.props';
import './TodoItem.css';

const TodoItem = (props) => {
  const remove = () => {
    props.onRemove(props.id);
  };

  const animateClass = props.animate ? 'added-item' : '';
  return (
    <li className={`TodoItem-item ${animateClass}`}>
      <div className="TodoItem-value">{props.value}</div>
      <div className="TodoItem-title">{props.title}</div>
      <button
        onClick={remove}
      >
      X
      </button>
    </li>
  );
};

TodoItem.propTypes = todoItemProps;

export default TodoItem;

我的待办事项清单

import React from 'react';

import TodoItem from './components/TodoItem';
import todoListProps from './TodoList.props';
import './TodoList.css';

class TodoList extends React.Component {
  constructor() {
    super();
    this.state = {};
    this.handleRemove = this.handleRemove.bind(this);
  }

  componentWillReceiveProps(nextProps) {
    nextProps.todos.forEach((todo) => {
      const oldValue = this.props.todos.find(oldTodo => oldTodo.id === todo.id);
      const isNewTodo = typeof oldValue === 'undefined';
      if (isNewTodo) {
        this.setState({ addedId: todo.id });
      }
    });
  }

  handleRemove(id) {
    this.props.onItemRemove(id);
  }

  render() {
    return (
      <ul className="TodoList">
        {
          this.props.todos.map(todoItem => (
            <TodoItem
              animate
              key={todoItem.id}
              id={todoItem.id}
              value={todoItem.value}
              title={todoItem.title}
              onRemove={this.handleRemove}
            />
          ))
        }
      </ul>
    );
  }
}

TodoList.propTypes = todoListProps;

export default TodoList;

我的容器看起来像这样

import React from 'react';

import TodoInput from './components/TodoInput';
import TodoList from './components/TodoList';
import { getAll, add, remove } from '../../../utils/todo';
import './TodoContainer.css';

class TodoContainer extends React.Component {
  constructor() {
    super();
    this.state = {
      todos: [],
    };
    this.handleRemove = this.handleRemove.bind(this);
    this.handleAdd = this.handleAdd.bind(this);
  }

  componentDidMount() {
    getAll().then((todos) => {
      this.setState({ todos });
    });
  }

  handleAdd(value, title) {
    add(value, title).then((id) => {
      this.setState({
        todos: this.state.todos.concat([{
          id,
          value,
          title,
        }]),
      });
    });
  }

  handleRemove(id) {
    remove(id).then(() => {
      this.setState({
        todos: this.state.todos.filter(todoItem => todoItem.id !== id),
      });
    });
  }

  render() {
    return (
      <div className="TodoContainer-wrapper">
        <TodoInput onAdd={this.handleAdd} />
        <TodoList
          todos={this.state.todos}
          onItemRemove={this.handleRemove}
        />
      </div>
    );
  }
}

export default TodoContainer;

问题是在TodoInput ,您尝试对两个React实例使用一个变量input 这是TodoInput的更正代码:

const TodoInput = (props) => {
  let inputTitle, inputValue;
  const handleClick = () => {
    props.onAdd(inputTitle.value, inputValue.value);
    inputTitle.value = '';
    inputValue.value = '';

    input.focus();
  };

  return (
    <div>
      <input
        type="text"
        ref={(currentElement) => { inputTitle = currentElement; }}
        placeholder="title"
      />

      <input
        type="text"
        ref={(currentElement) => { inputValue = currentElement; }}
        placeholder="value"
      />

      <button
        type="button"
        onClick={handleClick}
      >
      add item
      </button>
    </div>
  );
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM