Gatsby — пользовательский activeClass для элементов списка

#javascript #reactjs #gatsby

#javascript #reactjs #gatsby

Вопрос:

Я создаю свой первый проект с gatsby и задавался вопросом, возможно ли следующее:

Можно ли создать пользовательскую функцию, которая действует примерно так activeClassName ?

Чего я хочу достичь:

У меня есть простой список

 <ul>
    <li activeItemClassName="active">Item 1</li>
    <li activeItemClassName="active">Item 2</li>
    <li activeItemClassName="active">Item 3</li>
</ul>
  

Теперь я хотел бы иметь какой-то конфигурационный файл, возможно, json, где я могу установить item1: 0/1 , например, и в зависимости от этого значения, activeItemClassName="active" будет применен определенный класс css.

Возможно ли это как-то?

Комментарии:

1. Часть конфигурации на самом деле не имеет смысла для меня. Используете ли вы какую-то CSS-библиотеку, например styled-components? Я думаю, любой трюк с дизайном, который вы хотите сделать, прост с помощью styled-components

Ответ №1:

Это широкий вопрос, не зная вашей структуры данных, даже ваших файлов формата. Следующий обходной путь может быть адаптирован к любому типу данных (JSON, markdown и т. Д.).

Допустим, у вас есть один файл markdown для каждого элемента, такой:

 ---
name: Item 1
key: items
active: true
---
## Your Item 1 body
  

Примечание: вы можете адаптировать структуру к файлу формата JSON, идея точно такая же.

Прежде чем запрашивать эти файлы, вы должны правильно настроить свою файловую систему, что-то вроде:

 {
  resolve: `gatsby-source-filesystem`,
  options: {
    name: `items`,
    path: `${__dirname}/src/data/items`,
  },
},
  

Имейте в виду, что в этом примере у вас будет один файл на элемент. В этом случае они будут сохранены в /src/data/items ( /src/data/items/item1.md , etc) . Как только Gatsby распознает ваши файлы, он сможет поместить их в файловую систему, и вы сможете запросить эти файлы через GraphQL на своей странице, используя запрос страницы. На вашей странице:

 const yourPage = ({ data }) => {
   const { allMarkdownRemark } = data;

  return <Layout>
     <ul>
     {allMarkdownRemark.edges.map(({ node: item }) => {
      let { name, active } = item.frontmatter;
      
      return <li className={active ? "myClass" : "myOtherClass"} key={name}>{name}</li>
    });
    }
    </ul>
  </Layout>;
};

export const yourPageData = graphql`
    query getYourPageData{
        allMarkdownRemark(filter: { frontmatter: { key: { eq: "items" }}}) {
            edges {
                node {
                    html
                    frontmatter {
                        name
                        active 
                    }
                }
            }
        }
    }
`;
  

Примечание: ваш запрос может отличаться, если вы используете файл данных другого типа, посмотрите на вашу игровую площадку GraphQL ( localhost:8000/___graphql ), чтобы адаптировать запрос. Это действительно полезное key поле для повышения производительности запроса и избежания извлечения всех данных markdown в этом случае.

Во фрагменте выше много информации, однако она не требует пояснений. На этом этапе вам нужно только запросить ваши данные ( allMarkdownRemark ), фильтруя по key полю. Ваши данные будут храниться под props.data , поэтому вы можете их уничтожить. Следующим шагом будет перебор этих данных (элементов) и получение вашего active значения для установки вашего класса. Не забывайте key о зацикленном элементе. Вам остается только добавить свои стили CSS в этот класс.

Вы можете адаптировать подход markdown к любому типу данных, JSON тоже вполне допустим, и идея точно такая же, она изменит только запрос GraphQL.