零经验学 react 的第6天 - 循环渲染和条件渲染

一、循环渲染和条件渲染要点

  • 使用 map 或者 filter 来循环渲染, 循环项绑定 key,提高性能
  • 使用 三元表达式、&&、if..else 来进行条件渲染

二、 注意点

  • 条件渲染中,如果不需要返回一些东西,可以 return null
  • 条件渲染中 num && message, 当 num=0 最终效果会渲染 0, 所以应该写成 num>0 && message

三、示例代码

函数组件示例代码

jsx 复制代码
import { useState } from "react";

function Test1 () {
    const [a, setA] = useState(1);
    const [b, setB] = useState(11);
    const [arr, setArr] = useState([1, 2]);
    const [arr1, setArr1] = useState([22, 33]);
    const [obj, setObj] = useState({x: 1, y: 2});
    const [show, setShow] = useState(true);
    
    // 循环渲染
    const renderList = () => {
        let list = [];
        arr1.forEach((item, index) => {
            list.push(<p key={index}>{index}---{item}</p>);
        });
        return list;
    }
    // 过滤循环渲染
    const renderFilteredList = () => {
        let list = [];
        arr1.filter(item => item % 2 === 0).forEach((item, index) => {
            list.push(<p key={index}>{index}---{item}</p>);
        });
        return list;
    }
    // 条件渲染
    const renderContent = () => {
        if(show) {
            return <p>使用if else1111</p>;
        } else {
            return <p>使用if else2222</p>;
        }
    }
    return (
        <div className="test1-box">
            <p>Test1</p>
            <div>
                {/* 循环渲染、过滤循环渲染 */}
                <div>
                    <p>循环渲染</p>
                    <div>
                        {
                            arr.map((item, index) => (
                                <p key={index}>{index}---{item}</p>
                            ))
                        }
                    </div>
                    <p>使用函数来处理循环渲染的逻辑</p>
                    <div> {renderList()}</div>
                    <p>过滤循环渲染</p>
                    <div>
                        {
                            arr.filter(item => item % 2 === 0).map((item,index) => {
                                return <p key={index}>{index}==={item}</p>;
                            })
                        }
                    </div>
                    <p>使用函数来处理过滤循环渲染的逻辑</p>
                    <div>{renderFilteredList()}</div>
                </div>
                
                
                {/* 条件渲染:使用三元表达式、&&、if else */}
                <div>
                    <p>条件渲染</p>
                    <div>
                        <button type="button" onClick={() => setShow(!show)}>切换显示/隐藏</button>
                        {/* 使用三元表达式 */}
                        <div>{show ? <p>使用三元表达式1111</p> : <p>使用三元表达式2222</p>}</div>
                        {/* 使用&& */}
                        <div>{show && <p>使用&&1111</p>}</div>
                        {/* 使用if else */}
                        <div>{renderContent()}</div>
                    </div>
                </div>
            </div>
        </div>
    )
}
export default Test1;

类组件示例代码

jsx 复制代码
import React from 'react';

class Test2 extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            a: 1,
            b: 11,
            arr: [1,2],
            arr1: [22,33],
            obj: {x: 1, y: 2},
            show: true
        }
    }
    // 循环渲染
    renderList() {
        let list = [];
        this.state.arr1.forEach((item, index) => {
            list.push(<p key={index}>{index}---{item}</p>);
        });
        return list;
    }
    // 过滤循环渲染
    renderFilteredList() {
        let list = [];
        this.state.arr1.filter(item => item % 2 === 0).forEach((item, index) => {
            list.push(<p key={index}>{index}---{item}</p>);
        });
        return list;
    }
    renderContent() {
        if(this.state.show) {
            return <p>使用if else1111</p>;
        } else {
            return <p>使用if else2222</p>;
        }
    }
    render() {
        return(
            <div className="test2-box">
                <p>Test2</p>
                <div>
                    {/* 循环渲染、过滤循环渲染 */}
                    <div>
                        <p>循环渲染</p>
                        <div>
                            {
                                this.state.arr.map((item, index) => {
                                    return <p key={index}>{index}---{item}</p>
                                })
                            }
                        </div>
                        <p>使用函数来处理循环渲染的逻辑</p>
                        <div>{this.renderList()}</div>
                        <p>过滤循环渲染</p>
                        <div>
                            {
                                this.state.arr.filter((item) => item % 2 === 0).map((item,index) => {
                                    return <p key={index}>{index}---{item}</p>
                                })
                            }
                        </div>
                        <p>使用函数来处理过滤循环渲染的逻辑</p>
                        <div>{this.renderFilteredList()}</div>
                    </div>
                    {/* 条件渲染:使用三元表达式、&& if..else */}
                    <div>
                        <p>条件渲染</p>
                        <button type="button" onClick={() => this.setState({show: !this.state.show})}>切换显示/隐藏</button>
                        {/* 使用三元表达式 */}
                        <div>{this.state.show ? <p>使用三元表达式1111</p> : <p>使用三元表达式2222</p>}</div>
                        {/* 使用&& */}
                        <div>{this.state.show && <p>使用&& 1111</p>}</div>
                        {/* if..else */}
                        <div>{this.renderContent()}</div>
                    </div>
                </div>
            </div>
        )
    }
}
export default Test2;
相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋2 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁2 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95272 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大2 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师2 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学2 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端