如何修复 React 上的产品过滤?

叶夫尼

我有反应组件:

主要的.jsx

import React from "react";
import { Products } from "../Products";
import { Filter } from "../Filter";

class Main extends React.Component {
  state = {
    products: [],
    filteredProducts: [],
    status: "all",
  };

  onFilterStatusChange = (status) => {
    this.setState({ status });
  };

  componentDidMount() {
    fetch("./products.json")
      .then((responce) => responce.json())
      .then((data) => this.setState({ products: Object.values(data) }));
  }

  filterProducts() {
    this.setState(({ status }) => ({
      filteredProducts:
        status === "all"
          ? this.state.products
          : this.state.products.filter((n) => n.prod_status?.includes(status)),
    }));
  }

  componentDidUpdate(prevProps, prevState) {
    if (
      this.state.status !== prevState.status ||
      this.state.products !== prevState.products
    ) {
      this.filterProducts();
    }
  }

  render() {
    return (
      <main className="container content">
        <Filter
          values={[
            "all",
            "recommended",
            "promotion",
            "saleout",
            "bestseller",
            "new",
          ]}
          value={this.state.status}
          onChange={this.onFilterStatusChange}
        />
        <Products products={this.state.filteredProducts} />
      </main>
    );
  }
}

export { Main };

过滤器.jsx

import statusMap from "../statusMap";

const Filter = ({ values, value, onChange }) => (
  <div className="row filter_container">
    <h3 className="filter_title">Sortować według</h3>
    <div className="input-field col s12">
      <select className="status_select">
        {values.map((n) => (
          <option onChange={() => onChange(n)} value={value === n} key={n}>
            {statusMap.get(n)}
          </option>
        ))}
      </select>
    </div>
  </div>
);

export { Filter };

问题是选择不响应值的变化,因此不显示过滤的产品。我想我搞砸了属性

过滤器用于类型="radio"。在我尝试重做过滤器(将 type="radio" 更改为 )后,他停止了工作。这是 Filter.jsx 在更改为 select 之前的样子:

{values.map((n) => (
        <label>
          <input
            className="with-gap"
            type="radio"
            onChange={() => onChange(n)}
            checked={value === n}
          />
          <span>{statusMap.get(n)}</span>
        </label>
      ))}

请帮我修复这个过滤器

阿隆·巴伦博伊姆

您的代码中有几个问题:

  • onChange事件是在select元素上触发的,而不是在option元素上触发的。
  • value={value === n},根据您的代码,value是一个字符串,我假设它代表 的默认值select,并且n是 map 函数中的当前值,这意味着 value 属性是一个布尔值,但您需要它是每个值的唯一值选项。至于默认选择值 - 在 React 中您可以使用该selected属性
  • 我还建议您使用该key属性的索引。

我对您的代码进行了一些调整以尝试解决您的问题,或者至少帮助您找到它。我无法测试它,因为我没有statusMap你的所以它。

import React from "react";

class App extends React.Component {
  state = {
    products: [],
    filteredProducts: [],
    status: "all",
  };

  onFilterStatusChange = (status) => {
    this.setState({ status });
  };

  componentDidMount() {
    fetch("./products.json")
      .then((responce) => responce.json())
      .then((data) => this.setState({ products: Object.values(data) }));
  }

  filterProducts() {
    this.setState(({ status }) => ({
      filteredProducts:
        status === "all"
          ? this.state.products
          : this.state.products.filter((n) => n.prod_status?.includes(status)),
    }));
  }

  componentDidUpdate(prevProps, prevState) {
    if (
      this.state.status !== prevState.status ||
      this.state.products !== prevState.products
    ) {
      this.filterProducts();
    }
  }

  render() {
    return (
      <main className="container content">
        <Filter
          values={[
            "all",
            "recommended",
            "promotion",
            "saleout",
            "bestseller",
            "new",
          ]}
          value={this.state.status}
          onFilterChange={this.onFilterStatusChange}
        />
        <Products products={this.state.filteredProducts} />
      </main>
    );
  }
}

export { App };


const Filter = ({ values, currentValue, onFilterChange }) => (
  <div className='row filter_container'>
    <h3 className='filter_title'>Sortować według</h3>
    <div className='input-field col s12'>
      <select
        className='status_select'
        onChange={(e) => onFilterChange(e.target.value)}
        selected={currentValue}
      >
        {values.map((val, index) => (
          <option value={val} key={index}>
            {statusMap.get(val)}
          </option>
        ))}
      </select>
    </div>
  </div>
);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何修复我在 React 中对产品的过滤

如何修复 React 上的过滤(地图)

如何使用AJAX创建Woocommerce产品过滤器?

如何做产品过滤器(laravel)

如何使用 JSON 文件开发具有多个下拉列表的现场产品过滤程序?

如何在Django的产品过滤器函数中获取公司名称?

如何在 Laravel 控制器中加入产品过滤器查询?

淘汰产品过滤

如何修复不会在退格键上更新的React搜索过滤器

如何使用React Native修复iOS上的边界半径?

如何修复 React Native Galio-Framework 上损坏的图标?

产品过滤器

如何修复 Todo React 的 toggleComplete

如何修复 react.js 中 onChange 事件的数据过滤问题

如何在两次单击按钮上修复React状态更新?

如何修复在create-react-app项目上未定义错误'FB'的no-undef?

如何修复未定义不是React Native中setState上的对象

如何使用 React 和 Material io 在 Ipad 或移动设备上修复焦点背景颜色

如何修复 React-Native run-android 上的构建失败?

Woocommerce 3.0 相关产品过滤

如何在 SQL 中建立产品过期时间?

如何修复 React Router 问题的 webpack 文件?

如何修复 React ' is not defined no-undef'?

如何修复 React Native 中的 ReactNavigation 错误

如何使用 scss (with react) 修复 div 宽度

如何修复 React 中的“TypeError:moment is not a function”?

如何修复 ViewHolder 上的“NullPointerException”?

如何修复 TypeError:无法读取未定义的属性“randomProperty”+警告“无法在未安装的组件上执行 React 状态更新”

如何修复[对象:null原型] {标题:'产品'}