详解React 条件渲染


Posted in Javascript onJuly 08, 2020

在 React 中,你可以创建不同的组件来封装各种你需要的行为。然后还可以根据应用的状态变化只渲染其中的一部分。

React 中的条件渲染和 JavaScript 中的一致,使用 JavaScript 操作符 if 或条件运算符来创建表示当前状态的元素,然后让 React 根据它们来更新 UI。

先来看两个组件:

function UserGreeting(props) {
 return <h1>欢迎回来!</h1>;
}

function GuestGreeting(props) {
 return <h1>请先注册。</h1>;
}

我们将创建一个 Greeting 组件,它会根据用户是否登录来显示其中之一:

function Greeting(props) {
 const isLoggedIn = props.isLoggedIn;
 if (isLoggedIn) {
 return <UserGreeting />;
 }
 return <GuestGreeting />;
}
 
ReactDOM.render(
 // 尝试修改 isLoggedIn={true}:
 <Greeting isLoggedIn={false} />,
 document.getElementById('example')
);

元素变量

你可以使用变量来储存元素。它可以帮助你有条件的渲染组件的一部分,而输出的其他部分不会更改。

在下面的例子中,我们将要创建一个名为 LoginControl 的有状态的组件。

它会根据当前的状态来渲染 <LoginButton /><LogoutButton />,它也将渲染前面例子中的 <Greeting />

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 = null;
 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('example')
);

与运算符 &&

你可以通过用花括号包裹代码在 JSX 中嵌入任何表达式 ,也包括 JavaScript 的逻辑与 &&,它可以方便地条件渲染一个元素。

function Mailbox(props) {
 const unreadMessages = props.unreadMessages;
 return (
 <div>
  <h1>Hello!</h1>
  {unreadMessages.length > 0 &&
  <h2>
   您有 {unreadMessages.length} 条未读信息。
  </h2>
  }
 </div>
 );
}
 
const messages = ['React', 'Re: React', 'Re:Re: React'];
ReactDOM.render(
 <Mailbox unreadMessages={messages} />,
 document.getElementById('example')
);

在 JavaScript 中,true && expression 总是返回 expression,而 false && expression 总是返回 false。

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

三目运算符

条件渲染的另一种方法是使用 JavaScript 的条件运算符:

condition ? true : false。

在下面的例子中,我们用它来有条件的渲染一小段文本。

render() { const isLoggedIn = this.state.isLoggedIn; return (
The user is {isLoggedIn ? 'currently' : 'not'} logged in.
); }

同样它也可以用在较大的表达式中,虽然不太直观:

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

阻止组件渲染

在极少数情况下,你可能希望隐藏组件,即使它被其他组件渲染。让 render 方法返回 null 而不是它的渲染结果即可实现。

在下面的例子中,<WarningBanner /> 根据属性 warn 的值条件渲染。如果 warn 的值是 false,则组件不会渲染:

function WarningBanner(props) {
 if (!props.warn) {
 return null;
 }
 
 return (
 <div className="warning">
  警告!
 </div>
 );
}
 
class Page extends React.Component {
 constructor(props) {
 super(props);
 this.state = {showWarning: true}
 this.handleToggleClick = this.handleToggleClick.bind(this);
 }
 
 handleToggleClick() {
 this.setState(prevState => ({
  showWarning: !prevState.showWarning
 }));
 }
 
 render() {
 return (
  <div>
  <WarningBanner warn={this.state.showWarning} />
  <button onClick={this.handleToggleClick}>
   {this.state.showWarning ? '隐藏' : '显示'}
  </button>
  </div>
 );
 }
}
 
ReactDOM.render(
 <Page />,
 document.getElementById('example')
);

组件的 render 方法返回 null 并不会影响该组件生命周期方法的回调。例如,componentWillUpdate 和 componentDidUpdate 依然可以被调用。

以上就是详解React 条件渲染的详细内容,更多关于React 条件渲染的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
分享20多个很棒的jQuery 文件上传插件或教程
Sep 04 Javascript
详解JavaScript的Date对象(制作简易钟表)
Apr 07 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
Sep 02 Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
Oct 29 Javascript
那些精彩的JavaScript代码片段
Jan 12 Javascript
实例详解display:none与visible:hidden的区别
Mar 30 Javascript
jQuery实现可拖动进度条实例代码
Jun 21 jQuery
JS判断微信扫码的方法
Aug 07 Javascript
JS实现电商放大镜效果
Aug 24 Javascript
JS 中document.write()的用法和清空的原因浅析
Dec 04 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
Dec 04 Javascript
axios 处理 302 状态码的解决方法
Apr 10 Javascript
webpack5 联邦模块介绍详解
Jul 08 #Javascript
实例讲解React 组件
Jul 07 #Javascript
JavaScript eval()函数定义及使用方法详解
Jul 07 #Javascript
详解React 元素渲染
Jul 07 #Javascript
JS数据类型判断的几种常用方法
Jul 07 #Javascript
JavaScript实现像雪花一样的Hexaflake分形
Jul 07 #Javascript
jQuery 实现扁平式小清新导航
Jul 07 #jQuery
You might like
用libTemplate实现静态网页的生成
2006/10/09 PHP
PHP 程序员应该使用的10个组件
2009/10/31 PHP
解析PHP中ob_start()函数的用法
2013/06/24 PHP
CI(CodeIgniter)框架介绍
2014/06/09 PHP
php array_slice 取出数组中的一段序列实例
2016/11/04 PHP
jQuery EasyUI API 中文文档 - Pagination分页
2011/09/29 Javascript
jQuery创建平滑的页面滚动(顶部或底部)
2013/02/26 Javascript
js 窗口抖动示例
2013/09/04 Javascript
javascript使用百度地图api和html5特性获取浏览器位置
2014/01/10 Javascript
jQuery使用$.each遍历json数组的简单实现方法
2016/04/18 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
jQuery图片左右滚动代码 有左右按钮实例
2016/06/20 Javascript
javascirpt实现2个iframe之间传值的方法
2016/06/30 Javascript
一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)
2018/01/08 Javascript
微信小程序中换行空格(多个空格)写法详解
2018/07/10 Javascript
vue中关闭eslint的方法分析
2018/08/04 Javascript
谈谈React中的Render Props模式
2018/12/06 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
python的re模块应用实例
2014/09/26 Python
python实现多线程的方式及多条命令并发执行
2016/06/07 Python
强悍的Python读取大文件的解决方案
2019/02/16 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
python实现连连看辅助之图像识别延伸
2019/07/17 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
通过 Django Pagination 实现简单分页功能
2019/11/11 Python
Python实现随机取一个矩阵数组的某几行
2019/11/26 Python
Python爬虫:Request Payload和Form Data的简单区别说明
2020/04/30 Python
浅谈cookie和localStorage那些事
2019/08/27 HTML / CSS
韩国邮政旗下生鲜食品网上超市:epost
2016/08/27 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
建筑设计师岗位职责
2013/11/18 职场文书
青安岗事迹材料
2014/05/14 职场文书
离婚起诉书范本
2015/05/18 职场文书
毕业生求职自荐信(2016最新版)
2016/01/28 职场文书
Python编程中Python与GIL互斥锁关系作用分析
2021/09/15 Python