简体   繁体   English

如何使用useState和useEffect过滤数据

[英]How to use useState and useEffect to filter data

I created a drop-down form which will switch views between data obtained from an API. The current view is set to view all incoming queues, but how can I filter the results to show a selection of queues based on the incoming “u_react_view” field category (type string)?我创建了一个下拉表单,它将在从 API 获得的数据之间切换视图。当前视图设置为查看所有传入队列,但我如何过滤结果以显示基于传入“u_react_view”字段的队列选择类别(类型字符串)? I'm fairly new to hooks and any help is appreciated, thanks in advance.我对钩子还很陌生,非常感谢任何帮助,在此先感谢。

XML response for all queues: <u_react_view>all</u_react_view> XML 所有队列的响应:<u_react_view>all</u_react_view>

XML response for servicedesk queues: <u_react_view>all, servicedesk</u_react_view>服务台队列的 XML 响应:<u_react_view>all, servicedesk</u_react_view>

const App = () => {
    const [results, setResults] = useState([]) 
  
    useEffect(()=>{
      axios.get('API LINK')
        .then(res => {
          setResults(res.data.result)
        });
    },[]);
  
    const Filter = () => {
      return (
        <form className="filter">
            <select name="filter" id="filter"> 
            <option value="all">All Queues View</option>
            <option value="servicedesk">Service Desk View</option>
        </select>
        </form>
      )
    }
  
    const Results = () => {
        return (
            <>
            {
                results.map(i => (
                    <ul>
                        <li key={i.sys_id}><h1>{i.u_queues}</h1></li>
                    </ul>
                ))
            }
            </>
        )
    }
}

Try this way:试试这样:

const App = () => {
  const [results, setResults] = useState([]) 
  const [filter, setFilter] = useState('all')
  useEffect(()=>{
    axios.get('API LINK')
      .then(res => {
        setResults(res.data.result)
      });
  },[]);

  return (
      <>
      <select onChange={(e)=> setFilter(e.target.value)}> 
          <option selected={filter === 'all'} value="all">All Queues View</option>
          <option selected={filter === 'servicedesk'} value="servicedesk">Service Desk View</option>
      </select>
      {
          results.filter(item=> {
            if(filter === 'servicedesk' && item.type !== 'servicedesk'){
              return false
            }
            return true
          }).map(i => (
              <ul>
                  <li key={i.sys_id}><h1>{i.u_queues}</h1></li>
              </ul>
          ))
      }
      </>
  )
}

From what I under stand you should filter the results based on the filter selected.据我了解,您应该根据所选过滤器过滤结果。

to do that use below code it will set the state and assign value back to select要做到这一点,请使用下面的代码,它将设置 state 并将值分配回select

// for storing selected filter
  const [filter, setFilter] = useState('all')


<select value={filter} onChange={(e)=> setFilter(e.target.value)}> 
    <option value="all">All Queues View</option>
    <option value="servicedesk">Service Desk View</option>
</select>

Now filter the results and render the results list现在过滤结果并渲染结果列表

const Results = () => {
    return (
        <ul>
         {
            results.filter(result => results.u_react_view.includes(filter)).map(i => (         
               <li key={i.sys_id}><h1>{i.u_queues}</h1></li>         
            ))
        }
       </ul>
    )
}

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

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