#ruby-on-rails #reactjs #react-rails
#ruby-on-rails #reactjs #react-rails
Вопрос:
Я использую rails 5.1.7 с драгоценным камнем react-rails, имея компонент react в одном из моих представлений erb с помощью помощника react_component(). Я пытаюсь заставить событие onChange работать, но функция никак не реагирует. Я должен иметь возможность просматривать журнал консоли, но я его не вижу.
import React from "react"
import PropTypes from "prop-types"
class CardList extends React.Component {
constructor(props) {
super(props);
this.state = {
all_cards: this.props.all_cards,
orderBy: 'all',
};
this.handleChange = this.handleChange.bind(this);
}
handleChange(event) {
console.log('change was made');
}
render () {
const allData = this.state.all_cards.map((card, index) => (
<div className="col-md-12">
{ card.category }
</div>
));
return (
<React.Fragment>
<label for="order">Order</label>
<select onChange={this.handleChange} name="order" id="order_filter">
<option value="element1">element1</option>
<option value="element2">element2</option>
</select>
{allData}
</React.Fragment>
);
}
}
CardList.propTypes = {
all_cards: PropTypes.array
};
export default CardList
Компонент вызывается, на мой взгляд, как:
<%= react_component("cardlist", { all_cards: @all_cards }, {prerender: true}) %>
Если я попытаюсь добавить следующее к serverRendering.js файл:
ReactRailsUJS.mountComponents()
Я получаю эту ошибку на странице, которую должен монтировать компонент:
ExecJS::ProgramError in Cards#index
ReferenceError: document is not defined
Я также пытался React.Fragment
заменить <div>
тегом или изменить состояние в handleChange
Комментарии:
1. Ваш код работает, возможно, проблема в том, как вы вызываете этот код с помощью react_component . Попробуйте выполнить другое действие в вашей функции, например, оповещение или перенаправление. Я не знаю, как работает этот react_component, но это может быть ограничением.
Ответ №1:
Это может быть проблема с тем, как компоненты монтируются на .erb
. Я создал репозиторий, чтобы продемонстрировать, как правильно настроить react-rails
ваш проект. И чтобы справиться с функциональностью поиска / фильтрации, ознакомьтесь с этим коммитом .
В двух словах,
- Убедитесь, что вы передаете правильное имя компонента
react_components
. В моем случае я прошелApp
в качестве основного компонента. Смотрите здесь . - Убедитесь, что все компоненты экспортируются автоматически. В этом случае используйте
react_ujs
, как показано здесь . Мое имя папки компонентовcomponents
— вот почему я используюconst componentRequireContext = require.context('components', true);
Комментарии:
1. Итак, она, наконец, работает после добавления `<% = javascript_pack_tag ‘application’%>` в правильную компоновку приложения (поскольку их было несколько, и я добавил их только в application.html.erb). Главное было бы, чтобы консоль не
Hello World from Webpacker
выдавала сообщение, как только я добавил javascript_pack_tag в нужное место, где он был показан
Ответ №2:
в элементе попробуйте использовать onInput
вместо onChange
тега, это может работать так, как вы хотите.
Комментарии:
1. попробуйте удалить
this.handleChange = this.handleChange.bind(this);
, потому что это выглядит ненужным2. никаких изменений, удаляющих
this.handleChange = this.handleChange.bind(this);
3. вместо
this.handleChange = this.handleChange.bind(this);
того, чтобы пытаться делатьthis.handleChange = event => {console.log('change was made')}
4. Я пробовал, и это не работает. Я думаю, это может быть связано с тем фактом, что я добавляю компонент с помощью помощника react_component, а для параметра prerender установлено значение true. github.com/reactjs/react-rails#view-helper