时间:2023-05-31 04:57:01 | 来源:网站运营
时间:2023-05-31 04:57:01 来源:网站运营
怎样花两天时间设计和开发一个设计导航站?:放假期间花两天时间做了一个小网站,设计师网址导航。网站收录了全网绝大多数互联网设计相关的资源(目前大部分都是国外的资源),本文是对此项目的一个简单总结。query($id: String!) { listPage: listYaml(id: { eq: $id }) { id title item { name slogan price location link logo { childImageSharp { fixed( width: 32 height: 32 ) { ...GatsbyImageSharpFixed_tracedSVG } } } } } }
其中 id, title, item, name...分别对应了 YAML 文件中写好的那些数据,我们只需要根据官方给出的语法,把它们 query 出来就好了。const ListPage = ({data}) => { const page = data.listPage return ( <Layout> <SEO title={page.title} /> <Section> <Topic>{page.title}</Topic> {page.item.map(props => ( <Card key={props.link} href={props.link} title={props.name} > <Item> <Flex> <Avatar> <Img fixed={props.logo.childImageSharp.fixed} /> </Avatar> <Box pl={2}> <Name> {props.name} {props.location ? <Location>{props.location}</Location> : <Price>{props.price}</Price> } </Name> <Slogan>{props.slogan}</Slogan> </Box> </Flex> </Item> </Card> ))} </Section> </Layout> )}
这段代码非常简单,基本上就是把 UI 组件拼起来,再通过参数把刚才 query 到的数据传进来。createPages
的功能,接下来打开根目录下面 gatsby-node.js 这个文件输入如下代码:exports.createPages = ({ graphql, actions }) => { const { createPage } = actions return graphql( ` { allListYaml { edges { node { id } } } } ` ).then(result => { if (result.errors) { throw result.errors } const listTemplate = path.resolve(`src/templates/list.js`) const Lists = result.data.allListYaml.edges _.each(Lists, edge => { createPage({ path: edge.node.id, component: listTemplate, context: { id: edge.node.id, }, }) }) })
至此已经写好了每个分类页面的代码了,接下来完成首页的部分。同样通过 GraphQL 把数据抓取过来,只不过这一次我们需要抓取所有的数据,所以刚才的 listYaml 变成了 allListYaml :query IndexPage { allListYaml( sort: { order: ASC, fields: [id] } ) { edges { node { id title item { name slogan price location link logo { childImageSharp { fixed( width: 32 height: 32 ) { ...GatsbyImageSharpFixed_tracedSVG } } } } } } } }
首页这部分基本和 list 页面一样,唯一不同的是,分类 list 页面只需要每一个分类下的所有数据,所以遍历一次就够了,而首页是把所有分类的所有数据全部展示出来,所以在 Card 标签外,我们还需要在 Section 外再遍历一次所有分类。也就是 cards.map 遍历一遍 id(分类)items.map 再遍历一遍 分类里面的 item(链接条目)。const IndexPage = ({ data }) => { const cards = data.allListYaml.edges return ( <Layout> <SEO title='' keywords={[`bookmarks`, `design`, `all-in-one`]} /> {cards.map(({ node }) => { const items = node.item const shuffledItems = shuffle(items) const url = `/${node.id}` return ( <Section key={node.id}> <Topic>{node.title}</Topic> {shuffledItems.slice(0, 24).map(item => { return ( <Card key={item.link} href={item.link} title={item.name} > <Item> <Flex> <Avatar> <Img fixed={item.logo.childImageSharp.fixed} /> </Avatar> <Box pl={2}> <Name> {item.name} {item.location ? <Location>{item.location}</Location> : <Price>{item.price}</Price> } </Name> <Slogan>{item.slogan}</Slogan> </Box> </Flex> </Item> </Card> ) })} {(items.length >=24) ? <Viewall to={url} /> : null} </Section> ) })} </Layout> )}
如果首页展示所有内容,会导致加载时间过长,而且很多分类内容过多也会让页面太长不美观,所以我在遍历第二次的时候加上了 slice(0, 24)
,它让每一个分类的内容最多只显示 24 条,超过则隐藏。而最后一句 {(items.length >=24) ? <Viewall /to/={url} /> : null}
和刚才那个 location 的条件判断类似,如果分类内容 ≥ 24 条,则在下面加上 view all 的链接,点击后跳转到每一个对应的分类页面,如果不足 24 条,则不显示 view all (只能通过左边导航栏进入)。function shuffle(array) { let i = array.length - 1; for (; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); const temp = array[i]; array[i] = array[j]; array[j] = temp; } return array;}
关键词:设计,导航,怎样