【问题标题】:searchFilter with using useEffect使用 useEffect 的 searchFilter
【发布时间】:2021-06-01 21:30:38
【问题描述】:

这是我们大学的任务。我尝试添加 useEffect 来改进我的小型玩具项目,使其具有 searchFilter 但它说

TypeError:无法读取未定义的属性“过滤器”

关于 useEffect/setSearchFilter 部分

这是这个问题之前的情况。 持有这个问题超过 2 天,我为这个问题感到灾难

/[错误图片][1]

谁能帮我解决这个问题?

import React, { useState, useEffect } from 'react'
import './App.css';

function App() {
  const [datas, setDatas] = useState([]);
  const [userid, setUserid] = useState('');
  const [searchFilter, setSearchFilter] = useState('');
  const inputChanged = (event) => {
    setUserid(event.target.value)
  }
  useEffect(() => {
    fetch('https://api.github.com/search/repositories?q=react')
    .then(response => response.json())
    .then(data => {
      setDatas(data.items)
    })
  },[])
  useEffect(() => {
    setSearchFilter(
      datas.full_name.filter((result) =>
        result.name.toLowerCase().includes(userid.toLowerCase())
      )
    );
  }, [userid, searchFilter]);
  return (
    <div className="App">
      <h1>Repositories</h1>
        <input 
          id="searchInput"
          type="text" 
          placeholder="search" 
          name="search" 
          value={userid} 
          onChange={inputChanged}
        />
        <button onClick={(e) => setSearchFilter(e.target.value)}>Search</button>
      <table>
        <tbody>
          <tr>
           <th>Name</th>
           <th>URL</th>
          </tr>
          {datas.map((data, index) => 
           <tr key={index}>
             <td>{data.full_name}</td>
             <td><a 
                    target="_blank" 
                    href={data.html_url}
                    >
                      {data.html_url}
                  </a>
            </td></tr>
          )}
        </tbody>
      </table>
    </div>
  );
}
export default App;```



https://stackoverflow.com/questions/67761971/searchfilter-with-using-react-hookuseeffect-usestate/67762090#67762090





  [1]: https://i.stack.imgur.com/RuubM.png

【问题讨论】:

    标签: reactjs react-hooks


    【解决方案1】:

    如果您想过滤 full_name,这应该可以代替您的第二个 useEffect 挂钩。

    useEffect(() => {
        setSearchFilter(
            datas.filter((result) =>
                result.full_name.toLowerCase().includes(userid.toLowerCase())
            )
        );
    }, [userid, searchFilter]);
    

    【讨论】:

      【解决方案2】:
      1. 您需要根据“full_name”参数过滤数据数组 - 因此您对数组运行 filter() 函数。
      2. 如果您按用户身份进行过滤,则不需要搜索按钮 打字(因为您使用的是 useEffect)

      代码如下:

      import React, { useState, useEffect } from 'react'
      import './App.css';
      
      function App() {
        const [data, setData] = useState([]);
        const [userID, setUserID] = useState('');
        const [searchResults, setSearchResults] = useState([]);
      
      
        //Fetch data when mounted
        useEffect(() => {
          fetch('https://api.github.com/search/repositories?q=react')
          .then(response => response.json())
          .then(data => {
            setData(data.items)
          })
        },[])
      
        useEffect(() => {
            let result = data.filter((d) =>
            d.full_name.toLowerCase().includes(userID.toLowerCase())
          )
          setSearchResults(result);
        }, [userID, data]);
      
      
        const inputChanged = (event) => {
          setUserID(event.target.value)
        }
        
        
        return (
          <div className="App">
            <h1>Repositories</h1>
              <input 
                id="searchInput"
                type="text" 
                placeholder="search" 
                name="search" 
                value={userID} 
                onChange={inputChanged}
              />
              {/* No need for search button if searching using input (useEffect will trigger when typed) 
              <button onClick={search}>Search</button> */}
            <table>
              <tbody>
                <tr>
                 <th>Name</th>
                 <th>URL</th>
                </tr>
                {searchResults.map((data, index) => 
                 <tr key={index}>
                   <td>{data.full_name}</td>
                   <td><a 
                          target="_blank" 
                          href={data.html_url}
                          >
                            {data.html_url}
                        </a>
                  </td></tr>
                )}
              </tbody>
            </table>
          </div>
        );
      }
      export default App;
      

      理想情况下,您应该同时处理加载状态和错误状态。

      【讨论】:

      • 我还按照标准更改了一些变量名。原始代码将searchFilter 作为字符串,而它应该是searchResults,因为它是过滤后的数据数组。您的按钮组件被单击,event.target.value 被设置为 searchFilter。如果要在用户点击后进行搜索,则不需要 useEffect 挂钩。
      • “始终将钩子置于函数代码的其余部分之上”是 不是 钩子规则的一部分,请再次检查这些规则。
      • 哦,我的坏@DrewReese。我一直认为“仅在顶层调用 Hooks”的规则意味着它们应该在任何其他代码之前首先声明。我会改变我的答案。
      猜你喜欢
      • 2022-06-18
      • 2020-05-07
      • 1970-01-01
      • 2017-12-15
      • 2017-05-03
      • 2019-11-21
      • 2021-04-01
      • 2021-10-03
      • 1970-01-01
      相关资源
      最近更新 更多