react之条件渲染


条件渲染

引言

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

在react中条件渲染方法

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

if...else

function UserGreeting(props){
	return 

Welcome back!

} function GusetGreeting(props){ return

Please sign up.

} function Greeting(props){ const isLoggedIn = props.isLoggedIn; if(isLoggedIn){ return ; } return ; } ReactDOM.render( , document.getElementById('condition') )

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

使用null阻止渲染

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

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

function WarningBanner(props){
	if(!props.warn){
		return null
	}
	return (
		
warning!
) } 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(
) } } ReactDOM.render(,document.getElementById('warning'))

元素变量

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

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

function LoginButton(props){
	return (
		
	)
}

function LogoutButton(props){
	return(
		
	)
}

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 = 
		}else{
			button = 
		}
		return(
			
{button}
) } } ReactDOM.render(,document.getElementById('login-btn'))

与运算符&&

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

function Mailbox(props){
	const unreadMessages = props.unreadMessages;
	return(
		

Hello!

{ unreadMessages.length>0&&

you have {unreadMessages.length}unread messages

}
) } const messages = ['React','Re:React','Re:Re:React']; ReactDOM.render( , document.getElementById('mail-box') )

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

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

三元运算符

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

组件中的render改为如下

render(){
		const isLoggedIn = this.state.isLoggedIn;
		return(
			
{isLoggedIn?:}
) }

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

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

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

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

function render(){
	return(
		
{ (() =>{ if(renderComponent1){ return }else{ return
} })() }
) }

子组件

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

function render(){
	return(
		
) } function SubRender(){ if(renderComponent1){ return }else{ return
} }

高阶组件

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

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

function highrOrderComponent(component){
	return function EnhancedComponent(props){
		if(condition){
			return 
		}
		return 
	}
}