零经验学 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;
相关推荐
飞天狗1 天前
线上Bug一直复现不了?我用Sentry把错误追踪效率提升了10倍
前端
Slice_cy1 天前
对前端工程化的理解
前端
Slice_cy1 天前
状态机设计理念与实现
前端
星栈1 天前
LiveView 的生命周期:mount、handle_event 和 Socket 到底怎么运转
前端·前端框架·elixir
yingyima1 天前
JWT Token 解析与安全实践速查:5 问 5 答直击要害
前端
kyriewen1 天前
我用 Codex 重写了同事维护三年的代码,他没说谢谢——而是找了领导
前端·javascript·ai编程
OpenTiny社区1 天前
从零开发 AI 聊天页要两周?试试这款 Vue3 垂直对话组件库 TinyRobot,直接开箱即用
前端·vue.js·github
铁皮饭盒1 天前
S3已成为文件存储标准,阿里/腾讯/华为云都支持,Bun率先原生支持
前端·javascript·后端
Cobyte1 天前
22.Vue Vapor 组件 props 的实现
前端·javascript·vue.js
lichenyang4531 天前
从 has.showToast 看 ASCF 的 API 调用链路
前端