react ref和组件API

2023-11-05

介绍:

昨天学习到了生命周期,今天我们接着昨天的知识点继续学习,今天学习一下state ,setState以及ref和组件API,大家感兴趣的话可以跟随文章进行学习呦

state和setState

state 组件自身状态

setState(updater[,callback])

第一个参数:updater 更新数据的方法/对象

第二个参数:callback 更新成功后的回调函数

异步: react通常会集齐一批需要更新的组件,然后一次性更新来保证渲染的性能
浅合并: Object.assign()
React 在调用 setstate 后,react 会将传入的参数对象和组件当前的状态 合并,触发调和过程, 在调和过程中,react 会根据新的状态构建 react 元素树重新渲染整个 UI 界面,在得到元素树之后,react 会自动计算新老节点的差异,根据差异对界面进行最小化重新渲染

ref是什么

ref是React提供的用来操纵React组件实例或者DOM元素的接口。

ref分为三种定义方式

1.字符串形式的ref

在这里插入图片描述

2.回调形式的ref

在这里插入图片描述

3.createRef创建ref容器·

在这里插入图片描述

代码效果图:

class MyComponent extends React.Component {
  handleClick() {
    // 使用原生的 DOM API 获取焦点
    this.refs.myInput.focus();
  }
  render() {
    //  当组件插入到 DOM 后,ref 属性添加一个组件的引用于到 this.refs
    return (
      <div>
        <input type="text" ref="myInput" />
        <input
          type="button"
          value="点我输入框获取焦点"
          onClick={this.handleClick.bind(this)}
        />
      </div>
    );
  }
}
 
ReactDOM.render(
  <MyComponent />,
  document.getElementById('example')
);

Keys

介绍

Keys 可以在 DOM 中的某些元素被增加或删除的时候帮助 React 识别哪些元素发生了变化。因此你应当给数组中的每一个元素赋予一个确定的标识。

const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) =>
  <li key={number.toString()}>
    {number}
  </li>
);

一个元素的 key 最好是这个元素在列表中拥有的一个独一无二的字符串。通常,我们使用来自数据的 id 作为元素的 key:

const todoItems = todos.map((todo) =>
  <li key={todo.id}>
    {todo.text}
  </li>
);

当元素没有确定的 id 时,你可以使用他的序列号索引 index 作为 key:

const todoItems = todos.map((todo, index) =>
  // 只有在没有确定的 id 时使用
  <li key={index}>
    {todo.text}
  </li>
);

注意

如果列表可以重新排序,我们不建议使用索引来进行排序,使用索引的话每修改一次属性,所有属性都会重新渲染一遍,非常浪费性能,所有不建议使用索引

用keys提取组件

元素的 key 只有在它和它的兄弟节点对比时才有意义。

比方说,如果你提取出一个 ListItem 组件,你应该把 key 保存在数组中的这个 元素上,而不是放在 ListItem 组件中的

  • 元素上。
  • 错误的示范

    function ListItem(props) {
      const value = props.value;
      return (
        // 错啦!你不需要在这里指定key:
        <li key={value.toString()}>
          {value}
        </li>
      );
    }
    
    function NumberList(props) {
      const numbers = props.numbers;
      const listItems = numbers.map((number) =>
        //错啦!元素的key应该在这里指定:
        <ListItem value={number} />
      );
      return (
        <ul>
          {listItems}
        </ul>
      );
    }
    
    
    const numbers = [1, 2, 3, 4, 5];
    ReactDOM.render(
      <NumberList numbers={numbers} />,
      document.getElementById('example')
    );
    

    key的正确使用方式

    React 实例
    function ListItem(props) {
      // 对啦!这里不需要指定key:
      return <li>{props.value}</li>;
    }
     
    function NumberList(props) {
      const numbers = props.numbers;
      const listItems = numbers.map((number) =>
        // 又对啦!key应该在数组的上下文中被指定
        <ListItem key={number.toString()}
                  value={number} />
     
      );
      return (
        <ul>
          {listItems}
        </ul>
      );
    }
     
    const numbers = [1, 2, 3, 4, 5];
    ReactDOM.render(
      <NumberList numbers={numbers} />,
      document.getElementById('example')
    );
    

    组件API

    1. 替换状态:replaceState

    基本表达式: replaceState(object nextState[, function callback])

    参数一:nextState,将要设置的新状态,该状态会替换当前的state。

    参数二:callback,可选参数,回调函数。该函数会在replaceState设置成功,且组件重新渲染后调用。
    参数三:replaceState()方法与setState()类似,但是方法只会保留nextState中状态,原state不在nextState中的状态都会被删除。

    1. 设置属性:setProps

    表达式:setProps(object nextProps[, function callback])

    参数一:nextProps,将要设置的新属性,该状态会和当前的props合并

    参数二:callback,可选参数,回调函数。该函数会在setProps设置成功,且组件重新渲染后调用。

    设置组件属性,并重新渲染组件。

    props相当于组件的数据流,它总是会从父组件向下传递至所有的子组件中。当和一个外部的JavaScript应用集成时,我们可能会需要向组件传递数据或通知React.render()组件需要重新渲染,可以使用setProps()。

    更新组件,我可以在节点上再次调用React.render(),也可以通过setProps()方法改变组件属性,触发组件重新渲染。

    1. 替换属性:replaceProps

    表达式:replaceProps(object nextProps[, function callback])

    参数一: nextProps,将要设置的新属性,该属性会替换当前的props。

    参数二: callback,可选参数,回调函数。该函数会在replaceProps设置成功,且组件重新渲染后调用。
    replaceProps()方法与setProps类似,但它会删除原有 props。

    1. 强制更新:forceUpdate

    表达式: forceUpdate([function callback])

    参数说明
    callback,可选参数,回调函数。该函数会在组件render()方法调用后调用。

    forceUpdate()方法会使组件调用自身的render()方法重新渲染组件,组件的子组件也会调用自己的render()。但是,组件重新渲染时,依然会读取this.props和this.state,如果状态没有改变,那么React只会更新DOM。

    forceUpdate()方法适用于this.props和this.state之外的组件重绘(如:修改了this.state后),通过该方法通知React需要调用render()

    一般来说,应该尽量避免使用forceUpdate(),而仅从this.props和this.state中读取状态并由React触发render()调用。

    1. 获取DOM节点:findDOMNode

    表达式: DOMElement findDOMNode()

    返回值: DOM元素DOMElement

    如果组件已经挂载到DOM中,该方法返回对应的本地浏览器 DOM 元素。当render返回null 或 false时,this.findDOMNode()也会返回null。从DOM 中读取值的时候,该方法很有用,如:获取表单字段的值和做一些 DOM 操作。

    1. 判断组件挂载状态:isMounted

    表达式: bool isMounted()

    返回值:true或false,表示组件是否已挂载到DOM中

    isMounted()方法用于判断组件是否已挂载到DOM中。可以使用该方法保证了setState()和forceUpdate()在异步场景下的调用不会出错。

    总结

    今天主要学习了组件通信(ref)以及组件API,今天的知识也是react偏复杂一点的,大家可以在看知识点的同时,多练习一下,边敲代码边学习,这样的话,记忆的也更加深刻.

    最后作者创作不易,如果文章对你有帮助的话,记得留下你的点赞和关注呦.

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

react ref和组件API 的相关文章

随机推荐

  • JAVA-单元测试、字段封装、构造器、方法重载

    单元测试 单元测试主要是用于提高编写代码质量 编写单元测试来对我们所编写的方法进行测试 单元测试是开发人员编写 单元测试依赖Junit 这个框架 单元测试方法上需加 Test assertXXX断言 主要是用于判断测试的通过的条件 字段封装
  • Flink项目1.1- 实时页面统计-热门页面topN

    1 需求 2 需求输出每个窗口访问量最大的5个地址 所以一定是无状态的输出 有两种办法 1 keyby后自己使用processfunction自己定义state 否则是有状态的输出 2 window后 windowAll方法 3 正常情况下
  • 华为云计算之FusionStorage虚拟机部署FSM

    华为云计算之FusionStorage虚拟机部署FSM 一 FusionStorage实际部署方式 1 融合部署 融合部署图示 融合部署建议 2 FusionStorage分离部署 分离部署图示 分离部署建议 二 FusionStorage
  • SpringBoot vue电影购票系统 电影院系统

    SpringBoot vue电影购票系统 电影院系统 SpringBoot 电影购票系统 电影院系统 功能介绍 首页 登录 注册 图片轮播 正在热播列表 热门榜单Top10 电影分类 按类型 地区展示 搜索 活动 留言 评价客服 购买电影票
  • LeetCode初级算法:数组--买卖股票的最佳时机 II

    以下是本人的C 算法学习笔记 记录在博客上以供自己随时查阅 题目描述 给定一个数组 它的第 i 个元素是一支给定股票第 i 天的价格 设计一个算法来计算你所能获取的最大利润 你可以尽可能地完成更多的交易 多次买卖一支股票 注意 你不能同时参
  • mavoneditor 显示html,Markdown编辑器 mavonEditor

    Markdown编辑器 mavonEditor 前端 HTML Markdown 627次浏览 0次点赞 2019 01 25 21 46 mavonEditor 是基于Vue的markdown编辑器 githup 项目地址 1 安装 np
  • html实现购物车全选,vue实现商品购物车全选与全不选项目实战

    项目需求 实现一个购物车 全选框实现对商家和商品的全选 商家全选框实现对当前商家所有商品的全选 取消其中一个商品则取消对应商家全选和全选框 选中一个商家下的所有商品则勾选对应商家的全选框 不勾选全选框 选中所有商品则勾选所有商家全选框和全选
  • 电脑不能正常启动windows怎么办,电脑系统无法正常启动

    在用电脑的时候 我们经常会碰到windows服务无法启动的问题 很多朋友也不知道怎么解决 加上导致电脑不能正常启动的因素有很多 所以 下面小编将和大家分享两种电脑无法正常启动windows解决方法 电脑不能正常启动windows怎么办 具体
  • Python做曲线拟合(一元多项式拟合及任意函数拟合)

    目录 1 一元多项式拟合 使用方法 np polyfit x y deg 2 任意函数拟合 使用 curve fit 方法 实例 1 初始化 x 和 y 数据集 2 建立自定义函数 3 使用自定义的函数生成拟合函数绘图 1 一元多项式拟合
  • pip 常用命令及控制台怎么查看python 及pip 和已安装包版本号

    在使用python的时候 经常使用到pip这个工具 可以很方便的线上安装依赖库 当然pip还有很多参数都可以帮我们去查询一些库信息 在安装python的时候 下载带有pip的安装包就可以直接安装pip啦 当然没有带pip的 也可以通过下载安
  • [C] 跨平台使用Intrinsic函数范例2——使用SSE2、AVX指令集 处理 双精度浮点数组求和

    作者 zyl910 本文面对对SSE等SIMD指令集有一定基础的读者 以双精度浮点数组求和为例演示了如何跨平台使用SSE2 AVX指令集 支持vc gcc编译器 在Windows Linux Mac这三大平台上成功运行 一 关键讲解 前文
  • 90道渗透测试面试题(附答案)

    2023年已经快过去一半了 不知道小伙伴们有没有找到自己心仪的工作呀 最近后台收到不少小伙伴说要我整理一些渗透测试的面试题 今天它来了 觉得对你有帮助的话记得点个赞再走哦 1 什么是渗透测试 渗透测试是一种评估计算机系统 网络或应用程序的安
  • 四.javascript对象

    目录 一 对象的介绍 1 对象的概念 2 对象的属性 3 对象的方法 二 创建对象 1 使用构造函数创建内置对象 2 直接创建自定义对象 3 使用自定义构造函数创建对象 三 对象的属性 1 设置对象的属性 2 存取对象属性 3 属性的枚举
  • 使用gpt和mindshow快速制作PPT

    目录 准备工具 PPT制作大体流程 工具 步骤 获取PPT大纲 注意 要markdown格式 编辑 打开MindShow 找不到的可以私信我 编辑 创建ppt 编辑 选择ppt基本样式 编辑 点击下载 不过要提前登录一下就好 编辑 添加动画
  • Qt(c++)调用python一直报错slot、hypot等

    最近在Qt里调用python代码 参考教程 https blog csdn net a137748099 article details 119217197 引入python的include libs之后 在c 里写了简单的调用python
  • 各种通信方式对比

    各种通信方式对比 2011年11月09日 16 58 25 horatio2010 阅读数 444 通信名称 连接端 通信方式 传输顺序 通信速度 I2C scl sda 2 串行 高位 低位 标准模式速度100kbit s 快速模式
  • 前后端常见的几种鉴权方式

    本文链接 https blog csdn net wang839305939 article details 78713124 最近在重构公司以前产品的前端代码 摈弃了以前的session cookie鉴权方式 采用token鉴权 忙里偷闲
  • C#深拷贝和浅拷贝的区别

    先上代码 后解释 public class Person public int Age public DateTime BirthDate public string Name public IdInfo IdInfo
  • C++ Templates:实例化

    延迟实例化 当隐式实例化类模板时 同时也实例化了该模板的每个成员声明 但并没有实例化相应的定义 然而 存在例外 1 如果类模板包含了一个匿名的union 那么该union定义的成员同时也被实例化了 2 作为实例化类模板的结果 虚函数的定义可
  • react ref和组件API

    介绍 昨天学习到了生命周期 今天我们接着昨天的知识点继续学习 今天学习一下state setState以及ref和组件API 大家感兴趣的话可以跟随文章进行学习呦 state和setState state 组件自身状态 setState u