React学习笔记(四) 条件渲染与列表渲染

简介: React学习笔记(四) 条件渲染与列表渲染


一、条件渲染


1、条件渲染


我们可以通过创建不同的组件封装不同的行为,然后根据应用的状态渲染对应状态下的部分内容

// 定义组件封装登陆行为
class SignIn extends React.Component {
    constructor(props) {
        super(props)
    }
    render() {
        return <h1>Please Sign In</h1>
    }
}
// 定义组件封装注册行为
class SignUp extends React.Component {
    constructor(props) {
        super(props)
    }
    render() {
        return <h1>Please Sign Up</h1>
    }
}
// 根据用户是否已经登陆决定渲染哪个组件
class Greeting extends React.Component {
    constructor(props) {
        super(props)
    }
    render() {
        if (this.props.isSignUp) {
            return <SignIn />
        } else {
            return <SignUp />
        }
    }
}
ReactDOM.render(
    <Greeting isSignUp={false} />,
    document.getElementById('app')
);


2、阻止组件渲染


在某些情况下,我们希望可以隐藏元素,这时候我们需要让 render() 返回 null 即可

class Warning extends React.Component {
    constructor(props) {
        super(props)
    }
    render() {
        if (this.props.isWaring) {
            return <span>Waring!</span>
        } else {
            return null
        }
    }
}
ReactDOM.render(
    <Warning isWarning={false}/>,
    document.getElementById('app')
);


3、元素变量


我们可以使用变量储存元素,使得我们可以有条件地渲染组件的一部分

class LoginControl extends React.Component {
    constructor(props) {
        // 1、传递 props
        super(props);
        // 2、初始 state
        this.state = {isLoggedIn: false};
        // 3、为事件处理函数绑定组件实例
        this.handleLoginClick = this.handleLoginClick.bind(this);
        this.handleLogoutClick = this.handleLogoutClick.bind(this);
    }
    handleLoginClick() {
      this.setState({isLoggedIn: true});
    }
    handleLogoutClick() {
      this.setState({isLoggedIn: false});
    }
    render() {
        // 使用变量根据条件储存元素
        let greeting;
        let button;
        if (this.state.isLoggedIn) {
            greeting = <h1>Now you are logged in!</h1>;
          button = <button onClick={this.handleLogoutClick}>Log Out</button>;
        } else {
            greeting = <h1>Please log in!</h1>;
          button = <button onClick={this.handleLoginClick}>Log In</button>;
        }
        return (
            <div>
                {greeting}
                {button}
            </div>
        );
    }
}
ReactDOM.render(
    <LoginControl isLoggedIn={false} />,
    document.getElementById('app')
);


二、列表渲染


1、渲染元素


React组件中,我们可以通过 map() 方法快速渲染列表元素,我们先来看一个小例子

<!DOCTYPE html>
<html>
<head>
    <title>Demo</title>
    <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/babel-standalone"></script>
</head>
<body>
    <div id="app"></div>
    <script type="text/babel">
        class ItemList extends React.Component {
            render() {
                const numbers = [1, 2, 3, 4, 5]
                const items = numbers.map((number)=>(<li>{ number }</li>))
                return (<ul>{ items }</ul>)
            }
        }
        ReactDOM.render(
            <ItemList />,
            document.getElementById('app')
        );
    </script>
</body>
</html>


2、key 属性


在上面的例子中,虽然可以正常显示元素,但是当我们打开控制台的时候,会看到有一条警告信息

Warning: Each child in a list should have a unique "key" prop.


我们可以通过给每个列表元素分配一个 key 属性来解决上面这个问题

class ItemList extends React.Component {
    render() {
        const numbers = [1, 2, 3, 4, 5]
        const items = numbers.map((number)=>(
            <li key={ number.toString() }>
                { number }
            </li>
        ))
        return (
            <ul>{ items }</ul>
        )
    }
}


一个元素的 key 最好是这个元素在列表中拥有的独一无二的字符串,万不得已的情况下也可以使用元素索引

class ItemList extends React.Component {
    render() {
        const numbers = [1, 2, 3, 4, 5]
        const items = numbers.map((number, index)=>(
            <li key={ index }>
                { number }
            </li>
        ))
        return (
            <ul>{ items }</ul>
        )
    }
}


如果列表项目的顺序会发生改变,那么不建议使用索引作为 key

因为这样可能会导致性能问题,甚至会引起组件状态的问题

在默认的情况下,即我们没有显式指定 key 时,React 将使用索引作为列表项目的 key


3、渲染组件


除了可以使用 map() 方法渲染多个元素,还可以使用 map() 渲染多个组件,请看一个例子

class TodoItem extends React.Component {
    constructor(props) {
        super(props)
    }
    render() {
        return ( <h3>{ this.props.title }</h3> )
    }
}
class TodoList extends React.Component {
    constructor(props) {
        super(props)
        this.state = {
            itemList: [
                {id: 0, title: 'Say Hello', isDone: true},
                {id: 1, title: 'Say Goodbye', isDone: false}
            ]
        }
    }
    render() {
        const todoItemList = this.state.itemList.map((item) => {
            if (!item.isDone) {
                return ( <li key={ item.id }><TodoItem title={ item.title } /></li> )
            }
        })
        return ( <ul>{ todoItemList }</ul> )
    }
}
ReactDOM.render(
    <TodoList />,
    document.getElementById('app')
)




目录
相关文章
|
2月前
|
前端开发 JavaScript
React学习之——条件渲染
【10月更文挑战第16天】React 中没有像Vue中v-if这种指令。React 中的条件渲染和 JavaScript 中的一样,使用 JavaScript 运算符 if 或者条件运算符去创建元素来表现当前的状态,然后让 React 根据它们来更新 UI。
|
2月前
|
前端开发 JavaScript 容器
React 元素渲染
10月更文挑战第7天
33 1
|
2月前
|
监控 前端开发 UED
在 React 18 中利用并发渲染提高应用性能
【10月更文挑战第12天】利用并发渲染需要综合考虑应用的特点和需求,合理运用相关特性和策略,不断进行优化和调整,以达到最佳的性能提升效果。同时,要密切关注 React 的发展和更新,以便及时利用新的技术和方法来进一步优化应用性能。你还可以结合具体的项目实践来深入理解和掌握这些方法,让应用在 React 18 的并发渲染机制下发挥出更好的性能优势。
123 59
|
2月前
|
XML 前端开发 JavaScript
react学习笔记一:入门级小白到脚手架(create-react-app)开发项目
这篇文章是React的学习笔记,覆盖了从React的基础用法到高级特性,包括组件化、状态管理、生命周期、虚拟DOM等主题,适合React初学者参考。
111 0
react学习笔记一:入门级小白到脚手架(create-react-app)开发项目
|
2月前
|
JavaScript 前端开发 算法
前端优化之超大数组更新:深入分析Vue/React/Svelte的更新渲染策略
本文对比了 Vue、React 和 Svelte 在数组渲染方面的实现方式和优缺点,探讨了它们与直接操作 DOM 的差异及 Web Components 的实现方式。Vue 通过响应式系统自动管理数据变化,React 利用虚拟 DOM 和 `diffing` 算法优化更新,Svelte 通过编译时优化提升性能。文章还介绍了数组更新的优化策略,如使用 `key`、分片渲染、虚拟滚动等,帮助开发者在处理大型数组时提升性能。总结指出,选择合适的框架应根据项目复杂度和性能需求来决定。
|
2月前
|
前端开发 JavaScript 算法
React 渲染优化策略
【10月更文挑战第6天】React 是一个高效的 JavaScript 库,用于构建用户界面。本文从基础概念出发,深入探讨了 React 渲染优化的常见问题及解决方法,包括不必要的渲染、大量子组件的渲染、高频事件处理和大量列表渲染等问题,并提供了代码示例,帮助开发者提升应用性能。
59 6
|
2月前
|
前端开发 JavaScript API
React 列表 & Keys
10月更文挑战第9天
17 0
|
2月前
|
前端开发 JavaScript
React 条件渲染
10月更文挑战第9天
30 0
|
2月前
|
JavaScript 前端开发 算法
写 React / Vue 项目时为什么要在列表组件中写 key
在React或Vue项目中,为列表组件中的每个元素添加唯一的key属性,有助于框架高效地更新和渲染列表。Key帮助虚拟DOM识别哪些项已更改、添加或删除,从而优化性能并减少不必要的重新渲染。
|
4月前
|
资源调度 前端开发 API
React Suspense与Concurrent Mode:异步渲染的未来
React的Suspense与Concurrent Mode是16.8版后引入的功能,旨在改善用户体验与性能。Suspense组件作为异步边界,允许子组件在数据加载完成前显示占位符,结合React.lazy实现懒加载,优化资源调度。Concurrent Mode则通过并发渲染与智能调度提升应用响应性,支持时间分片和优先级调度,确保即使处理复杂任务时UI仍流畅。二者结合使用,能显著提高应用效率与交互体验,尤其适用于数据驱动的应用场景。
78 20