【问题标题】:Select type of list using React useState in one function在一个函数中使用 React useState 选择列表类型
【发布时间】:2020-06-04 17:40:51
【问题描述】:

我正在使用 React useState 来显示所选文章类型的文章列表。我已经设法使用两个单独的函数使其工作,但我想知道是否有一种方法可以在用户有许多不同选项可供选择的情况下将其放入一个函数中?

function MostReadArticlesList() {
  const [list, setList] = useState(mostReadArticles);
  const [mostReadStyle, setMostReadStyle] = useState(styles["mostReadArticlesHeaderChosen"])
  const [editorsChoiceStyle, setEditorsChoiceStyle] = useState(styles["editorsChoiceHeader"])
  const [rankColor, setRankColor] = useState(styles.mostReadArticlesRankRed)

  function selectMostRead() {
    setList(mostReadArticles);
    setMostReadStyle(styles["mostReadArticlesHeaderChosen"]);
    setEditorsChoiceStyle(styles["editorsChoiceHeader"]);
    setRankColor(styles.mostReadArticlesRankRed);
  };

  function selectEditorsChoice() {
    setList(editorsChoiceArticles);
    setMostReadStyle(styles["mostReadArticlesHeader"]);
    setEditorsChoiceStyle(styles["editorsChoiceHeaderChosen"]);
    setRankColor(styles.mostReadArticlesRankBlue);
  };

  return (
    <div className={styles.mostReadArticlesListContainer}>
      <div className={styles.mostReadArticlesHeaderDiv}>
        <Button className={mostReadStyle} onClick={selectMostRead}>
          <Icon icon="assets/img/circle-growth-icon.png" />
          <span>Most Read</span>
        </Button>
        <Button className={editorsChoiceStyle} onClick={selectEditorsChoice}>
          <Icon icon="assets/img/notes-star-icon.png" />
          <span>Editors Choice</span>
        </Button>
      </div>
      <div className={styles.mostReadArticlesList}>
        {list.map((article) => (
          <MostReadArticlesCard
            id={article.id}
            rank={article.rank}
            headline={article.headline}
            date={article.date}
            rankColor={rankColor}
          />
        ))}
      </div>
    </div>
  );
}

export default MostReadArticlesList;

【问题讨论】:

    标签: javascript reactjs function react-hooks


    【解决方案1】:

    我不确定那里在做什么,您是否使用 CSS 样式对文章进行排序?这是不好的。你应该用 JS 对它们进行排序。

    Array.sort() 的一个例子:

    const [list, setList] = useState(articles);
    
    const sortBy = ( property ) = {
        const newList = [...list]; // This is not fully immutable - but should work
    
        newList.sort( (a, b) => {
            if(a[property] < b[property]) { return -1; }
            if(a[property] > b[property]) { return 1; }
            return 0;
        })
    
        setList( newList );
    }
    
    ...
    
    <button onClick={() => sortBy('rank')}>By rank</button>
    <button onClick={() => sortBy('headline')}>By headline</button>
    
    

    /编辑

    一个管理两个列表的功能(理论上您可以使用一种状态),我建议您使用一个类 active 来处理所有活动按钮,而不是“mostReadArticlesHeaderChosen”。

    const [list, setList] = useState(mostReadArticles);
    const [active, setActive] = useState('mostRead');
    
    function selectList( listName ) {
        switch(listName) {
            case 'mostRead': {
                setList(mostReadArticles);
                setActive('mostRead');
            }
            case 'editorsChoice': {
                setList(editorsChoiceArticles);
                setActive('editorsChoice');
            }
            default:
        }
    }
    
    ...
    
    <button 
        class={ active === 'mostRead' ? 'mostReadArticlesHeaderChosen' : 'mostReadArticlesHeader'}
        onClick={() => selectList('mostRead')}
    >
        Most Read
    </button>
    <button 
        class={ active === 'editorsChoice' ? 'editorsChoiceHeaderChosen' : 'editorsChoiceHeader'} 
        onClick={() => selectList('editorsChoice')}
    >
        Editor's Choice
    </button>
    

    【讨论】:

    • 我从两个单独的数组中提取了文章数据,每个数组对应一个。用户通过单击按钮选择一种类型的列表(阅读最多或编辑的选择),并且文章列表显示在页面上,每个按钮的样式也会更改以显示已选择的选项。我已经使用两个单独的函数实现了这一点,并且想知道是否还有另一种只使用一个函数的方法?
    • 谢谢!将开关更改为 if else 并且三元组起作用了!
    猜你喜欢
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    相关资源
    最近更新 更多