简体   繁体   English

搜索在反应中不像期望的那样工作

[英]Search does not work like expect in react

In my application i use a search input to search values, and select input also to filter values from my data.在我的应用程序中,我使用搜索输入来搜索值,并使用 select 输入来过滤我的数据中的值。 Now my component looks like below:现在我的组件如下所示:

 export default function App() { const [myData, setMydata] = useState([]); const searchData = e => { const v = e.target.value; const res= data.filter(i => i.name.toLowerCase().includes(v.toLowerCase()) ); setMydata(res); }; function handleChange(value) { const res= data.filter(i => i.age === Number(value)); setMydata(res); } return ( <div className="App"> <Select defaultValue="" style={{ width: 120 }} onChange={handleChange}> <Option value="2">2</Option> <Option value="32">32</Option> </Select> <input onChange={searchData} /> <h1>Data</h1> {myData.map((i, k) => ( <div key={k}> {i.name} is <span>{i.age}</span> </div> ))} </div> ); }

Now, the functionality works.现在,该功能起作用了。 If you search something, appear results, and if you try to select a value, also appears the value that you selected.如果你搜索一些东西,会出现结果,如果你尝试 select 一个值,也会出现你选择的值。
Issue : If i select from dropdown, for example: 32 , appears:问题:如果 i select 从下拉列表中,例如: 32 ,出现:

 Julia is 32 Bill is 32 Bill is 32

And now if i want to search from the list above just Julia , i type Julia in search, it search from the whole list of data, not just from the list which i get after i selected 32 .现在,如果我想从上面的列表中搜索Julia ,我在搜索中输入 Julia ,它会从整个数据列表中搜索,而不仅仅是从我选择32后得到的列表中搜索。
How to solve this, and how to get the result from the last results, not to search from the whole list, but from the last result?如何解决这个问题,以及如何从最后一个结果中获取结果,而不是从整个列表中搜索,而是从最后一个结果中搜索?
Note : the same issue is when i search first and after that i select a value from dropdown.注意:同样的问题是当我先搜索,然后搜索 select 下拉列表中的值。

Your two filters always work with the same object data , and not previously filtered state data myData .您的两个过滤器始终使用相同的 object data ,而不是以前过滤的 state 数据myData Best practice save value of filters in state and each render filter data:最佳实践在 state 和每个渲染过滤器数据中保存过滤器的值:

export default function App() {
    const [age, setAge] = useState('');
    const [name, setName] = useState('');

    const filteredData = data
        .filter(i => Boolean(age) ? i.age === Number(age) : true)
        .filter(i => i.name.toLowerCase().includes(name.toLowerCase()));

    return (
        <div className="App">
            <Select value={age} style={{ width: 120 }} onChange={setAge}>
                <Option value="2">2</Option>
                <Option value="32">32</Option>
            </Select>
            <input value={name} onChange={e => setName(e.target.value)} />
            <h1>Data</h1>
            {filteredData.map((i, k) => (
                <div key={k}>
                    {i.name} is <span>{i.age}</span>
                </div>
            ))}
        </div>
    );
}

Try this one out:试试这个:

import React, { useState } from "react";

export default function App() {
  const data = [
    { age: 2, name: 'John' },
    { age: 32,name: 'Mark' },
    { age: 22,name: 'Dell' },
    { age: 14,name: 'Linda' },
    { age: 16,name: 'Jon' },
    { age: 18,name: 'Ron' }
  ];
  const [myData, setMydata] = useState([]);
  const searchData = e => {
    const v = e.target.value;
    const res = data.filter(i =>
      i.name.toLowerCase().includes(v.toLowerCase())
    );
    setMydata(res);
  };
  function handleChange(value) {
    const res = data.filter(i => i.age === Number(value.target.value));
    console.log("This is the value and respos", value.target.value);
    setMydata(res);
  }

  return (
    <div>
      <select defaultValue="" style={{ width: 120 }} onChange={handleChange}>
        <option value="2">2</option>
        <option value="32">32</option>
      </select>

      <input onChange={searchData} />
      <h1>Data</h1>
      {myData.map((i, k) => (
        <div key={k}>
          {i.name} is <span>{i.age}</span>
        </div>
      ))}
    </div>
  );
}

Here is the codesandbox demo: Demo这是代码框演示:演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM