首页 > 其他分享 >使用可迭代对象作为 React 组件

使用可迭代对象作为 React 组件

时间:2024-03-27 22:16:03浏览次数:22  
标签:return 迭代 iterator SYMBOL newChild React 组件

源码

最近看 React 源码的时候发现其在处理数组的同时也对可迭代协议做了处理,因此 React 组件可以是一个返回可迭代对象的函数。源码如下:

reconcileChildFibersImpl

if (isArray(newChild)) {
  return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, lanes, mergeDebugInfo(debugInfo, newChild._debugInfo));
}
if (getIteratorFn(newChild)) {
  return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, lanes, mergeDebugInfo(debugInfo, newChild._debugInfo));
}

getIteratorFn

  var MAYBE_ITERATOR_SYMBOL = Symbol.iterator;
  var FAUX_ITERATOR_SYMBOL = '@@iterator';
  function getIteratorFn(maybeIterable) {
    if (maybeIterable === null || typeof maybeIterable !== 'object') {
      return null;
    }
    var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];

    if (typeof maybeIterator === 'function') {
      return maybeIterator;
    }

    return null;
  }

可以看到 React 会判断 newChild 是否可迭代——通过 Symbol.iterator@@iterator 属性。

现在我们可以构造一个这样的组件了:

function IteratorComponent() {
  return {
    [Symbol.iterator]() {
      return {
        n: 0,
        next() {
          const tag = "h" + ++this.n;
          return {
            value: React.createElement(tag, {
              key: tag
            }, this.n),
            done: this.n > 4,
          };
        },
      };
    },
  };
}

上述组件最终会渲染出 4 个 h{n} 标签。

注意事项

  1. React 虽然支持可迭代协议,但是并不支持 generator
  2. 因为 React 会多次渲染或者会校验迭代器值的情况,对象中的 Symbol.iterator 函数必须是纯函数,即每次调用都是返回一个新的迭代器。

参考

  1. 迭代协议

标签:return,迭代,iterator,SYMBOL,newChild,React,组件
From: https://www.cnblogs.com/ende93/p/18100383

相关文章

  • 深入理解 Vue 3.0 宏函数:提升组件代码的工程化与可维护性
    Vue3.0宏函数详解:defineProps、defineEmits、defineExpose、defineSlots和defineOptions在Vue3.0中,为了更好地组织和维护组件代码,引入了几个新的宏函数。这些宏函数包括defineProps、defineEmits、defineExpose、defineSlots和defineOptions。本文将详细介绍这五......
  • 第4章 页面组件
    一. 组件的定义及属性    1.1 语法格式如下: <标签名  属性名=“属性值” >内容....</标签名>  id 组件的唯一表示,保持整个页面唯一,不常用class 组件的样式类,对应WXSS中定义的样式  style组件的内联样式,可以动态设置内联样式......
  • 反问题:迭代法
    反问题:迭代法Date:2024/03/27Reference:Colton,D.&Kress,R.InverseAcousticandElectromagneticScatteringTheory.vol.93(SpringerInternationalPublishing,Cham,2019).p170-p180使用迭代法求解反散射问题中的反障碍问题,主要想法是基于牛顿迭代。此节的......
  • 将a-drawer修改为notification组件
    效果图源码<template> <div> <a-drawer placement="right" :closable="true" width="560" :visible="visible" :after-visible-change="afterVisibleChange" @close="onClose"......
  • 深入理解 React 中的 children props 和 render props
    深入理解React中的childrenprops和renderprops在React中,childrenprops和renderprops是两种常见的组件复用模式,它们都可以帮助我们更好地组织和复用组件代码。虽然它们的实现方式有所不同,但都能够有效地实现组件之间的数据传递和功能共享。childrenpropsch......
  • elementui组件el-input 类型为number时,去掉上下箭头,并且解决输入中文后光标上移问题
    //去掉number输入框的上下箭头.def-input-numberinput::-webkit-outer-spin-button,.def-input-numberinput::-webkit-inner-spin-button{-webkit-appearance:none;}.def-input-numberinput[type="number"]{-moz-appearance:textfield;}//解决inputnumber框......
  • react零基础到精通-1|基础概念,主要特性,s6语法,react相关的开发环境和工具,react简介,箭头
    致力于解决复杂视图层开发我呢提,全新的ui组件的开发理念,1.1React简介前端UI的本质问题是如何将来源于服务器端的动态数据和用户的交互行为高效地反映到复杂的用户界面上。React另辟蹊径,通过引入虚拟DOM、状态、单向数据流等设计理念,形成以组件为核心,用组件搭建UI的开发......
  • 鸿蒙HarmonyOS实战-ArkUI组件(mediaquery)
    ......
  • 求助,路过的大佬帮忙看一下!!!!elment中input组件使用prefix-icon="el-icon-search"不加载
    背景:创建了一个简单的vue工程想用测试一下el-input组件的功能,没有显示图标。代码如下所示<template><el-inputv-model="value"placeholder="请输入内容":disabled="false":show-password="true":clearable="true"prefix......
  • 【React】React 内置 Hook
        React内置Hook是一组允许你在函数组件中使用state和其他React特性的函数。它们极大地扩展了函数组件的功能,使得在无需编写class的情况下也能使用React的全部功能。以下是一些主要的React内置Hook的介绍:1.useStateuseState是用于在函数组件中添加......