zoukankan      html  css  js  c++  java
  • react之条件渲染

    条件渲染

    引言

    我们知道react是用于构建用户界面的JavaScript库。可以用其创建拥有各自状态的组件,在由这些组件构建更加复杂的UI组件。但是在某些情况下,我们需要根据不同的
    条件渲染不同的UI,实现不同的功能。react是用JSX来定义UI组件的,但是它不直接支持循环或条件表达式,即使这样,我们也可以用条件渲染来解决我们的遇到的问题。

    在react中条件渲染方法

    • if...else
    • 使用null阻止渲染
    • 元素变量
    • 与运算符&&
    • 三元运算符
    • 立即调用的函数表达式(IIFE)
    • 子组件
    • 高阶成分(HOC)

    if...else

    function UserGreeting(props){
    	return <h1>Welcome back!</h1>
    }
    function GusetGreeting(props){
    	return <h1>Please sign up.</h1>
    }
    function Greeting(props){
    	const isLoggedIn = props.isLoggedIn;
    	if(isLoggedIn){
    		return <UserGreeting />;
    	}
    	return <GusetGreeting />;
    }
    
    ReactDOM.render(
    	<Greeting isLoggedIn={true} />,
    	document.getElementById('condition')
    )
    

    上面的代码中,会根据用户是否登录来决定显示上面哪一个组件

    使用null阻止渲染

    在极少数情况下,你可能希望能隐藏组件,即使他已经被其他组件渲染。若要完成此操作,可以让
    render方法直接返回null,而不进行任何渲染

    下面示例中,<WarningBanner />会根据prop中warn的值来进行渲染,如果warn
    的值是false,那么组件则不会渲染

    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} />
    				<button onClick={this.handleToggleClick}>
    					{
    						this.state.showWarning?'Hide':'Show'
    					}
    				</button>
    			</div>
    		)
    	}
    }
    
    ReactDOM.render(<Page />,document.getElementById('warning'))
    

    元素变量

    你可以使用变量来储存元素,他可以帮助你有条件地渲染组件一部分,而其他的渲染部分并不会因此而改变

    下面例子中,我们创建了两个函数组件,分别代表了登录和登出按钮,同事创建一个名为LoginControl
    的又状态的组件,它将会根据当前的状态来渲染<LoginButton />或者<LogoutButton>。同时它还会
    渲染上一个示例中的<Greeting />

    function LoginButton(props){
    	return (
    		<button onClick={props.onClick}>Login</button>
    	)
    }
    
    function LogoutButton(props){
    	return(
    		<button onClick={props.onClick}>logout</button>
    	)
    }
    
    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} />
    		}else{
    			button = <LoginButton onClick ={this.handleLoginClick} />
    		}
    		return(
    			<div>
    				<Greeting isLoggedIn={isLoggedIn} />
    				{button}
    			</div>
    		)
    	}
    }
    
    ReactDOM.render(<LoginControl />,document.getElementById('login-btn'))
    

    与运算符&&

    通过花括号包裹代码,你可以在JSX中嵌入任何表达式。这也包括JavaScript中的逻辑与(&&)
    运算符。他可以很方便地进行元素的条件渲染。

    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'];
    ReactDOM.render(
    	<Mailbox unreadMessages={messages} />,
    	document.getElementById('mail-box')
    )
    

    之所以能这样做,是因为在JavaScript中,true&&expression总是会返回expression
    false&&expression总是会返回false

    因此,如果条件是true&&右侧的元素就会被渲染,如果是false,React会忽略并跳过它。

    三元运算符

    另一种内联条件渲染的方法是使用JavaScript中的三目运算符condition?true:false

    <LoginControl />组件中的render改为如下

    render(){
    		const isLoggedIn = this.state.isLoggedIn;
    		return(
    			<div>
    				<Greeting isLoggedIn={isLoggedIn} />
    				{isLoggedIn?<LogoutButton onClick = {this.handleLogoutClick} />:<LoginButton onClick ={this.handleLoginClick} />}			
    			</div>
    		)
    	}
    

    立即调用的函数表达式(IIFE)

    立即执行函数如下面代码所示

    (function myFunction(/*arguments*/){})(/*arguments*/)
    

    当深陷JSX代码中,又想写一大块逻辑时,除了回到上方,还可以使用IIFE:

    function render(){
    	return(
    		<div>
    			{
    				(() =>{
    					if(renderComponent1){
    						return <Component1 />
    					}else{
    						return <div />
    					}
    				})()
    			}
    		</div>
    	)
    }
    

    子组件

    这是IIFE的变种,也就是把这段位立即执行函数替换成一个普通函数:

    function render(){
    	return(
    		<div>
    			<SubRender />
    		</div>
    	)
    }
    function SubRender(){
    	if(renderComponent1){
    		return <Component1 />
    	}else{
    		return <div />
    	}
    }
    

    高阶组件

    高阶组件,就是返回一个新组件的函数,并且接收一个组件作为参数。

    那么我们就能在高阶组件里写条件语句,返回不同的组件即可

    function highrOrderComponent(component){
    	return function EnhancedComponent(props){
    		if(condition){
    			return <AnotherComponent {...props} />
    		}
    		return <Component {...props} />
    	}
    }
    
  • 相关阅读:
    linux(ubuntu)设置开机启动
    mysql 数据库迁移
    maven GroupId和ArtifactID
    Android内存溢出与内存泄漏
    Android性能优化方向和相关工具
    安卓 px,dpi,dp,ps的区别与联系
    python 深浅拷贝
    公网ip和私网ip
    打开系统设置页
    如何用代码开启“个人热点”功能?如何用代码把iOS设备设置成一个无线路由?
  • 原文地址:https://www.cnblogs.com/dehenliu/p/12674884.html
Copyright © 2011-2022 走看看