react点击tab样式切换(tab标签及样式切换)

react tab标签以及样式切换。

 

方法一: 

原理: 利用state 中的变量值,控制menu列表平的样式切换

示例demo:


import React from "react";

import "./App.css"



export default class App extends React.Component{

state = {

menuNum: 1

}



setMenuNum = (num) => {

this.setState({

menuNum: num

});

}



render(){

return (

<div className="box">

<button

className={this.state.menuNum === 1 ? "btn btn-choose " : "btn"}

onClick= {()=> this.setMenuNum(1)}

>按钮1</button>

<button

className={this.state.menuNum === 2 ? "btn btn-choose " : "btn"}

onClick= {()=> this.setMenuNum(2)}

>按钮2</button>

<button

className={this.state.menuNum === 3 ? "btn btn-choose " : "btn"}

onClick= {()=> this.setMenuNum(3)}

>按钮3</button>

</div>

)

}

}





.box {

margin: 40px auto;

text-align: center;

}



.btn {

width: 80px;

height: 40px;

background: green;

margin: 20px;

}



.btn-choose{

background: pink;

}



 

方法二:

原理:(利用 react-router实现

1、将Route进行一次封装,并将link设置到他的子元素

2、点击link  将会触发 所有 path 符合的 Route

3、因为包裹该 link 的Route 的path 是 吻合的,其他的是不吻合的,(吻合时,children回调中的match是存在的)

4、所以 根据子元素 的match 是否存在判断link标签是否被点击了

5、再根据  match 是否存在设置不同的样式

6、因为每次点击link 都会触发 Route ,所以样式也会跟着切换

示例demo:

 


import React, { Component } from 'react';

import logo from './logo.svg';

import './App.css';

import {

BrowserRouter as Router,

Route,

Link

} from 'react-router-dom';



const Styles = {

li1: {

color: "blue",

background: "red",

float: "left",

listStyle: "none",

margin: "10px"

},

li2: {

color: "white",

background: "black",

float: "left",

listStyle: "none",

margin: "10px"

}

}



// 对Route 进行一次封装, 当点击 link 触发的时候,包裹 该link 的 route 的path 吻合也会触发,

// 然后判断 match 是否存在,存在的话 就设置一个样式,不存在的话设置另一个样式

const MenuItem = ({ to, text, exact }) => {

return <Route path={to} exact={exact} children={

({ match }) => {

console.log(match,"match")

return <Link to={to}>

<li style={match ? Styles.li1 : Styles.li2}>{text}</li>

</Link>

}} />

};



const Home = () => (

<div>home</div>

)

const Login = () => (

<div>login页</div>

)

const Main = () => (

<div>main</div>

)



class App extends Component {



render() {

return (

<Router>

<div style={{margin:"40px"}}>

<div style={{overflow:"hidden"}}>

<MenuItem to="/home" text="主页" exact />

<MenuItem to="/login" text="登录" />

<MenuItem to="/main" text="内容" />

</div>

<hr/>

<div style={{textAlign:"left"}}>

<Route path="/home" component={Home} />

<Route path="/login" component={Login} />

<Route path="/main" component={Main} />

</div>



</div>

</Router>

);

}

}



export default App;

 

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITzhongzi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值