我是靠谱客的博主 细腻星星,最近开发中收集的这篇文章主要介绍React + Vite 实现一个音乐网站(menu篇),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

众所周知,每个网站都有菜单…

1.建立component文件夹

内部创建menu文件夹,文件夹内创建index.jsx和index.scss
目录结构如下
在这里插入图片描述

2.代码的编写

1.解决思路:首先我们肯定是要搭建页面的,我将meun分为两部分一步份为logo,一部分为item
在这里插入图片描述
所以我们只需要一个大盒子内嵌套两个小盒子然后用flex布局确定位置就行,非常简单
那么如果只是简单的弄个样子肯定是不行的,作为一个优秀的前端应该去完善网站的交互。那么我这边是用hover来实现鼠标滑动到一个item就会显现下划线。这样用户既能知道当前是哪个item还能让页面更加美观。

index.jsx

import './index.scss'
import Icon from '../../assest/icon'
import {Link, BrowserRouter as Router, NavLink} from 'react-router-dom'
import {useState} from 'react'

//至于这里引入的Icon是因为我想自己封装icon组件

function Meun() {
    //改变菜单
    const MeunChange=(index)=>{
        setMeunIndex(index)
    }
    //meunIndex
    const [meunIndex,setMeunIndex]=useState(0)

    return (
        <div className="allMeun">
            <div className="part-logo">
                <img src="../image/logo.png" alt="" />
            </div>
            <div className="part-meunList">
                <NavLink to="/" className='meun'><div onClick={()=>MeunChange(0)}>Home</div></NavLink>
                <NavLink to="/about" className='meun'><div onClick={()=>MeunChange(1)}>About Us</div></NavLink>
                <NavLink to="/concert" className='meun'><div onClick={()=>MeunChange(1)}>Concert</div></NavLink>
                <NavLink to="/album" className='meun'><div onClick={()=>MeunChange(1)}>Album</div></NavLink>
                <NavLink to="/pages" className='meun'><div onClick={()=>MeunChange(1)}>Pages</div></NavLink>
                <NavLink to="/news" className='meun'><div onClick={()=>MeunChange(1)}>News</div></NavLink>
                <NavLink to="/contact" className='meun other'><div onClick={()=>MeunChange(1)}>Contact</div></NavLink>
                
                <div className="search">
                    {/* <img src="" alt="" /> */}
                    <Icon className="icon-sousuo"></Icon>
                </div>
            </div>
        </div>
    )
}

export default Meun

上述代码中我渲染了每个item并绑定了事件处理函数来执行页面的切换,通过改变meunIndex来进行item的切换显示,这里用了react-router-dom中的NavLink标签。这个标签可以将当前显示的路由页面加上active的css属性,避免属性时meunIndex质为0造成下划线指向错误的情况

index.scss

.allMeun{
    width: 58.75rem;
    // width: 100%;
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin: 0 auto;
    color: #dce3e6;
    margin-top: 2rem;
    font-size: 0.8rem;
    position: absolute;
    top: 0;
    // padding: 0 5rem;
    left: 50%;
    transform: translateX(-50%);
    
    .part-logo{

    }
    .part-meunList{
        display: flex;
        a{
            text-decoration: none;
            color: #dce3e6;
        }
        .meun{
            margin-right: 2.5rem;
            position: relative;
            cursor: pointer;
            &.other{
                margin-right: 1rem;
            }
            &::after,&::before{
                content: '';
                position: absolute;
                width: 0;
                opacity: 0;
            }
            &:hover,&.active{
                &::after,&::before{
                    content: '';
                    position: absolute;
                    width: 70%;
                    height: 0.1rem;
                    opacity: 1;
                    transition: opacity,width 0.38s ease-in-out;
                }
                &::after{
                    bottom: -0.5rem;
                    left: -0.3rem;
                    background-color: #da2bb5;
                }
                &::before{
                    bottom: -0.3rem;
                    right: -0.3rem;
                    background-color: #416088;
                }
            }
            
        }
    }
}

上面为menu的样式文件,一目了然

3.将meun渲染到页面上

由于我们的meun菜单会运用到所有页面,所以我们不能将其放入routerjs内,需要单独将其拎出来
找到根目录的index.jsx文件

import ReactDOM from 'react-dom';
import MyRouter from './router/index.jsx';
import {useCallback, useEffect, useState,useLayoutEffect} from 'react'
//引入meun
import Meun from './components/Meun/index.jsx';

function App(){
	return(
		<div>
			//挂载meun
			<Meun></Meun>
			<MyRouter></MyRouter>
		</div>
	)
}

ReactDOM.render(
    <Router>
      <App/>
    </Router>
    ,
    document.getElementById('app')
)

4.icon的封装

meun部分的话差不多就这些了,下面说下对于icon的封装
根目录建立assest文件
内部建立icon文件
icon文件内部建立icon.scss以及index.jsx文件
在这里插入图片描述
index.jsx

import './icon.scss'

function Icon({
    className,
    style
}) {
    const IconClassName=()=>{
        let _className=['iconfont']
        if (typeof className=="string"){
            _className.push(className)
        }else{
            console.warn("iconfont只能为string类型");
        }

        return _className.join(' ')
    }

    return (
        

        <div>
            <i className={IconClassName()} style={style}></i>
        </div>
    )
}

export default Icon

我们需要接收外部传来的className,以及用户定义的其他样式
秉承着约定大于配置的原则,className必传需要引入的字体样式以及自定义的style

index.scss

@font-face {
    font-family: "iconfont"; /* Project id 3056564 */
    src: url('//at.alicdn.com/t/font_3056564_2lvaxngdkl1.woff2?t=1640316034424') format('woff2'),
         url('//at.alicdn.com/t/font_3056564_2lvaxngdkl1.woff?t=1640316034424') format('woff'),
         url('//at.alicdn.com/t/font_3056564_2lvaxngdkl1.ttf?t=1640316034424') format('truetype');
  }
  
  .iconfont {
    font-family: "iconfont" !important;
    font-size: 16px;
    font-style: normal;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
  }
  
  .icon-sousuo:before {
    content: "e8ba";
    font-size: 16px;
  }

字体文件来自阿里云图标库

如何使用

//页面导入Icon文件
import Icon from '../../assest/icon'

return(
	<Icon className="icon-sousuo"></Icon>
)

meun部分到这就结束了,下面会写第二部分也就是如下图
在这里插入图片描述
内部小球的动态渲染以及随机运动的动画,运用知识点为tweenMax。
(一个牛逼的前端交互得花里胡哨)

今天面试又失败了,想早点休息,以后再写…

最后

以上就是细腻星星为你收集整理的React + Vite 实现一个音乐网站(menu篇)的全部内容,希望文章能够帮你解决React + Vite 实现一个音乐网站(menu篇)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部