详解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 相关文章推荐
JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
May 13 Javascript
js类型检查实现代码
Oct 29 Javascript
浅析jQuery1.8的几个小变化
Dec 10 Javascript
JavaScript中的类与实例实现方法
Jan 23 Javascript
JS表格组件神器bootstrap table详解(强化版)
May 26 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
Jul 19 Javascript
AngularJS中isolate scope的用法分析
Nov 22 Javascript
一步步教你利用Canvas对图片进行处理
Sep 19 Javascript
vue单页面应用打开新窗口显示跳转页面的实例
Sep 21 Javascript
JS原生瀑布流效果实现
Apr 26 Javascript
JS+CSS实现随机点名(实例代码)
Nov 04 Javascript
vue 遮罩层阻止默认滚动事件操作
Jul 28 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
优化NFR之一 --MSSQL Hello Buffer Overflow
2006/10/09 PHP
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
php cookie中点号(句号)自动转为下划线问题
2014/10/21 PHP
CI框架Session.php源码分析
2014/11/03 PHP
PHP代码实现爬虫记录――超管用
2015/07/31 PHP
laravel实现于语言包的完美切换方法
2019/09/29 PHP
基于jquery的大众点评,分类导航实现代码
2011/08/23 Javascript
js左侧三级菜单导航实例代码
2013/09/13 Javascript
NodeJS url验证(url-valid)的使用方法
2013/11/18 NodeJs
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
javascript版2048小游戏
2015/03/18 Javascript
js实现touch移动触屏滑动事件
2015/04/17 Javascript
JS实现仿腾讯微博无刷新删除微博效果代码
2015/10/16 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
Vue 换肤的示例实践
2018/01/23 Javascript
jquery 给动态生成的标签绑定事件的几种方法总结
2018/02/24 jQuery
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
2020/10/26 Javascript
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python实现方便使用的级联进度信息实例
2015/05/05 Python
12步教你理解Python装饰器
2016/02/25 Python
网站渗透常用Python小脚本查询同ip网站
2017/05/08 Python
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
对matplotlib改变colorbar位置和方向的方法详解
2018/12/13 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
2019/01/15 Python
python、Matlab求定积分的实现
2019/11/20 Python
Python collections模块的使用方法
2020/10/09 Python
深入浅析css3 中display box使用方法
2015/11/25 HTML / CSS
美国东北部户外服装和设备零售商:Eastern Mountain Sports
2016/10/05 全球购物
毕业生精彩的自我评价分享
2013/10/06 职场文书
写演讲稿所需要注意的4个条件
2014/01/09 职场文书
中学生教师节演讲稿
2014/09/03 职场文书
《半截蜡烛》教学反思
2016/02/19 职场文书
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js