react 入坑笔记(五) - 条件渲染和列表渲染
条件渲染和列表渲染
一、条件渲染
条件渲染较简单,使用 JavaScript 操作符 if 或条件运算符来创建表示当前状态的元素,然后让 React 根据它们来更新 UI。
贴一个小栗子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function UserGreeting(props) { return <h1>欢迎回来!</h1>; } function GuestGreeting(props) { return <h1>请先注册。</h1>; } function Greeting(props) { const isLoggedIn = props.isLoggedIn; if (isLoggedIn) { return <UserGreeting />; } return <GuestGreeting />; } ReactDOM.render( // 尝试修改 isLoggedIn={true}: <Greeting isLoggedIn={ false } />, document.getElementById( 'example' ) ); |
当然,得益于 jsx 的语法,我们可以用变量来缓存元素或者组件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | function UserGreeting(props) { return <h1>欢迎回来!</h1>; } function GuestGreeting(props) { return <h1>请先注册。</h1>; } function Greeting(props) { const isLoggedIn = props.isLoggedIn; if (isLoggedIn) { return <UserGreeting />; } return <GuestGreeting />; } function LoginButton(props) { return ( <button onClick={props.onClick}> 登陆 </button> ); } function LogoutButton(props) { return ( <button onClick={props.onClick}> 退出 </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 = 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' ) ); |
阻止渲染的栗子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | function WarningBanner(props) { if (!props.warn) { return null ; // 必须写 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 依然可以被调用。
二、列表渲染
列表渲染可以使用 js 中的 .map() 来进行。(map 返回一个经过逻辑处理的新数组)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | function NumberList(props) { const numbers = props.numbers; const listItems = numbers.map((number) => <li key={number.toString()}> {number} </li> ); return ( <ul>{listItems}</ul> ); } const numbers = [1, 2, 3, 4, 5]; ReactDOM.render( <NumberList numbers={numbers} />, document.getElementById( 'example' ) ); |
和 vue 相同,需要给每个列表元素绑定一个 key,便于 React 识别哪些元素发生了变化。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | function ListItem(props) { return <li>{props.value}</li>; } function NumberList(props) { const numbers = props.numbers; const listItems = numbers.map((number) => <ListItem key={number.toString()} value={number} /> ); return ( <ul> {listItems} </ul> ); } const numbers = [1, 2, 3, 4, 5]; ReactDOM.render( <NumberList numbers={numbers} />, document.getElementById( 'example' ) ); |
注意:key 会作为给 React 的提示,但不会传递给组件,因此,组件并不会知道传递给它的 key。
在 jsx 中使用 map():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | function ListItem(props) { return <li>{props.value}</li>; } function NumberList(props) { const numbers = props.numbers; return ( <ul> {numbers.map((number) => <ListItem key={number.toString()} value={number} /> )} </ul> ); } const numbers = [1, 2, 3, 4, 5]; ReactDOM.render( <NumberList numbers={numbers} />, document.getElementById( 'example' ) ); |
对比一下,只是少了声明 listItems 语句,并把后面的 map() 搬到 jsx 中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现