2017-09-13 22 views
1

使用React Table來顯示我從API調用接收到的數據。目前我在本地保存狀態,表格顯示數據。我已經爲兩列添加了列值的過濾。我的過濾邏輯如下:如何在React表中實現過濾邏輯?

<ReactTable 
    data={tableData} 
    noDataText="Loading.." 
    filterable 
    defaultFilterMethod={(filter, row) => 
    String(row[filter.id]) === filter.value} 
    }; 
    }} 
    columns={[ 
    { 
     columns: [ 
     { 
      Header: 'Name', 
      accessor: 'Name', 
      id: 'Name', 
      Cell: ({ value }) => (value === 'group1' ? 
      'group1' : 'group2'), 
      filterMethod: (filter, row) => { 
      if (filter.value === 'all') { 
       return true; 
      } 
      if (filter.value === 'group1') { 
       return row[filter.id] === 'group1'; 
      } 
      if (filter.value === 'group2') { 
       return row[filter.id] === 'group2'; 
      } 
      }, 
      Filter: ({ filter, onChange }) => 
      <select 
       onChange={event => onChange(event.target.value)} 
       style={{ width: '100%' }} 
       value={filter ? filter.value : 'all'} 
      > 
       <option value="all">All</option> 
       <option value="group1">Group1</option> 
       <option value="group2">Group2</option> 
      </select>, 
     }, 
    } 

截至目前,過濾規則是硬兩個值之間編碼。如何實現過濾器邏輯以便過濾是動態的?(如果特定列中有3個或7個不同的值,則下拉列表應顯示全部7個值,並且過濾器應基於所選的任何值工作)。由於我使用反應表(https://react-table.js.org)。

+0

@ SeaWarrior404。 。什麼做到這一點「返回行[filter.id] ===‘組2’;」回報,理想的應該返回true或false..I有疑問的天氣真返回布爾或任何價值....請澄清 – MukulSharma

+0

這個問題仍然存在嗎?未解?你似乎已經轉移到其他問題上,但這裏沒有迴應。爲什麼?如果我的缺省回答不,也許工作,你有你自己的答案現在,你可以回答你自己的問題,並接受它:在一定條件下https://stackoverflow.com/help/self-answer – jonahe

回答

2

我假設你想讓選項超出選項列表。 如果是這樣,這裏有一種方法可以做到這一點:

const exampleList = ['option1','option2','option3','option4',...,'option n'] 

在你列:

filterMethod: (filter, row) => customOptionsFilterMethod(filter, row), 
Filter:() => ({filter, onChange}) => customOptionsFilter({filter, onChange}) 

內部渲染()實現customOptionsFilter和customOptionsFilterMethod爲:

const customOptionsFilter = ({filter, onChange}) => { 
     return(
     <select 
      onChange={e => onChange(e.target.value)} 
      style={{ width: '100%' }} 
      value={filter ? filter.value : 'all'} 
      > 
      <option value='all'>Show All</option> 
      { 
      exampleList.map(k => { 
       return <option key={k.toString()} value={k}>{k}</option> 
      }) 
      } 
     </select> 
    ) 
    } 



const customOptionsFilterMethod = (filter, row) => { 

     if(filter.value === '') { return true } 

     if(exampleList.includes(filter.value)){ 
     return row[filter.id] === filter.value 
     } else { return true } 

    } 
1

沒有使用圖書館,但它聽起來就有點像這樣的工作

if (filter.value === 'all') { 
    return true; 
} else { 
    // what ever the value is, we will only 
    // show rows that have a column value 
    // that matches it 
    // If value is 'group1' just show the ones where the column 
    // value is 'group1', etc etc. 
    return row[filter.id] == filter.value; 
} 

注意,這會顯示什麼,直到你得到一個精確匹配。所以即使你有像「group1」這樣的列值,搜索詞「grou」也不會匹配它。如果這是不是你想要的,然後的行爲,你會想轉出

return row[filter.id] == filter.value; 

喜歡的東西

return row[filter.id].indexOf(filter.value) >= 0; 

作爲替代,如果你需要它是比這更受限制,你可以從陣列中建立你的選擇

const options = [ { value: "all" , label: "All" }, { value: "group1" , label: "Group1" }]; 

而且使用它像

 <select 
      onChange={event => onChange(event.target.value)} 
      style={{ width: '100%' }} 
      value={filter ? filter.value : 'all'} 
     > 
      { options.map(({value,label}) => <option value={value}>{label}</option>)} 
     </select>, 

而在你的過濾邏輯,你可以檢查filter.value值是「options`陣列英寸

// check if there is some (any) value that matches the criteria 
// of opt.value == filter.value 
return options.some(opt => opt.value == filter.value); 
+0

這種方法的工作原理。然而,我需要的答案不是這個。我將這個問題放開了,因爲可能有另一個可能解決這個問題的答案。我一直忙於應用程序的其他部分,所以當我找到解決此問題的方法時,我會相應地進行更新。 – SeaWarrior404

+0

好的,謝謝你的反饋。也許你可以在問題中增加更多信息,突出顯示我的兩個建議解決方案無法解決的情況。 – jonahe

+0

Btw。對不起,「嘮叨」和我的評論的責備聲調。OP很長一段時間沒有迴應任何問題,即使這個人在其他問題上仍然很活躍,這看起來很糟糕。有些人只是提出問題,然後再回來接受答案或感謝,這與Stackoverflow的想法背道而馳。但是我也可以看到如何可能有其他原因不立即響應,如果我不公平,我很抱歉。 – jonahe