You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MERN栈(React+Express)房产应用URL参数过滤实现求助

MERN栈公寓数据URL参数过滤示例

后端(Express + Mongoose)

核心逻辑:解析URL查询参数,动态构建Mongoose过滤条件,返回匹配数据。

// routes/apartments.js
const express = require('express');
const router = express.Router();
const Apartment = require('../models/Apartment'); // 模型需包含price、area、buildingType字段

router.get('/', async (req, res) => {
  try {
    const filter = {};

    // 价格过滤:支持精确匹配或范围查询
    if (req.query.price) {
      filter.price = parseInt(req.query.price);
    }
    if (req.query.minPrice && req.query.maxPrice) {
      filter.price = {
        $gte: parseInt(req.query.minPrice),
        $lte: parseInt(req.query.maxPrice)
      };
    }

    // 区域过滤:精确匹配,如需模糊查询可改用$regex
    if (req.query.area) {
      filter.area = req.query.area;
    }

    // 建筑类型过滤
    if (req.query.type) {
      filter.buildingType = req.query.type;
    }

    const apartments = await Apartment.find(filter);
    res.json(apartments);
  } catch (err) {
    res.status(500).json({ message: '查询失败:' + err.message });
  }
});

module.exports = router;

前端(React + React Router)

核心逻辑:同步URL参数与组件状态,监听参数变化自动请求数据,用户操作时更新URL参数。

import { useState, useEffect } from 'react';
import { useSearchParams } from 'react-router-dom';

const ApartmentsList = () => {
  const [apartments, setApartments] = useState([]);
  const [searchParams, setSearchParams] = useSearchParams();

  // 初始化过滤状态,与URL参数同步
  const [filters, setFilters] = useState({
    price: searchParams.get('price') || '',
    area: searchParams.get('area') || '',
    type: searchParams.get('type') || ''
  });

  // URL参数或过滤状态变化时,重新请求数据
  useEffect(() => {
    const fetchData = async () => {
      const queryStr = new URLSearchParams(filters).toString();
      const res = await fetch(`/api/apartments?${queryStr}`);
      const data = await res.json();
      setApartments(data);
    };
    fetchData();
  }, [filters]);

  // 处理过滤条件变更,同步到URL和组件状态
  const handleFilterChange = (e) => {
    const { name, value } = e.target;
    const newFilters = { ...filters, [name]: value };
    setFilters(newFilters);
    setSearchParams(newFilters);
  };

  return (
    <div>
      {/* 过滤表单 */}
      <div className="filter-bar">
        <input
          type="number"
          name="price"
          value={filters.price}
          onChange={handleFilterChange}
          placeholder="精确价格"
        />
        <input
          type="text"
          name="area"
          value={filters.area}
          onChange={handleFilterChange}
          placeholder="区域"
        />
        <select name="type" value={filters.type} onChange={handleFilterChange}>
          <option value="">全部类型</option>
          <option value="apartment">公寓</option>
          <option value="villa">别墅</option>
          <option value="townhouse">联排</option>
        </select>
      </div>

      {/* 公寓列表展示 */}
      <div className="apartment-grid">
        {apartments.map(apt => (
          <div key={apt._id} className="apartment-card">
            <h3>{apt.title}</h3>
            <p>¥{apt.price}/月</p>
            <p>区域:{apt.area}</p>
            <p>类型:{apt.buildingType}</p>
          </div>
        ))}
      </div>
    </div>
  );
};

export default ApartmentsList;

关键注意点

  • 后端需做好类型转换,避免字符串类型参数传入Mongoose数字字段导致查询失败
  • 前端使用useSearchParams保证URL参数与组件状态双向同步,解决手动修改URL无响应的问题
  • 可根据需求扩展过滤逻辑,比如价格范围、区域模糊匹配等

内容的提问来源于stack exchange,提问作者Kira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:00:29