React(条件、列表渲染)及其生命周期

2023-10-27

条件渲染

下面用成绩等级和游戏段位来实际来操作举例一下,以便于理解

//vue中:用v-if 
//angular中:用 ngIf
// 条件渲染: if
// rcc
import React, { Component } from "react";

export default class App extends Component {
  state = { score: 60 };

  // 条件渲染: 依赖原生的if判断 -- 制作函数 根据不同条件返回不同的 JSX

  // 非事件触发: 不涉及this指向问题
  showRes() {
    // setState(): 会刷新所有 数据变更时 相关 的UI
    let score = this.state.score;

    if (score < 60) {
      return <p>很遗憾, 您的成绩不及格!</p>;
    } else if (score >= 60 && score < 90) {
      return <b>您的成绩良好!</b>;
    } else {
      return <h2>恭喜您, 成绩优秀!</h2>;
    }
  }

  showRank() {
    let score = this.state.score;

    if (score < 20) {
      return <p>黑铁</p>;
    } else if (score < 40) {
      return <p>青铜</p>;
    } else if (score < 60) {
      return <p>白银</p>;
    } else if (score < 80) {
      return <p>黄金</p>;
    } else {
      return <p>铂金</p>;
    }
  }

  render() {
    return (
      <div>
        {/* {}中的代码 在页面渲染时 会自动触发! */}
        {this.showRes()}
        <h3>您的分数是:{this.state.score} </h3>
        <button onClick={() => this.setState({ score: this.state.score - 10 })}>
          减分
        </button>
        <button onClick={() => this.setState({ score: this.state.score + 10 })}>
          加分
        </button>

        {this.showRank()}
      </div>
    );
  }
}

此代码里面涉及this指向问题: 事件
onClick={this.方法名}

注释方法中的this指向
普通函数: 使用bind 绑定this
this.函数.bind(this,其它参数)

采用箭头函数保障this
()=> this.方法名(参数)

列表渲染

下面随便写几个列表,使用for循环来获取下标放到 jsx 语法中,形成新的数组,从而把数组的每一项渲染到页面上。

//vue 中:v-for
//angular:ngFor

import React, { Component } from "react";

export default class App extends Component {
  emps = [
    { name: "小花", age: 12, gender: 1 },
    { name: "小易", age: 12, gender: 1 },
    { name: "小爱", age: 12, gender: 0 },
    { name: "小乐", age: 12, gender: 1 },
    { name: "小胖", age: 12, gender: 0 },
  ];
  name = ["小意", "小爱", "小乐", "二傻", "二货", "二胖"];
  names_btns = [
    <button>亮亮</button>,
    <button>东东</button>,
    <button>然然</button>,
    <button>小新</button>,
    <button>华哥</button>,
  ];
  // 自动化处理:使用for 循环遍历数组 每一项放到 jsx 语法中,形成新的数组
  showRbtns() {
    let arr = [];
    // react 要求每一项有唯一标表示
    this.name.forEach((item, index) => {
      let btn = <button key={index}>{item}</button>;
      arr.push(btn);
    });
    return arr;
  }

  showlist() {
    let arr = []; // react 要求每一项有唯一标表示
    this.name.forEach((item, index) => {
      arr.push(
        <li key={index} style={{ color: "blue" }}>
            *{item}
                  
        </li>
      );
    });
    return arr;
  }

  showTrs() {
    let arr = [];

    this.emps.forEach((item, index) => {
      // react中不存在 过滤器 和 管道的说法  {{ xxx | pipe }}
      // 为什么要有管道/过滤器:  vue/angular 在html中写js不方便

      // react就是JS  不存在写JS不方便的情况
      let sex = ["女", "男"][item.gender]; // 数组[序号]

      arr.push(
        <tr key={index}>
          <td>{index + 1}</td>
          <td>{item.name}</td>
          <td>{item.age}</td>
          <td>{sex}</td>
        </tr>
      );
    });

    return arr;
  }
  render() {
    return (
      <div>
        {/* 数组的默认处,自动把数组的每一项形式到页面上 */}
        <div>{this.name}</div>
        {/* <div>{this.names_btns}</div> */}
        <div>{this.showRbtns()}</div> <div>{this.showlist()}</div>
        <table border="1">
          {/* DOM对 结构要求严格,  tr应该出现在 tbody thead 或 tfoot 里 */}
          <thead>
            <tr>
              <td>序号</td>
              <td>姓名</td>
              <td>年龄</td>
              <td>性别</td>
            </tr>
          </thead>
          <tbody>{this.showTrs()}</tbody>
        </table>
      </div>
    );
  }
}

此方法还可以用map方法来简化列表渲染,代码如下,仅供参考

import React, { Component } from "react";

export default class App extends Component {
  names = ["lucy", "lili", "Tom", "mike"];
  
  // 语法糖: ()=> { return xxxx; }   简化为 () => xxx
  showBtns = () =>
    this.names.map((item, index) => <button key={index}>{item}</button>);
  showLis = () => this.names.map((item, index) => <li key={index}>{item}</li>);
  // showBtns() {

  //   return this.names.map((item, index) => {

  //     return <button key={index}>{item}</button>;

  //   });

  //   // return arr;

  // }
  render() {
    return (
      <div>
        {this.showBtns()}
        <ul>{this.showLis()}</ul>
      </div>
    );
  }
}

生命周期

不同的组件, 从出生 到 销毁 之间经历的过程: 生命周期
过程中的关键节点 都会触发对应的函数 — 钩子函数

// 生命周期

//rcc

import React, { Component } from "react";



export default class App extends Component {

  state = { show: false, age: 10 };

  render() {

    return (

      <div>

        <button onClick={() => this.setState({ show: !this.state.show })}>

          切换Son组件的显示

        </button>

        {this.state.show ? <Son age={this.state.age} /> : ""}

        <button onClick={() => this.setState({ age: this.state.age * 2 })}>

          增加age: {this.state.age}

        </button>

      </div>

    );

  }

}

//子组件

class Son extends Component {

  state = { num: 1 };

  componentDidMount() {

    // 挂载时:  同vue的 mounted

    console.log("componentDidMount: 组件显示时, 挂载");

  }

  // 面试问题: 如何提高 React 渲染效率

  // 此生命周期的返回值 将会决定页面要不要刷新

  shouldComponentUpdate(props, state) {

    // 传入的值: 即将变成什么样, 问: 要不要刷新UI

    console.log("shouldComponentUpdate:", state);

    // num为偶数不更新

    if (state.num % 2 == 0) {

      console.log("num是偶数, 不刷新UI");

      return false;

    } //false代表不更新UI

    console.log("num是奇数, 刷新UI");

    return true;

  }

  // props: 父子传参的值, 类似于vue 的 props 属性

  // <Son name="东东" />  则 props = {name:'东东'}

  componentDidUpdate(old_props, old_state) {

    // 数据发生更新

    // 参数都是发生更新之前的值

    console.log("componentDidUpdate: 更新前", old_props, old_state);

    console.log("componentDidUpdate: 更新后", this.props, this.state);

  }

  componentWillUnmount() {

    //将要卸载时: 同vue的 destroy

    console.log("componentWillUnmount: 组件将要消失时, 卸载");

  }

  render() {

    return (

      <div>

        <h3>我是Son组件</h3>

        <button onClick={() => this.setState({ num: this.state.num + 1 })}>

          {this.state.num}

        </button>

      </div>

    );

  }

}

以上是米兔吖分享的有关于React的条件,列表渲染及其所经历的生命周期,如有错误和不足,希望路过的小伙伴可以在评论区留言哟!

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

React(条件、列表渲染)及其生命周期 的相关文章

  • pytorch之torch.randn()

    torch randn sizes out None dtype None layout torch strided device None requires grad False gt Tensor Args sizes int a se

随机推荐

  • 进入传奇荣耀显示服务器不存在,传奇荣耀复古版

    传奇荣耀复古版 1区服务器爆满排队15分钟 传奇荣耀复古版是一款复古系列的传奇游戏 玩家能够在游戏中24小时匹配到队友进行副本攻略 更有完善的社交系统 让玩家轻松结识更多的兄弟姐妹 实时语音系统方便玩家更好的进行沟通 让玩家们的作战更加轻松
  • 通过Android Timer来实现3S自动页面跳转

    实现开始页面的跳转 就是打开一个Android手机APP的欢迎界面后跳转到指定界面 启动页面的作用能够打广告 发公告 做缓存处理 更新数据等等 Timer是一种定时器工具 用来在一个后台线程计划执行指定任务 它可以计划执行一个任务一次或反复
  • 基于MATLAB的特征值与特征向量(附完整代码)

    目录 一 一般矩阵的特征值与特征向量 例题1 二 广义特征向量问题 例题2 三 稀疏矩阵的最大特征值 例题3 一 一般矩阵的特征值与特征向量 A为n阶矩阵 若数和向量x满足 那么数称为A的特征值 x称为A对应于特征值的特征向量 如果把式子改
  • 文本聚类(二)—— KMeans 聚类

    目录 二 KMeans 聚类 2 1 加载数据集 2 2 数据清洗 2 3 文本向量化 2 4 文本聚类 2 5 关键词展示 2 6 判定最佳聚类数 参考文档 在第一篇内容中 我们介绍了 LDA 主题模型 这一篇 我们将介绍经典的 KMea
  • 大数据分析利器——clickhouse的简介与应用

    大数据分析利器 clickhouse的简介与应用 背景介绍 公司原有的数仓技术架构是基于传统的Hadoop的数仓体系 使用任务调度 通过不同的hive的任 务调度解决不同的业务主题 传统的数仓架构胜在稳定 依托于Hadoop体系 使用的用户
  • Linux多线程:读写锁

    当有一个线程已经持有互斥锁时 互斥锁将所有试图进入临界区的线程都阻塞住 但是考 虑一种情形 当前持有互斥锁的线程只是要读访问共享资源 而同时有其它几个线程也想 读取这个共享资源 但是由于互斥锁的排它性 所有其它线程都无法获取锁 也就无法读
  • Asp.Net Mvc AutoFac 的简单使用

    http www kungge com kungge 2699 html 转载于 https www cnblogs com zhihang p 11059740 html
  • Windows MongoDB安装

    目录 一 下载 社区版7 0 0 二 安装 三 安装后的问题 四 测试 一 下载 社区版7 0 0 官网 Install MongoDB Community Kubernetes Operator MongoDB 二 安装 下载后双击打开安
  • idea自动生成类注释和方法注释

    一 自动生成类注释 打开Setting 选在Editor 然后是File and Code Templates 最后是Files 中的Class 点击class后 编辑右边的红色边框 里边是模板 将模板设置好 点击ok即可 下边是模板中的示
  • 【SpringBoot高级篇】SpringBoot集成Elasticsearch搜索引擎

    SpringBoot高级篇 SpringBoot集成Elasticsearch搜索引擎 1 什么是Elasticsearch 2 安装并运行Elasticsearch 2 1 拉取镜像 2 2 启动镜像 3 安装kibana 3 1 拉取k
  • BAT数据洞察报告 附下载地址

    BAT B指百度 A指阿里巴巴 T指腾讯 是三大互联网公司百度公司 Baidu 阿里巴巴集团 Alibaba 腾讯公司 Tencent 首字母的缩写 百度总部在北京 阿里巴巴总部在浙江省杭州市 腾讯总部在广东省深圳市 关注公众号 互联互通社
  • iOS App的打包和上架流程

    转载 iOS App的打包和上架流程 掘金 1 创建账号 苹果开发者账号几种开发者账号类型 个人开发者账号 费用 99 美元 年 688 00元 协作人数 仅限开发者自己 不需要填写公司的邓百氏编码 D U N S Number 支持账号下
  • WTL 界面设计篇(CSkinHyperLink)

    头文件声明 CSkinHyperLink h pragma once include SkinManager h class CSkinHyperLink public CWindowImpl
  • UI自动化测试02

    一 浏览器操作 1 设置浏览器缩放大小 from selenium import webdriver import time 打开浏览器 driver webdriver Edge 设置浏览器最大化 driver maximize wind
  • 学习笔记,上传代码到github

    今天对于使用pycharm上传推送代码到github的总结 文章目录 一 github登录 二 github共享本地库 若上传代码有报错情况可以查看 github报错博客 https blog csdn net weixin 6822625
  • Nmap将端口扫描分成六个状态

    1 open 开放的 该端口正在接收TCP连接或者UDP报文 2 closed 关闭的 关闭的端口接收nmap的探测报文并做出响应 3 filtered 被过滤的 探测报文被包过滤阻止无法到达端口 nmap无法 确定端口的开放情况 4 un
  • 优化算法 - 萤火虫算法在订单分批问题中的应用及Matlab实现

    优化算法 萤火虫算法在订单分批问题中的应用及Matlab实现 订单分批问题是指将大量订单分成若干个较小的批次进行处理 以提高生产效率和降低成本 在实际应用中 如何进行订单分批是一个需要考虑多种因素的复杂决策问题 而萤火虫算法是一种能够解决这
  • 协同异构多机器人系统:综述

    研究背景 我们所生活的世界的动态和不可预测的本质使得很难设计出一个能够有效地适应所有环境的自主机器人 因此 各种形状 大小和能力的机器人 如无人机 无人地面车辆 类人机器人等机器人 随着物联网 物联网 的出现 进行合作将大大增加自动化任务的
  • 数据分析之Numpy常用方法【等差数列:np.linspace()、取整:np.ceil() ,np.floor()】

    这里写目录标题 1 np linspace 2 np ceil np floor 1 np linspace np linspace 主要用于生成等差数列 相关参数如下 start 起始点 stop 终止点 包含 num 生成start和s
  • React(条件、列表渲染)及其生命周期

    条件渲染 下面用成绩等级和游戏段位来实际来操作举例一下 以便于理解 vue中 用v if angular中 用 ngIf 条件渲染 if rcc import React Component from react export defaul