错误 - 在反应搜索组件中呈现多个实例

Posted

技术标签:

【中文标题】错误 - 在反应搜索组件中呈现多个实例【英文标题】:Error - Rendering multiple instances in react search component 【发布时间】:2021-09-09 21:10:29 【问题描述】:

我正在构建一个搜索组件,用户在其中输入值,它会过滤一些虚拟数据并呈现结果供用户查看。问题是当我在搜索字段中输入一个字符时,我会得到我输入的每个字符的整个数据数组。例如,数组中有 4 个数据字符串,所以如果我在搜索栏中输入两个字符,那么我的结果是 8。

Here is the code and the problem duplicated: 感谢您的帮助。

【问题讨论】:

【参考方案1】:

答案如下,基本上,代码是从CompanyInfoList component 加载到一个额外的地图中。我还有一个在同一个组件中不需要的 useContext,因此我将其删除并将results.mapuseContext setState hook 替换为filtered.map。 filters 是需要从CompSearch 传递到CompanyInfoList. 的道具我做的最后一个更改是删除RenderList component 并删除serachList componentCompanyInfoList 中的return RenderList

CompSearch.js

import React, useContext, useState from "react";
import CompanyInfoList from "./CompanyInfoList";
import  CompListContext  from "./CompListContext";

const CompSerach = () => 
    // const [input, setInput] = useState('');
    const [results, setResults] = useContext(CompListContext);
    const [searchField, setSearchField] = useState("");
    const [searchShow, setSearchShow] = useState(false);

    const filtered = results.filter((res) => 
        return (
        res.name.toLowerCase().includes(searchField.toLowerCase()) ||
        res.employee.toLowerCase().includes(searchField.toLowerCase()) ||
        res.date.toLowerCase().includes(searchField.toLowerCase()) ||
        res.amount.toLowerCase().includes(searchField.toLowerCase())
        );
      );
      
    const handleChange = (e) => 
        setSearchField(e.target.value);
        if (e.target.value === "") 
          setSearchShow(false);
         else 
          setSearchShow(true);
        
      ;

      function searchList() 
        if (searchShow) 
          return <CompanyInfoList filtered=filtered />;
        
      

  return (
    <>
      <div>
        <input
          type="search"
          placeholder="search Company Title"
          //   input="input"
          //   value=input
          onChange=handleChange
          // onChange=handleChange
        />
      </div>
      searchList()
    </>
  );
;

export default CompSerach;

CompanyInfoList.js

import Results from "./Results";

const CompanyInfoList = ( filtered ) => 
  const fltr = filtered.map((result) => (
    <Results
      key=result.id
      name=result.name
      employee=result.employee
      date=result.date
      amount=result.amount
    />
  ));
  return <div>fltr</div>;
;
export default CompanyInfoList;

【讨论】:

以上是关于错误 - 在反应搜索组件中呈现多个实例的主要内容,如果未能解决你的问题,请参考以下文章

具有多个子组件实例的Angular2父组件

使用状态自定义样式的反应+样式化组件

React-Redux 中同一组件的多个实例

在 Flux 中处理同一组件的多个实例

Angular 2 - 如何以特定顺序在组件中实例化多个服务?

Angular 8:如何为同一组件的多个实例提供不同的服务实例