React中的条件渲染

  • 基础的 React请求

import React from 'react';
import ReactDOM from 'react-dom';
import './testStyle.css';

function UserGreeting(props){
    return <h1>Welcome back!</h1>
}

function GustGreeting(props){
    return <h1>Plase sign up.</h1>
}

function Greeting(props){
    const isLoggedIn = props.isLoggedIn;
    if(isLoggedIn){
        return <UserGreeting/>;
    }
    return <GustGreeting/>;
}

在渲染的时候通过传入一个isLoggedIn的值,然Greeting 函数组件来根据这个传递进来的值进行一个条件渲染:

ReactDOM.render(
    <Greeting isLoggedIn={true}></Greeting>,
    document.getElementById('root')
)
  • 通过传递函数来实现的条件渲染

创建两个代表登录和登出的按钮:

function LoginButton(props){

    return(
        <button onClick={props.onClick}>
            LoginButton
        </button>
    );

}

function LogoutButton(props){

    return(
        <button onClick={props.onClick}>
            LogoutButton
        </button>
    );

}

创建一个控制组件,实现对登录、登出连个组件的控制。在构造函数中除过必要的初始化,我们还需要对那些对一些时间进行绑定。里面设置了两个事件函数,分别用来改变isLoggedIn的值,从而达到条件渲染的目的:

class LoginControl extends React.Component{

    constructor(props){
        super(props);
        this.handleLoginClick = this.handleLoginClick.bind(this);
        this.handleLogoutClick = this.handleLogoutClick.bind(this);
        this.state = {isLoggedIn:false};
    }

    handleLoginClick(){
        this.setState({
            isLoggedIn:true
        });
    }

    handleLogoutClick() {
        this.setState({
            isLoggedIn:false
        });
    }

    render(){
        const isLoggedIn = this.state.isLoggedIn;
        let button;

        if(isLoggedIn){
            button = <LogoutButton onClick={this.handleLogoutClick}></LogoutButton>
        }else{
            button = <LoginButton onClick={this.handleLoginClick}></LoginButton>
        }

        return(
            <div>
                <Greeting isLoggedIn={isLoggedIn}/>
                {button}
            </div>
        );
    }
}

 代码分析:

  • 条件渲染

React的表达式中可以在JSX中嵌入任何类型的表达式,在下例中,如果条件是 true&& 右侧的元素就会被渲染,如果是 false,React 会忽略并跳过它。对于更复杂的请求我们可以也可以采用三目表达式的方式。

function Mailbox(props){
    const unreadMessages = props.unreadMessages;
    
    return (
        <div>
            <h1>Hello!</h1>
            {unreadMessages.length> 0 &&
                <h2>
                    You have {unreadMessages.length} unread messages
                </h2>
            
            }
        </div>
    )
}

const messages = ['React','Re:React','Re:Re:React'];
// const messages = [];
ReactDOM.render(
    <Mailbox unreadMessages={messages}/>,
    document.getElementById('root')
)
  • 阻止渲染

在原生的js中如果我们想要隐藏一个元素我们可以通过改变元素的属性:

 在我们React的组件渲染的理念中,我们可以即通过函数组件返回null或是class组件的render()方法返回控制来实现,即在渲染的时候不再渲染。

function WarningBanner(props){
    if(!props.warn){
        return null;
    }
    
    return (
        <div className='warning'>
            Warning!
        </div>
    )
}

class Page extends React.Component{
    constructor(props){
        super(props);
        this.state = {showWarning:true};
        this.handleToggleClick = this.handleToggleClick.bind(this);
    }

    handleToggleClick(){
        this.setState(state=>({
            showWarning:!state.showWarning
        }));
    }

    render(){
        return(
            <div>
                <WarningBanner warn={this.state.showWarning}></WarningBanner>
                <button onClick = {this.handleToggleClick}>
                    {this.state.showWarning?'Hide':'Show'}
                </button>
            </div>
        )
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值