【问题标题】:Using recoil selector to filter component data?使用反冲选择器过滤组件数据?
【发布时间】:2021-12-14 15:05:55
【问题描述】:

我觉得我已经阅读了很多示例/文档并观看了视频,但我无法理解使用带有后坐力的选择器。也许我只是度过了糟糕的一天,因为我认为这并不难。

这就是我所在的地方......

假设我有如下数据:

const data = [
  {
    name: "wiggles",
    type: "cat",
    age: "244",
  },
  {
    name: "wobbles",
    type: "dog",
    age: "55",
  },
  {
    name: "flobbles",
    type: "dog",
    age: "98",
  },
];

在我的索引中我有:

export const typeFilterState = atom({
   key: 'typeFilterState',
   default: '',
});
const UserPage: NextPage<Props> = ({data}) => {

const [typeFilter, setTypeFilter] = useRecoilState(typeFilterState);

return(
<select onChange={(e) => setLeagueFilter(e.target.value)}>
<option value='cat'>Cat</option>
<option value='dog'>Dog</option>
<option value='elephant'>Elephant</option>
</select>

{
  data.map((d) => (
    <DataComponent data={d} />
  ))
}
)};

DataComponent 会是这样的:

const DataComponent: FunctionComponent<Animals> = ({data}) => {
return (
   <Text>{data.name}</Text>
   <Text>{data.type}</Text>
   <Text>{data.age}</Text>
)
};

我想要它,所以如果用户选择 cat 它只显示猫的数据,但如果没有选择任何内容,也会显示所有数据...

【问题讨论】:

    标签: javascript reactjs typescript recoiljs


    【解决方案1】:

    您的&lt;select&gt; onChange 函数中有错字:

    // <select onChange={(e) => setLeagueFilter(e.target.value)}>
    <select onChange={(e) => setTypeFilter(e.target.value)}>
    

    在映射为组件之前,只需根据typeFilter 值过滤数组:

    // data.map((d) => (
    //   <DataComponent data={d} />
    // ))
    
    data
      .filter(({type}) => {
        // nothing selected yet, keep all:
        if (!typeFilter.trim()) return true;
        // else keep if item.type equals filter:
        return type === typeFilter;
      })
      .map((d) => (
        <DataComponent data={d} />
      ))
    

    【讨论】:

    • 您在这里不需要selector,但如果您发现文档令人困惑并想要一个细分/示例,您可以查看my answer to this question,希望它有助于让事情变得清晰。
    • 哎呀,没有看到错字,我只是快速写了这个例子来展示我想要实现的目标。啊,好吧,我想如果我使用反冲来共享状态,我也应该尝试学习selector。文档中的示例显示它用于过滤待办事项列表。但不管你的回答是否解决了我的问题:) 感谢回复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 2013-04-17
    • 2021-07-30
    • 2017-06-25
    • 2021-06-23
    • 2017-08-05
    • 1970-01-01
    相关资源
    最近更新 更多