TypeError: this.getdataSource не является функцией

Я пытаюсь разрешить РЕДАКЦИЮ в моем списке данных API. Это позволяет мне редактировать запись списка, однако, когда я отправляю издание, я получаю сообщение об ошибке, что

   `this.getDataSource();`

не является функцией. Я пытаюсь отладить это в течение некоторого времени, но мне не повезло.

Кроме того, если бы у кого-то был совет или руководство о том, как сделать это полностью работающим приложением CRUD, которое позволяет отправлять новые записи POST обратно в API, а также позволяет помещать выпуски обратно в этот API, это было бы здорово . Я не уверен, должен ли я изменить свой запрос на выборку или я полностью ошибаюсь.

Любая помощь будет оценена!!!

My App.js code-

import React, { Component } from 'react';
import './App.css';
import AddItem from './AddItem';
import SingleItem from './singleItem';

class App extends Component {

  constructor(props) {
    super(props);
    this.state = {
      dataSource: [],
      isLoaded: false,
    }
    this.onAdd = this.onAdd.bind(this);
    this.onEditSubmit = this.onEditSubmit.bind(this);
  }

  componentDidMount() {
    this.getDataSource();

  }

  getDataSource() {
    return fetch('https://beer.fluentcloud.com/v1/beer')
      .then(response => response.json())
      .then(responseJson => {
        this.setState({
          isLoaded: true,
          dataSource: responseJson,
        });
        return responseJson;
      })
      .catch(error => console.info(error)); //to catch the errors if any
  }
onAdd( name, likes) {
  const dataSource = this.getDataSource();
    dataSource.then(json => {
      json.push({
        name,
        likes
      });
      this.setState({dataSource: json});
    });
}


onEditSubmit (name, likes, originalName) {
    let dataSource = this.getdataSource();

    dataSource = dataSource.map((dataSource) => {
      if (dataSource.name === originalName) {
        dataSource.name = name;
        dataSource.likes = likes;
      }
      return dataSource;
    });
    this.setState({dataSource});
}

  render() {

    return (
      <div className = "App">
      <h1>What is in My Fridge?</h1>

      <AddItem
        onAdd = {this.onAdd}
      />

          {this.state.dataSource.map((dataSource) => (
            <SingleItem
              key = {dataSource.name}
              name = {dataSource.name}
              likes = {dataSource.likes}
              onEditSubmit = {this.onEditSubmit}
            />
          ))};




      </div>
    );
  }
}

export default App;

мой код компонента AddItem.js-

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

class AddItem extends Component {
  constructor(props) {
    super(props);

    this.onSubmit = this.onSubmit.bind(this);
  }

  onSubmit(event) {
    event.preventDefault();

    this.props.onAdd(this.nameInput.value, this.likesInput.value);
    this.nameInput.value = '';
    this.likesInput.value = '';
  }

  render() {
    return (
      <form onSubmit = {this.onSubmit}>
      <h3>Add Beer</h3>
        <input placeholder = "Name" ref = {nameInput => this.nameInput = nameInput} />
        <input placeholder = "Likes" ref = {likesInput => this.likesInput = likesInput}/>
        <button>Add</button>
        <hr />
      </form>
    );
  }
}

export default AddItem;

мой код singleItem.js -

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


class SingleItem extends Component {
  constructor(props) {
    super(props);

    this.state = {
      isEdit: false
    };


    this.onEdit = this.onEdit.bind(this);
    this.onEditSubmit = this.onEditSubmit.bind(this);
  }


  onEdit() {
    this.setState({ isEdit: true });
  }

  onEditSubmit(event) {
    event.preventDefault();

    this.props.onEditSubmit(this.nameInput.value, this.likesInput.value, this.props.name);
    this.setState({ isEdit: false });

  }

  render() {
    const { name, likes } = this.props;
    return (
      <div>
        {
          this.state.isEdit
            ? (
              <form onSubmit = {this.onEditSubmit}>
              <input placeholder = "Name" ref = {nameInput => this.nameInput = nameInput} defaultValue = {name}/>
              <input placeholder = "Likes" ref = {likesInput => this.likesInput = likesInput} defaultValue = {likes}/>
              <button>Save</button>
                </form>
            )
            :   (
              <div>
      <li>
        {name} | Likes:  {likes}
      </li>
      <button onClick = {this.onEdit}>Edit</button>

       </div>
)
}
      </div>
    );
  }
}

export default SingleItem;
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
793
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я думаю, что ваши вещи не в порядке, может быть? Вы можете попробовать это?

  getDataSource() {
    return fetch('https://beer.fluentcloud.com/v1/beer')
      .then(response => response.json())
      .then(responseJson => {
        this.setState({
          isLoaded: true,
          dataSource: responseJson,
        });
        return responseJson;
      })
      .catch(error => console.info(error)); //to catch the errors if any
  }
  componentDidMount() {
    this.getDataSource();

  }

Также вы должны просто использовать put или post, если вы редактируете или создаете запрос API, например:

fetch(''https://beer.fluentcloud.com/v1/beer'', {
  method: 'PUT',
  body: 'beer'
})

Хм. Я попытался перенастроить макет, как вы предложили. Выдает ту же ошибку.

dksmith328 04.04.2019 22:45

Вы уже пытались привязать эту функцию?

    this.getDataSource= this.getDataSource.bind(this);

Если вы хотите выполнять CRUD-операции, вы уже в пути, fetch API позволит вам публиковать и получать данные с сервера.

Вот пример использования fetch с методом POST:

var form = new FormData(document.getElementById('login-form'));
fetch("/login", {
  method: "POST",
  body: form
})

Надеюсь, поможет.

Черт, я пропустил это. Он мог связать или перейти на es6 с помощью функции getDataSource.

lakerskill 04.04.2019 23:08

@Chatmalow Я пытался связать, как было предложено. Все равно выдает ошибку. Это кажется отличным предложением. Может быть, я помещаю его в неправильный метод. Я добавил его в конструктор с остальными на биндах.

dksmith328 04.04.2019 23:09
Ответ принят как подходящий

Внутри вашего App.js, внутри вашей функции onEditSubmit, вам нужно исправить случай верблюда в вызове функции: this.getDataSource() вместо этого, если this.getdataSource.

Надеюсь, это поможет!

Кажется, это позаботилось об этой ошибке! Спасибо. Однако теперь, когда я должен отправить это издание, я получаю сообщение об ошибке того же метода, говорящее, что dataSource.map не является функцией.

dksmith328 05.04.2019 18:49

Другие вопросы по теме