Почему это не функция React

Я написал этот код и создал метод конструктора

constructor(props) {
  super(props)

  this._addTodo = this._addTodo.bind(this);
  this._searchBar = this._searchBar.bind(this);
  this._removeTodo = this._removeTodo.bind(this);
}

тогда эта функция:

_addTodo() {
  var data = test.map(x => [x.name, x.price, ]);
  var searchField = $('.objectName').val();
  data.map(function(theTrue) {
    if (searchField === theTrue[0]) 
    {
      $('.objects')
      .append('<div class = "box"> <i className = "hvhv">' + $('.quantityObject').val() + ' </i><i> ' + $('.objectName').val() + ' </i><i> ' + $('.priceValue').text() + '</i><button onClick = {this._removeTodo()} className = "removeTodo">Remove</button></div>');
    }
  })
}

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

<button className = "addItem" onClick = {this._addTodo}>Add</button>

но когда я вызвал эту функцию:

_removeTodo(){
   console.info('work');
   $( ".box" ).remove();
}

Это написано :

Uncaught TypeError: this._removeTodo is not a function at HTMLButtonElement.onclick ((index):1) onclick @ (index):1

Вы либо используете jquery для управления DOM, либо React, но не то и другое вместе. Я не говорю, что их нельзя использовать вместе, но используя их вместе: 1. Смущает новичков. 2. Это признак того, что что-то делается очень-очень неправильно.

zerkms 06.06.2018 02:23

@zerkms Так как я могу это исправить?

Mrabet Iheb 06.06.2018 02:31

Вы не можете это исправить, вам нужно переопределить его с нуля с помощью React (если вы должны использовать реакцию).

zerkms 06.06.2018 02:32

@zerkms прав. использование jQuery в React полностью разрушает цель. Весь этот элемент div в функции карты может быть реализован в более чистом формате: D

Eddie D 06.06.2018 04:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
204
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Reactjs использует виртуальный дом, это создает дерево объектов на основе jsx и визуализирует в пользовательском интерфейсе. Здесь совершенно не предлагается манипулирование DOM с использованием jQuery. Если вы хотите отображать данные на основе условия, сделайте это для объектов reactjs, таких как состояние или реквизиты, не пытайтесь удалить элемент с помощью jQuery.

Вот пример того, как добавлять и удалять элемент, используя только Reactjs.

class App extends Component {
  state = {
    todo: [],
    name: '',
    quantity: '',
    price: '',
  }

  constructor(props) {
    super(props)

    this._addTodo = this._addTodo.bind(this);
    this._removeTodo = this._removeTodo.bind(this);
  }

  _addTodo(e) {
    e.preventDefault()

    const { todo, name, quantity, price } = this.state

    const newTodo = {
      name,
      quantity,
      price,
      id: Date.now(),
    }

    this.setState({
      todo: [...todo, newTodo],
    })
  }

  _removeTodo(item) {
    const { todo } = this.state

    let index

    index = todo.findIndex(x => x.id === item.id)
    todo.splice(index, 1)

    this.setState({
      todo,
    })
  }

  render() {
    return (
      <div>
        <form onSubmit = {this._addTodo}>
          <input type = "text" placeholder = "Name" value = {this.state.name} onChange = {e => this.setState({name: e.target.value})} />
          <input type = "text" placeholder = "Quantity" value = {this.state.quantity} onChange = {e => this.setState({quantity: e.target.value})} />
          <input type = "text" placeholder = "Price" value = {this.state.price} onChange = {e => this.setState({price: e.target.value})} />
          <button type = "submit" onClick = {this._addTodo}>Add</button>
        </form>
        <hr />
        <div>
          {this.state.todo.map(item => (
            <div className = "box">
              <i className = "hvhv">{item.quantity}</i>
              <i> {item.name} </i>
              <i>{item.price}</i>
              <button type = "button" onClick = {() => this._removeTodo(item)} className = "removeTodo">Remove</button>
            </div>
          ))}
        </div>
      </div>
    )
  }
}

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