如何在React.js中筛选多个表格列

huangapple go评论157阅读模式
英文:

How to filter multiple table columns in reactjs

问题

在下面的React组件的返回语句中,我有两个搜索框。按名称搜索正常工作,但是如何添加另一个搜索条件以按Plot No搜索呢?
是否可以在同一个过滤语句中添加另一个三元运算符?还是我需要为Plot No列编写单独的语句?

return (
    <>
        <div class="input-group mb-3">
            <form>
                <input type='text' className="form-control searchBar" placeholder='按名称搜索' onChange={(e)=> setSearch(e.target.value)}></input>
            </form>

            <form>
                <input type='text' className="form-control searchBar" placeholder='按Plot No搜索' onChange={(e)=> setSearch(e.target.value)}></input>
            </form>
        </div>
        {isLoading ? 
        <div className='circle'>
            <Box sx={{ display: 'flex' }}>
                <CircularProgress />
                <h1>Loading</h1>
            </Box>
        </div>:

        <div>
            <TableContainer component={Paper}>
                <Table sx={{ minWidth: 650 }} aria-label="simple table">
                    <TableHead>
                        <TableRow>
                            <TableCell align="left">Sector</TableCell>
                            <TableCell align="left">Plot No</TableCell>
                            <TableCell align="left">Street</TableCell>
                            <TableCell align="left">Size</TableCell>
                            <TableCell align="left">Name</TableCell>
                            <TableCell align="left">Contact No</TableCell>
                            <TableCell align="left">Address</TableCell>
                            <TableCell align="left">Action</TableCell>
                        </TableRow>
                    </TableHead>
                    <TableBody>
                        {properties.filter((row) =>{
                            return search.toLowerCase() === '' ? row : row.Name.toLowerCase().includes(search)
                        }).map((row) => (
                            <TableRow key={row._id} sx={{ '&:last-child td, &:last-child th': { border: 0 } }}>
                                <TableCell align="left">{row.Sector}</TableCell>
                                <TableCell align="left">{row["Plot No"]}</TableCell>
                                <TableCell align="left">{row.Street}</TableCell>
                                <TableCell align="left">{row.Size}</TableCell>
                                <TableCell align="left">{row.Name}</TableCell>
                                <TableCell align="left">{row["Contact No"]}</TableCell>
                                <TableCell align="left">{row.Address}</TableCell>
                                <TableCell align="left">
                                    <Link to={`/property/${row._id}`}>
                                        <Button variant='contained'>Details</Button>
                                    </Link>
                                </TableCell>
                            </TableRow>
                        ))}
                    </TableBody>
                </Table>
            </TableContainer>
        </div>}
    </>
)}
英文:

In below react component return statement I have two search boxes. Search by name is working fine but how can i add another search criteria to search by Plot No.
Is it possible to add another turnery operator in same filter statement? or do I need to write separate statement for Plot No column?

**return (
    &lt;&gt;
    &lt;div class=&quot;input-group mb-3&quot;&gt;
        &lt;form&gt;
          &lt;input type=&#39;text&#39; className=&quot;form-control searchBar&quot; placeholder=&#39;Search by Name&#39; onChange={(e)=&gt; setSearch(e.target.value)}&gt;&lt;/input&gt;
        
        &lt;/form&gt;

        &lt;form&gt;
          &lt;input type=&#39;text&#39; className=&quot;form-control searchBar&quot; placeholder=&#39;Search by Plot No&#39; onChange={(e)=&gt; setSearch(e.target.value)}&gt;&lt;/input&gt;
        
        &lt;/form&gt;
        &lt;/div&gt;
        {isLoading ? 
        &lt;div className=&#39;circle&#39;&gt;
          &lt;Box sx={{ display: &#39;flex&#39; }}&gt;
          &lt;CircularProgress /&gt;
          
          
          &lt;h1&gt;Loading&lt;/h1&gt;
          
          
        &lt;/Box&gt;
        
         &lt;/div&gt;:

    &lt;div&gt;
 &lt;TableContainer component={Paper}&gt;
      &lt;Table sx={{ minWidth: 650 }} aria-label=&quot;simple table&quot;&gt;
         &lt;TableHead&gt;
          &lt;TableRow&gt;
            &lt;TableCell align=&quot;left&quot;&gt;Sector&lt;/TableCell&gt;
            &lt;TableCell align=&quot;left&quot;&gt;Plot No&lt;/TableCell&gt;
            &lt;TableCell align=&quot;left&quot;&gt;Street&lt;/TableCell&gt;
            &lt;TableCell align=&quot;left&quot;&gt;Size&lt;/TableCell&gt;
            &lt;TableCell align=&quot;left&quot;&gt;Name&lt;/TableCell&gt;
            &lt;TableCell align=&quot;left&quot;&gt;Contact No&lt;/TableCell&gt;
            &lt;TableCell align=&quot;left&quot;&gt;Address&lt;/TableCell&gt;
            &lt;TableCell align=&quot;left&quot;&gt;Action&lt;/TableCell&gt;
            
          &lt;/TableRow&gt;
        &lt;/TableHead&gt;
        &lt;TableBody&gt;
        {properties.filter((row) =&gt;{
          return search.toLowerCase() === &#39;&#39; ? row : row.Name.toLowerCase().includes(search)}).map((row) =&gt; (
            &lt;TableRow
               key={row._id
        }
              sx={{ &#39;&amp;:last-child td, &amp;:last-child th&#39;: { border: 0 } }}
            &gt; 

 
                         
              &lt;TableCell align=&quot;left&quot;&gt;{row.Sector}&lt;/TableCell&gt;
              &lt;TableCell align=&quot;left&quot;&gt;{row[&quot;Plot No&quot;]}&lt;/TableCell&gt;
              &lt;TableCell align=&quot;left&quot;&gt;{row.Street}&lt;/TableCell&gt;
              &lt;TableCell align=&quot;left&quot;&gt;{row.Size}&lt;/TableCell&gt;
              &lt;TableCell align=&quot;left&quot;&gt;{row.Name}&lt;/TableCell&gt;
              &lt;TableCell align=&quot;left&quot;&gt;{row[&quot;Contact No&quot;]}&lt;/TableCell&gt;
              &lt;TableCell align=&quot;left&quot;&gt;{row.Address}&lt;/TableCell&gt;
              &lt;TableCell align=&quot;left&quot; &gt;
              &lt;Link to ={`/property/${row._id}` }&gt;
                &lt;Button variant=&#39;contained&#39;&gt;Details&lt;/Button&gt;
              &lt;/Link&gt;
              &lt;/TableCell&gt;             
            &lt;/TableRow&gt;            
          ))}
        &lt;/TableBody&gt;
      &lt;/Table&gt;
    &lt;/TableContainer&gt;
   &lt;/div&gt;}
   &lt;/&gt;
  )}**

答案1

得分: 0

你可以修改过滤函数以通过名称和地块号进行搜索:

return (
    <>
        <div className="input-group mb-3">
            <form>
                <input
                    type='text'
                    className="form-control searchBar"
                    placeholder='按名称搜索'
                    onChange={(e) => setSearch(e.target.value)}
                />
            </form>

            <form>
                <input
                    type='text'
                    className="form-control searchBar"
                    placeholder='按地块号搜索'
                    onChange={(e) => setSearchPlotNo(e.target.value)} {/* Cần tạo state mới cho việc tìm kiếm theo Plot No */}
                />
            </form>
        </div>

        {isLoading ? (
            <div className='circle'>
                <Box sx={{ display: 'flex' }}>
                    <CircularProgress />
                    <h1>Loading</h1>
                </Box>
            </div>
        ) : (
            <div>
                <TableContainer component={Paper}>
                    <Table sx={{ minWidth: 650 }} aria-label="simple table">
                        <TableHead>
                            <TableRow>
                                <TableCell align="left">区块</TableCell>
                                <TableCell align="left">地块号</TableCell>
                                <TableCell align="left">街道</TableCell>
                                <TableCell align="left">面积</TableCell>
                                <TableCell align="left">名称</TableCell>
                                <TableCell align="left">联系电话</TableCell>
                                <TableCell align="left">地址</TableCell>
                                <TableCell align="left">操作</TableCell>
                            </TableRow>
                        </TableHead>
                        <TableBody>
                            {properties
                                .filter((row) =>
                                    search.toLowerCase() === '' ||
                                    row.Name.toLowerCase().includes(search) ||
                                    row["Plot No"].toLowerCase().includes(searchPlotNo) // Sử dụng state tìm kiếm mới
                                )
                                .map((row) => (
                                    <TableRow
                                        key={row._id}
                                        sx={{ '&:last-child td, &:last-child th': { border: 0 } }}
                                    >
                                        <TableCell align="left">{row.Sector}</TableCell>
                                        <TableCell align="left">{row["Plot No"]}</TableCell>
                                        <TableCell align="left">{row.Street}</TableCell>
                                        <TableCell align="left">{row.Size}</TableCell>
                                        <TableCell align="left">{row.Name}</TableCell>
                                        <TableCell align="left">{row["Contact No"]}</TableCell>
                                        <TableCell align="left">{row.Address}</TableCell>
                                        <TableCell align="left">
                                            <Link to={`/property/${row._id}`}>
                                                <Button variant='contained'>详情</Button>
                                            </Link>
                                        </TableCell>
                                    </TableRow>
                                ))}
                        </TableBody>
                    </Table>
                </TableContainer>
            </div>
        )}
    </>
)}
英文:

You can modify the filter function to search by both Name and Plot No:

return (
    &lt;&gt;
        &lt;div className=&quot;input-group mb-3&quot;&gt;
            &lt;form&gt;
                &lt;input
                    type=&#39;text&#39;
                    className=&quot;form-control searchBar&quot;
                    placeholder=&#39;Search by Name&#39;
                    onChange={(e) =&gt; setSearch(e.target.value)}
                /&gt;
            &lt;/form&gt;

            &lt;form&gt;
                &lt;input
                    type=&#39;text&#39;
                    className=&quot;form-control searchBar&quot;
                    placeholder=&#39;Search by Plot No&#39;
                    onChange={(e) =&gt; setSearchPlotNo(e.target.value)} {/* Cần tạo state mới cho việc t&#236;m kiếm theo Plot No */}
                /&gt;
            &lt;/form&gt;
        &lt;/div&gt;

        {isLoading ? (
            &lt;div className=&#39;circle&#39;&gt;
                &lt;Box sx={{ display: &#39;flex&#39; }}&gt;
                    &lt;CircularProgress /&gt;
                    &lt;h1&gt;Loading&lt;/h1&gt;
                &lt;/Box&gt;
            &lt;/div&gt;
        ) : (
            &lt;div&gt;
                &lt;TableContainer component={Paper}&gt;
                    &lt;Table sx={{ minWidth: 650 }} aria-label=&quot;simple table&quot;&gt;
                        &lt;TableHead&gt;
                            &lt;TableRow&gt;
                                &lt;TableCell align=&quot;left&quot;&gt;Sector&lt;/TableCell&gt;
                                &lt;TableCell align=&quot;left&quot;&gt;Plot No&lt;/TableCell&gt;
                                &lt;TableCell align=&quot;left&quot;&gt;Street&lt;/TableCell&gt;
                                &lt;TableCell align=&quot;left&quot;&gt;Size&lt;/TableCell&gt;
                                &lt;TableCell align=&quot;left&quot;&gt;Name&lt;/TableCell&gt;
                                &lt;TableCell align=&quot;left&quot;&gt;Contact No&lt;/TableCell&gt;
                                &lt;TableCell align=&quot;left&quot;&gt;Address&lt;/TableCell&gt;
                                &lt;TableCell align=&quot;left&quot;&gt;Action&lt;/TableCell&gt;
                            &lt;/TableRow&gt;
                        &lt;/TableHead&gt;
                        &lt;TableBody&gt;
                            {properties
                                .filter((row) =&gt;
                                    search.toLowerCase() === &#39;&#39; ||
                                    row.Name.toLowerCase().includes(search) ||
                                    row[&quot;Plot No&quot;].toLowerCase().includes(searchPlotNo) // Sử dụng state t&#236;m kiếm mới
                                )
                                .map((row) =&gt; (
                                    &lt;TableRow
                                        key={row._id}
                                        sx={{ &#39;&amp;:last-child td, &amp;:last-child th&#39;: { border: 0 } }}
                                    &gt;
                                        &lt;TableCell align=&quot;left&quot;&gt;{row.Sector}&lt;/TableCell&gt;
                                        &lt;TableCell align=&quot;left&quot;&gt;{row[&quot;Plot No&quot;]}&lt;/TableCell&gt;
                                        &lt;TableCell align=&quot;left&quot;&gt;{row.Street}&lt;/TableCell&gt;
                                        &lt;TableCell align=&quot;left&quot;&gt;{row.Size}&lt;/TableCell&gt;
                                        &lt;TableCell align=&quot;left&quot;&gt;{row.Name}&lt;/TableCell&gt;
                                        &lt;TableCell align=&quot;left&quot;&gt;{row[&quot;Contact No&quot;]}&lt;/TableCell&gt;
                                        &lt;TableCell align=&quot;left&quot;&gt;{row.Address}&lt;/TableCell&gt;
                                        &lt;TableCell align=&quot;left&quot;&gt;
                                            &lt;Link to={`/property/${row._id}`}&gt;
                                                &lt;Button variant=&#39;contained&#39;&gt;Details&lt;/Button&gt;
                                            &lt;/Link&gt;
                                        &lt;/TableCell&gt;
                                    &lt;/TableRow&gt;
                                ))}
                        &lt;/TableBody&gt;
                    &lt;/Table&gt;
                &lt;/TableContainer&gt;
            &lt;/div&gt;
        )}
    &lt;/&gt;
)}

答案2

得分: 0

我可以通过以下修改来解决这个问题。

{properties.filter((row) => {
    return search.toLowerCase() === '' ? row : row.Name.toLowerCase().includes(search) || row["Plot No"].includes(search)
}).map((row) => (

但是,每个文本框仍然会搜索整个表格,而我希望从已过滤的结果中筛选结果。

英文:

I am able to resolve this issue by below modification.

{properties.filter((row) =&gt;{
          return search.toLowerCase() === &#39;&#39; ? row : row.Name.toLowerCase().includes(search) || row[&quot;Plot No&quot;].includes(search) }).map((row) =&gt; (

But still Each Text box searches entire table. while i want to filter results from filtered results.

huangapple
  • 本文由 发表于 2023年8月9日 12:04:20
  • 转载请务必保留本文链接:https://go.coder-hub.com/76864492.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定