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

如何展示并应用房产筛选器(含排序、价格、房间数等过滤条件)

房产筛选功能实现方案

一、展示筛选器

基于你提供的filterDataBuy配置,我们可以用React状态管理渲染筛选组件,以下是完整实现:

import { useState } from 'react';
import { filterDataBuy } from './你的文件路径';

function PropertyFilters({ onFilterChange }) {
  // 初始化筛选值状态
  const [localFilters, setLocalFilters] = useState({
    minPrice: '',
    maxPrice: '',
    sort: '',
    roomsMin: '',
    bathsMin: ''
  });

  // 处理筛选值变化
  const handleChange = (queryName, value) => {
    const newFilters = { ...localFilters, [queryName]: value };
    setLocalFilters(newFilters);
    // 将筛选值传递给父组件
    onFilterChange(newFilters);
  };

  return (
    <div style={{ display: 'flex', gap: '1rem', padding: '1rem' }}>
      {filterDataBuy.map((filter, index) => (
        <select
          key={index}
          value={localFilters[filter.queryName]}
          onChange={(e) => handleChange(filter.queryName, e.target.value)}
          style={{ padding: '0.5rem', minWidth: '150px' }}
        >
          <option value="">{filter.placeholder}</option>
          {filter.items.map((item) => (
            <option key={item.value} value={item.value}>
              {item.name}
            </option>
          ))}
        </select>
      ))}
    </div>
  );
}

export default PropertyFilters;

这段代码会自动遍历filterDataBuy生成所有下拉筛选框,选中值同步到状态并传递给父组件。

二、实现数据过滤与排序

先处理原始数据的格式转换,再根据筛选条件过滤并排序:

1. 工具函数:转换数据格式

把字符串格式的数值转为可计算的数字:

// 处理价格:去掉$和.,转成数字
const parsePrice = (priceStr) => {
  return Number(priceStr.replace(/[$.]/g, ''));
};

// 处理房间/浴室数:提取数字部分
const parseRoomCount = (countStr) => {
  return Number(countStr.split(' ')[0]);
};

2. 过滤与排序主逻辑

在父组件中整合筛选器和数据展示:

import { useState, useEffect } from 'react';
import PropertyFilters from './PropertyFilters';
import PropertyData from './PropertyData';

function PropertyList() {
  const [filteredProperties, setFilteredProperties] = useState(PropertyData);
  const [currentFilters, setCurrentFilters] = useState({});

  useEffect(() => {
    let result = [...PropertyData];

    // 只保留售卖类型的房产
    result = result.filter(item => item.listingType === 'Buy');

    // 价格筛选
    if (currentFilters.minPrice) {
      const minPrice = Number(currentFilters.minPrice);
      result = result.filter(item => parsePrice(item.price) >= minPrice);
    }
    if (currentFilters.maxPrice) {
      const maxPrice = Number(currentFilters.maxPrice);
      result = result.filter(item => parsePrice(item.price) <= maxPrice);
    }

    // 房间数筛选
    if (currentFilters.roomsMin) {
      const minRooms = Number(currentFilters.roomsMin);
      result = result.filter(item => parseRoomCount(item.bedrooms) >= minRooms);
    }

    // 浴室数筛选
    if (currentFilters.bathsMin) {
      const minBaths = Number(currentFilters.bathsMin);
      result = result.filter(item => parseRoomCount(item.bath) >= minBaths);
    }

    // 排序逻辑
    if (currentFilters.sort) {
      switch (currentFilters.sort) {
        case 'price-asc':
          result.sort((a, b) => parsePrice(a.price) - parsePrice(b.price));
          break;
        case 'price-des':
          result.sort((a, b) => parsePrice(b.price) - parsePrice(a.price));
          break;
        // 若后续添加日期字段,可补充以下逻辑
        // case 'date-asc':
        //   result.sort((a, b) => new Date(a.date) - new Date(b.date));
        //   break;
        // case 'date-desc':
        //   result.sort((a, b) => new Date(b.date) - new Date(a.date));
        //   break;
        default:
          break;
      }
    }

    setFilteredProperties(result);
  }, [currentFilters]);

  return (
    <div>
      <PropertyFilters onFilterChange={setCurrentFilters} />
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(300px, 1fr))', gap: '1rem', padding: '1rem' }}>
        {filteredProperties.map((property) => (
          <div key={property.id} style={{ border: '1px solid #eee', padding: '1rem', borderRadius: '8px' }}>
            <img src={property.image} alt={property.heading} style={{ width: '100%', height: '200px', objectFit: 'cover' }} />
            <h3>{property.heading}</h3>
            <p>{property.price}</p>
            <p>{property.bedrooms} | {property.bath}</p>
            <p>{property.address}</p>
          </div>
        ))}
      </div>
    </div>
  );
}

export default PropertyList;

关键说明

  • 价格处理:针对样本数据的$1.000.000格式,通过正则去掉特殊字符转成纯数字,方便数值比较
  • 条件过滤:仅当筛选值存在时才应用对应规则,避免空值干扰结果
  • 排序扩展:若后续给房产数据添加日期字段,可直接补充日期排序的逻辑分支

内容的提问来源于stack exchange,提问作者Its.Chelle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:55:19