#javascript #reactjs #react-redux
#javascript #reactjs #react-redux
Вопрос:
Это компонент Owner (Owner.js ) где я внедряю фильтр поиска, который должен отображать ресторан с тем же названием, что и в поиске. Но когда я пытаюсь использовать ресторан и реализовать поиск по фильтру, он выдает ошибку. Я должен получить список ресторанов из моего ранее существующего списка ресторанов на панели управления владельцем.
import React, { Component } from "react";
import Restaurant from "../customer/Restaurant";
export default class Owner extends Component {
constructor() {
super();
this.state = {
search: ""
};
}
updateSearch(event) {
this.setState({
search: event.target.value.substr(0, 25)
});
}
render() {
let filteredRestaurants = this.props.restaurants;
return (
<div>
<h1> Welcome Owner </h1> <br />
<ul>
{" "}
{filteredRestaurants.map(res => {
return <restaurants res={<Restaurant />} key={res.name} />;
})}
</ul>{" "}
<input
type="text"
Value={this.state.search}
onChange={this.updateSearch.bind(this)}
/>{" "}
<Restaurant />
</div>
);
}
}
Это Restaurant.js которые отображают сведения о ресторане в Owner.js.
import React, { Component } from "react";
import { connect } from "react-redux";
import PropTypes from "prop-types";
import { getRestaurant } from "../../actions/getRestaurants";
export class Restaurant extends Component {
static propTypes = {
// restaurants: PropTypes.array.isRequired,
getRestaurantName: PropTypes.func
};
componentDidMount() {
this.props.getRestaurant();
}
render() {
const contentKeys = Object.keys(this.props.restaurants);
// console.log(JSON.parse(this.props.restaurants))
return (
<div className="row">
{contentKeys.map(t =>
[this.props.restaurants[t]].map(res => (
<div className="col-md">
<div className="card" style={cardWidth}>
<img className="card-img-top" src="..." alt="Card image cap" />
<div className="card-body">
<h5 className="card-title">{res.Name}</h5>
<p className="card-text">
<h6>{res.Address}</h6>
<h6>{res.City}</h6>
<h6>{res.zipcode}</h6>
<h6>Open:{res.Hours.Open}</h6>
<h6>Close:{res.Hours.Close}</h6>
</p>
<a href="#" className="btn btn-primary">
Go somewhere
</a>
</div>
</div>
</div>
))
)}
</div>
);
}
}
const cardWidth = {
width: "18rem"
};
const mapStateToProps = state => ({
restaurants: state.restaurantReducer.restaurants
});
export default connect(
mapStateToProps,
{ getRestaurant }
)(Restaurant);
//export default Restaurant;
У меня ошибка при фильтрации ресторана на панели управления владельцем. Оператор As return не возвращает никакого значения и приводит к ошибке.
{filteredRestaurants.map(res => {
return <restaurants res={<Restaurant />} key={res.name} />;
})}
Ответ №1:
Вы сохраняете поисковый запрос в состоянии, но не используете его при отображении filteredRestaurants.
Вы должны отфильтровать их перед сопоставлением. Что-то вроде этого:
const filteredRestaurants = this.props.restaurants.filter(res => res.name.includes(this.state.search);
// ...
filteredRestaurants.map(res => <Restaurant key={res.name} />)
Кроме того, вы можете сделать это намного проще с помощью React Hooks API, если используете React 16.8 .
Комментарии:
1. Спасибо за ответ. Но мой вариант возврата не работает. Моя функция возврата ничего не возвращает.
2. @madhavkoirala у вас есть другая ошибка? Я не проверял часть rest, поскольку вопрос касался функции поиска.
3. Да, моя функция поиска не возвращает никакого значения и приводит к ошибке.
4. вы заметили пример того, как .map должен возвращать компоненты в моем коде?
5. это мой возврат для фильтра поиска, и я использую restaurant из Restaurant.js. Поэтому я хочу вернуть ресторан в том же формате, который был до поиска по фильтру. ** {filteredRestaurants.map(res => {return <restaurants res={<Ресторан />} ключ={res.name} />;** })}`