javascript - react.js 如何实现多输入搜索?
问题描述
我正在构建一个预订酒店应用程序,我正在尝试使用 react.js 通过多个输入来实现搜索。我尝试使用下面的代码,但有两个错误:
第一个错误:每当我更改房间类型的值或客人数量时,我都会得到前一个状态的结果,我总是得到前一个状态的结果。搜索工作正常,但它使用前一个状态。第二个错误:如何实现对象的两个结果的交集。
或者,如果有人可以提供更好的解决方案。
import React, { useState } from 'react';
import './SearchPage.css';
import RoomList from './RoomList';
import { v4 as uuidv4 } from 'uuid';
const SearchPage = () => {
const Rooms = [
{
id: uuidv4(),
description: 'Chnambre du luxe 1',
size: 250,
guests: '4',
roomType: 'family room',
pets: false,
picture: 'pictures/pic.jfif',
price: 1000,
},
{
id: uuidv4(),
description: 'chambre du lux2',
picture: 'pictures/pic2.jfif',
price: 2000,
size: 300,
guests: '4',
roomType: 'single room',
pets: true,
},
{
id: uuidv4(),
description: 'chambre du luxe 3',
picture: 'pictures/pic2.jfif',
price: 2500,
size: 350,
guests: '2',
roomType: 'family room',
pets: true,
},
];
const [foundRooms, setFoundRooms] = useState(Rooms);
const [roomType, setRoomType] = useState('All');
const [guestNumber, setGuestNumber] = useState('0');
const HandleGuestNumber = (state) => {
const results = Rooms.filter((room) => room.guests === state);
return results;
};
const HandleRoomType = (state) => {
let results = [];
results = Rooms.filter((room) => {
let rooms = room.roomType.match(state);
return rooms;
});
return results;
};
const HandleOnChange = (event) => {
switch (event.target.name) {
case 'roomType':
setRoomType(event.target.value);
break;
case 'guestNumber':
setGuestNumber(event.target.value);
break;
default:
console.log(`Sorry, we are out of.`);
}
let foundRooms = HandleRoomType(roomType) && HandleGuestNumber(guestNumber);
setFoundRooms(foundRooms);
};
return (
<div>
<div className="SearchPage">
<h1> Search</h1>
</div>
<div className="SearchContainers">
<div className="SearchItem">
<span>Room Type : </span>
<select onChange={HandleOnChange} name="roomType">
<option value="All">All</option>
<option value="family room">Family Room</option>
<option value="single room">Single Room</option>
<option value="Luxiourious Family Room">
Luxiourious Family Room
</option>
<option value="Luxiourious Single Room">
Luxiourious Single Room
</option>
</select>
</div>
<div className="SearchItem">
<span> Guests : </span>
<select onChange={HandleOnChange} name="guestNumber">
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
</div>
</div>
);
};
export default SearchPage;
解决方案
在您的HandleOnChange
功能中,您正在执行以下操作:
let foundRooms = HandleRoomType(roomType) && HandleGuestNumber(guestNumber);
setFoundRooms(foundRooms);
这几乎肯定不是你认为它正在做的事情。
由于HandleRoomType
总是返回一个数组,所以foundRooms
总是计算为HandleGuestNumber(guestNumber)
.
听起来您想foundRooms
成为包含在两者返回的数组中的房间HandleRoomType
和HandleGuestNumber
。
你可以做到这一点的一种方法是做另一个过滤器。
const roomsMatchingType = HandleRoomType(roomType)
const roomsMatchingGuestNumber = HandleGuestNumber(guestNumber)
const intersection = Rooms.filter(room => roomsMatchingType.some(r => r.id === room.id) && roomsMatchingGuestNumber.some(r => r.id === room.id))
推荐阅读
- java - 使用 ifPresentOrElse lamba 函数时的无异常返回值
- javascript - 在 Gatsby 中为 React 代码添加嵌套映射
- python-3.x - 如何 zmq.poll() 一些套接字和某种变量?
- r - 如何使用 chr 转换器制作 data.frame
- algorithm - 具有未知节点对应关系的图相似性度量
- azure - Azure 搜索索引器不会获取到 null 的更新
- java - 如何将值从 Observable 返回到 Rxjava 2
- java - Java - 嵌套在类中的自定义类型
- oracle - Oracle PLSQL,在 DBMS_STATS.GATHER_SCHEMA_STATS 中选择
- security - freenas 在控制台上更改密码 - 缺少旧密码的问题