又是我。开门见山: 我的应用程序中有 3 个搜索字段(下拉值选择)来过滤将向用户显示的产品。默认值应该是“任何”,所以如果每个字段都选择了“任何”,它只会从数据库中显示每个产品,如果只有其中一个选择了“任何”,则该搜索条件将被忽略,并且每个产品将显示该字段的任何值。 听起来很简单,但我就是找不到正确的方法,所以我又来了,希望你能帮助我
搜索字段:
const [subject, setSubject] = useState('');
const [status, setStatus] = useState('');
const [district, setDistrict] = useState('');
const handleChange1 = (event) => {
setSubject(event.target.value);
};
const handleChange2 = (event) => {
setStatus(event.target.value);
};
const handleChange3 = (event) => {
setDistrict(event.target.value);
};
<FormControl fullWidth>
<Select
value={subject}
label="subject"
onChange={handleChange3}
>
<MenuItem value={''}>all</MenuItem>
<MenuItem value={'opt1'}>1</MenuItem>
<MenuItem value={'opt2'}>2</MenuItem>
<MenuItem value={'opt3'}>3</MenuItem>
</Select>
</FormControl>
<FormControl fullWidth>
<Select
value={status}
label="status"
onChange={handleChange3}
>
<MenuItem value={''}>all</MenuItem>
<MenuItem value={'opt1'}>1</MenuItem>
<MenuItem value={'opt2'}>2</MenuItem>
<MenuItem value={'opt3'}>3</MenuItem>
</Select>
</FormControl>
<FormControl fullWidth>
<Select
value={district}
label="location"
onChange={handleChange3}
>
<MenuItem value={''}>all</MenuItem>
<MenuItem value={'opt1'}>1</MenuItem>
<MenuItem value={'opt2'}>2</MenuItem>
<MenuItem value={'opt3'}>3</MenuItem>
</Select>
</FormControl>
<TutorList subject={subject} status={status} district={district} />
产品加载的页面:
const TutorList = (props) => {
const [tutors, setTutors] = useState([])
useEffect(() => {
const fetchTutors = async () => {
const data = await axios.get(`/api/v1/user/search`, {
params: {
subject: props.subject,
status: props.status,
district: props.district
}
})
setTutors(data.data.users)
}
fetchTutors()
}, [props])
return (
<Fragment>
{tutors.map((tutor) => (
...
))}
</Fragment>
)
}
后端:
exports.search = async (request, response, next) => {
const subjectName = request.query.subject
const statusName = request.query.status
const districtName = request.query.district
const users = await User.find({
subject: subjectName,
district: districtName,
students: statusName
})
if (!users) {
return next(
new ErrorResponse(`Users with these parameters don't exist`, 404)
)
}
response.status(200).json({ success: true, users: users })
}
对此有什么想法吗?如果所有字段都指定了值,则它工作得很好,但当其中一个搜索字段为空(选择了“any”选项)时,它会停止工作。
您似乎想要过滤值为
''
或 false 值的查询参数。
例如如果
district
是 ''
,则会被过滤。
const request = {
query: {
subject: '1',
status: 'ok',
district: ''
}
}
const query = Object.fromEntries(Object.entries(request.query).filter(value => value[1]))
console.log(query)
// User.find(query)