【问题标题】:Error: Super expression must either be null or a function错误:超级表达式必须为空或函数
【发布时间】:2019-07-11 19:00:24
【问题描述】:

问题

所以正如标题所说,我在 todoapp 中遇到了这个问题。我检查了我是否有一些错字,比如react 而不是React,它似乎没问题。

在发布之前我检查过:

First post stackoverflow

Second post stackoverflow

但我找不到解决办法

代码

App.js

import React, {Component} from 'react';
import Form from './Components/Form';
import Footer from './Components/Footer';
import Header from './Components/Header';


class App extends React{
  constructor(props) {
      this.state = {
          todoValue: "",
          filterType: "All",
          todos: [],
      }
  }

  handleChange = (event) => {
      this.setState({
          todoValue: event.target.value,
      })
  }

  handleClick = (event) => {
      event.preventDefault();
      if (this.state.todoValue !== "") {
          const todo = {
              id: Date.now(),
              text: this.state.todoValue,
              done: false,
          }
          this.setState({
              todoValue: "",
              todos: [todo, ...this.state.todos],
          })
      }
  }

  handleToggle = (id) => {
      this.setState((prevState) => {
          return {
              todos: prevState.todos.map((item, i) => {
                  if (item.id === id) {
                      return {
                          ...item,
                          done: !prevState.todos[i].done,
                      }
                  }
                  return item;
              })
          }
      })
  }

  handleDelete = (id) => {
      this.setState({
          todos: this.state.todos.filter(item => item.id !== id)
      })
  }

  deleteCompleted = () => {
      this.setState({
          todos: this.state.todos.filter(item => !item.done)
      })
  }

  getVisibleTodos = () => {
      const filterType = this.state.filterType;
      let filterState = null;
      switch (filterType) {
            case "Completed":
                return filterState = this.state.todos.filter(item => item.done);
            case "Active":
                return filterState = this.state.todos.filter(item => !item.done);
            case "Originals":
                return filterState = this.state.todos.filter(item => !item.done);
            case "New":
                return filterState = this.state.todos.filter(item => !item.done);
            default:
                 return filterState = this.state.todos;
      }
  }

  setActiveFilter = (text) => {
      this.setState({
          filterType: text,
      })
  }

  render() {
      return (
          <div className="container">
              <Header countTodo={this.state.todos.length}/>
              <Form handleDelete={this.handleDelete} 
                   handleToggle={this.handleToggle}
                   handleClick={this.handleClick} 
                   handleChange={this.handleChange} 
                   todoValue={this.state.todoValue} 
                   todos={this.getVisibleTodos()}/>
              <Footer setActiveFilter={this.setActiveFilter} 
                   deleteCompleted={this.deleteCompleted} 
                   filter={this.state.filterType}/>
          </div>
      )
  }
}

export default App;

Header.js

import React from 'react';

class Header extends React.Component {
    render() {
        return (
            <header className="header">
                <h3>All To-Do {this.props.countTodo}</h3>
            </header>
        )
    }
}

export default Header;

Form.js

import React, {Component} from'react';
import Todo from './Todo';

class Form extends React {
    render() {
        return (
            <form className="form">
                <input type="text"
                    className="form__input" 
                    placeholder="Items" 
                    onChange={this.props.handleChange} 
                    value={this.props.todoValue}
                    />

                <button 
                    className="form__button"
                    type="submit" 
                    onClick={this.props.handleClick}>╋</button>

                <Todo 
                    todos={this.props.todos} 
                    handleToggle={this.props.handleToggle} 
                    handleDelete={this.props.handleDelete}
                    />
            </form>
        )
    }
}

export default Form;

最后一个模块是 Todo.js

import React, {Component} from 'react';

class Todo extends React{
    render() {
        return (
            <ul className="todos-list">
                {
                    this.props.todos.map((item) => {
                        return (
                            <li className="todo-item" 
                                key={item.id} onClick={() => this.props.handleToggle(item.id)}>
                                <span 
                                    className={item.done ? "todo-item__name disabled" : "todo-item__name"}>
                                    {item.text}
                                </span>
                                <span 
                                    className="todo-item__delete-button" 
                                    onClick={() => this.props.handleDelete(item.id)}>
                                    ×
                                </span>
                            </li>
                        )
                    })


                }
            </ul>
        )
    }
}

export default Todo;

【问题讨论】:

    标签: reactjs jsx


    【解决方案1】:

    你没有正确扩展你的 App 组件

    class App extends React{ // error here
    
      constructor(props) {
          this.state = {
              todoValue: "",
              filterType: "All",
              todos: [],
          }
      }
    

    React.Component扩展它

    class App extends React.Component {
      constructor(props) {
          super(props); // use super here
          this.state = {
              todoValue: "",
              filterType: "All",
              todos: [],
          }
      }
    

    【讨论】:

    • 两个答案都是正确的,如果我帮助Atin获得分数,会不会冒犯您?你们俩都应该得到绿色支票,但我只能给一张。
    • @Legeo,无论哪个答案对您更有帮助,您都可以将其标记为正确。没有问题
    【解决方案2】:

    你的类应该从你从 react 库中导入的组件扩展。

    应该是

    class App extends Component{}
    

    或者如果你没有导入组件,那么

    class App extends React.Component{}
    

    【讨论】:

      猜你喜欢
      • 2016-09-23
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多