【React】中渲染列表、添加点击事件

2023-11-07

渲染列表

例如有如下数组:['11','22','33']

在react中可以用数组的map方法:

import React, { Component } from 'react'

export default class App extends Component {
    constructor(props){
        super(props)
        this.state = {
            list: ['11','22','33'],
        }
    }    
    render() {
        return (
            <div>
                <ul>
                    {
                        this.state.list.map((item,index) => {
                            // 传入index
                            return <li key={index}>{item}</li>
                        })
                    }
                    
                </ul>
            </div>
        )
    }
}

这里为了方便所以绑定的key值是数组的下标,实际使用中不建议这么做,因为React中Diff算法进行组件对比时,调用的key是数组下标的话,数组的改变,会导致下标对应的数组内容不正确。

代码优化:封装一个渲染方法

import React, { Component } from 'react'

export default class Todolist extends Component {
    constructor(props){
        super(props)
        this.state = {
            list: ['11','22','33'],
        }
    }
    
    getTodoList(){
        return (
            this.state.list.map((item,index) => {
                return <li key={index}>{item}</li>
            })
        )
    }
    
    render() {
        return (
            <div>
                <ul>
                    { this.getTodoList() }
                </ul>
            </div>
        )
    }
}

添加点击事件

import React, { Component } from 'react'

class App extends React.Component<any, any> {
    handleClick2;

    constructor(props) {
        super(props);
        this.state = {
            num: 1,
            title: ' react study'
        };
        this.handleClick2 = this.handleClick1.bind(this);
    }

    handleClick1() {
        this.setState({
            num: this.state.num + 1,
        })
    }

    handleClick3 = () => {
        this.setState({
            num: this.state.num + 1,
        })
    };

    render() {
        return (<div>
            <h2>Ann, {this.state.num}</h2>
            <button onClick={this.handleClick2}>btn1</button>
            <button onClick={this.handleClick1.bind(this)}>btn2</button>
            <button onClick={() => this.handleClick1()}>btn3</button>
            <button onClick={this.handleClick3}>btn4</button>
        </div>)
    }
}

前提:子组件内部做了性能优化,如(React.PureComponent

  • 第一种是在构造函数中绑定 this:那么每次父组件刷新的时候,如果传递给子组件其他的 props 值不变,那么子组件就不会刷新;
  • 第二种是在 render() 函数里面绑定 this:因为 bind 函数会返回一个新的函数,所以每次父组件刷新时,都会重新生成一个函数,即使父组件传递给子组件其他的 props 值不变,子组件每次都会刷新;
  • 第三种是使用箭头函数:父组件刷新的时候,即使两个箭头函数的函数体是一样的,都会生成一个新的箭头函数,所以子组件每次都会刷新;
  • 第四种是使用类的静态属性:原理和第一种方法差不多,比第一种更简洁

综上所述,如果不注意的话,很容易写成第三种写法,导致性能上有所损耗。

js中bind、call、apply都能改变this指向,区别就是bind不会立即调用,而call、apply会立即调用前面的那个函数,bind的第一个参数用来修改this指向,后面所有的参数都会用来当作调用前面函数时候的参数传递进去。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【React】中渲染列表、添加点击事件 的相关文章

随机推荐

  • 语义分割任务中的Transformer

    文章目录 语义分割中的Transformer 1 Patch based Transformer 1 1 SETR 1 2 Segformer 2 Query Based Transformer 2 1 Transformer with O
  • vscode更新时报错怎么办?

    请用管理员权限 打开试试
  • vue2组件系列:Slider 滑块

    我所接触到的Slider滑块应用的场景 主要有图片的放大缩小 调节声音的大小 不知道小伙伴们的应用场景都有哪些呢 欢迎在文章下方留言讨论哈 准备工作 创建一个页面 Slider vue在router js里配置 Slider页面的路由 pa
  • js实现文字上下滚动(到底回到顶部重复滚动)

    直接贴代码 div class scroll ul li 开始 li li 用户 li ul div
  • mybatis传参1 - 传入map类型的参数

    本章将介绍mybatis如何传入参数 传入map类型的参数 我们需要定义如下三部分 目录 1 接口部分 2 mapper文件部分 3 测试类部分 4 测试本次结果 4 1跑出来的值 4 2mysql值 1 接口部分 定义一个接口返回User
  • 【轩说Java】JavaSE知识点难点汇总

    文章目录 JAVA SE 抽象类与其实现子类 抽象类与其子类如下 静态函数不存在重写和多态的概念 重写的要求 接口interface 类 接口的实现 一对多 接口 接口的继承 一对多 接口中的变量和函数 接口作为一种标签 堆 栈 静态方法区
  • Flask-SQLALchemy 连接数据库

    Flask SQLALchemy 连接数据库 在 Flask Web 框架中 Flask SQLALchemy 扩展对数据库操作进行了封装 使用 Flask SQLALchemy 可以通过 Python 对象来操作数据库 一 Flask S
  • Kubernetes集群配置免费的泛域名证书支持https

    前言 kubernetes 集群默认安装的证书是自签发证书 浏览器访问会发出安全提醒 本文记录了利用 dnspod cert manager let s encrytp 等开源组件 实现泛域名证书的自动生成 续期管理 为现有kubernet
  • [转]:Javascript+xmlhttp调用Webservice

    原文地址 http netboy cnblogs com archive 2006 02 18 333260 html 1 创建webservice 为了免于落俗我稍稍修改了创建webserice的默认webmethod using Sys
  • Python 30天: 第一天 -- 简介

    第二天 gt gt 第一天 欢迎观看python30天 介绍 Python 是一种用于通用编程的高级编程语言 它是一种开源 解释型 面向对象的编程语言 Python 是由荷兰程序员 Guido van Rossum 创建的 Python 编
  • Redis之String类型

    文章目录 Redis之String类型 1 赋值 获取值 2 同时设置 获取多个键值 3 数值增减 4 获取字符串长度 5 向尾部追加值 6 分布式锁 7 应用场景 Redis之String类型 Redis命令不区分大小写 1 赋值 获取值
  • 测试基础-系统测试包括哪些内容

    一 系统测试包含哪些测试 1 测试范围 整个系统 功能 性能 安全 界面 兼容等等 2 测试方法 黑盒测试 3 测试依据 需求规格说明书 SRS 4 评估基准 需求覆盖 5 测试类型 测试策略 补充说明 实例 淘宝登录操作 10万用户操作
  • 腾讯架构师谈技术管理:十年沉浮,最后我选择了离开……

    转自 http www techug com post tencent architect talk about team managment html 作者介绍 韩伟 腾讯科技互娱研发部架构师 曾在网易任职8年 担任无线事业部产品总监 多
  • lwip协议栈创建web服务器,基于LWIP的WEB服务器的研究与实现

    摘要 随着嵌入式系统的蓬勃发展 嵌入式技术已经被用于家庭 工业设备 军事等各个领域 同时Internet技术的日趋成熟 让各种嵌入式设备共享互联网的资源 将信息快速的传递到世界的另一端变得越来越紧迫 因此将嵌入式设备与Internet技术的
  • 单变量线性回归实现波士顿房价预测

    1 预测过程 1 波士顿地区房价数据获取 数据来自于sklearn自带数据集 2 波士顿地区房价数据分割 3 训练与测试数据标准化处理 4 使用最简单的线性回归模型LinearRegression对房价进行预测 2 回归算法的评价指标有MS
  • python基础教程:Python基于递归算法实现的走迷宫问题

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 本文实例讲述了Python基于递归算法实现的走迷宫问题 分享给大家供大家参考 具体如下 什么是递归 简单地理解就是函数调用自身的过程就称之为递归 什么时候用到递归 如果一个
  • 以太网帧、IP数据报的图解格式(包含相关例题讲解,一题足够)

    目录 一 基础知识 1 1 UDP段 IP数据报 以太网帧图示 1 2 以太网帧图示 1 3 IP数据报图示 二 例题讲解 1 1 题目及答案 1 2 答案解析 一 基础知识 1 1 UDP段 IP数据报 以太网帧图示 通信过程中 每层协议
  • git ssh key生成

    01 什么是Github和Git GitHub是一个面向开源及私有软件项目的托管平台 因为只支持git 作为唯一的版本库格式进行托管 故名GitHub 我们可以在github上建立一个网上的仓库 可以把代码提交到网上 让别人也可以看到我们的
  • KeyError: Spider not found 5种出错的情况

    KeyError Spider not found name一样 为何还是找不到spider 呢 往下看看 总有一个是你要的答案 第一种 最简单的错误 运行的爬虫名字与爬虫文件中的name不相同 解决方案 令两者名字相同即可 当然90 的人
  • 【React】中渲染列表、添加点击事件

    渲染列表 例如有如下数组 11 22 33 在react中可以用数组的map方法 import React Component from react export default class App extends Component co