React中映射一个嵌套数组实现demo

目录
  • 正文
  • 平面+地图
  • 使用嵌套地图

正文

嵌套数组本质上是一个数组的数组,你可以把它们想象成一个表格,或者一个二维网格。为了映射一个嵌套数组,你可以使用平面和映射数组函数的组合,或者使用映射中的映射。

你可能想使用哪种方法取决于你的情况,所以我将用一个例子来解释。如果你的数据只是一个一维数组,你可以简单地使用一个普通的地图,你可以通过这个教程查看。

平面+地图

flat函数将我们的二维数组转化为一维数组,然后我们可以简单地将其映射到上面以产生我们的组件。在这个例子中,我创建了一个简单的购物清单,并将一些物品按食物类别分组:

const shoppingCart = [
    ['apple', 'banana', 'cherry'],
    ['eggs', 'milk'],
    ['carrots', 'onions'],
];

这里是我们组件的代码:

function ShoppingListItem({ item }) {
    return <li className="bg-neutral-800 p-2 font-normal shadow">{item}</li>;
}
function ShoppingList() {
    return (
        <div className="flex h-screen w-screen items-center justify-center">
            <div className="flex flex-col items-start justify-center rounded bg-neutral-800 p-8 text-3xl font-bold text-white shadow">
                <h1 className="w-full border-b-8 pb-2">Shopping List</h1>
                <ul>
                    {shoppingCart.flat().map((item) => (
                        <ShoppingListItem key={item} item={item} />
                    ))}
                </ul>
            </div>
        </div>
    );
}

这就是我们的页面的样子。

相关的物品被分组了,但为了显示它们,我们只想得到一个物品的列表。这种方法是最简单的方法,当你的数据被分组在一起并不重要时,这种方法很有用。代码更短,但代价是简化了我们的数据结构。另一个例子可能是像Instagram feed这样的东西,你从不同的用户那里得到帖子,然后把它们都放到一个feed中。

使用嵌套地图

在很多情况下,你可能想保持你的嵌套数据的结构。在这个例子中,我们将重构我们的购物清单,把我们的食物组放在一起:

function ShoppingListItem({ item, white }) {
    return (
        <div
            key={item}
            className={ //Just to have striped rows
                'rounded p-5 ' +
                (white
                    ? 'bg-neutral-700 text-white'
                    : 'bg-neutral-100 text-black')
            }>
            {item}
        </div>
    );
}
function ShoppingListRow({ items, white }) {
    return (
        <li className="flex gap-2">
            {items.map((item) => (
                <ShoppingListItem key={item} item={item} white={white} />
            ))}
        </li>
    );
}
function ShoppingListGrouped() {
    return (
        <div className="flex h-screen w-screen items-center justify-center">
            <div className="flex flex-col items-start justify-center gap-8 rounded bg-neutral-800 p-8 text-3xl font-bold text-white shadow">
                <h1 className="w-full border-b-8 pb-2">Shopping List</h1>
                <ul className="flex flex-col gap-2">
                    {shoppingCart.map((row, i) => {
                        return (
                            <ShoppingListRow
                                key={row.join()}
                                items={row}
                                white={i % 2 === 0}
                            />
                        );
                    })}
                </ul>
            </div>
        </div>
    );
}

为了保持代码的整洁,我把它分解为一个购物清单项目、一个购物清单行和整个购物清单的组件。我发现在这种情况下,这是一个非常好的方法,因为你可以从较小的、不太复杂的构件中建立起你的组件。有了这种方法,问题就从如何在一个地图内进行映射,变成了如何在一个数组上进行映射,并在两种情况下进行。

下面是我们的更漂亮的购物清单的样子。

现在,这些行不再是在一个大的列表中,而是被保存在不同的列表中,并使用了TailwindCSS的一些花哨的样式,你可以在这里准备更多的东西。这种方法在很多情况下都很有用,比如表格、网格等等。我们也可以很容易地用两个地图来写第一个例子,使用React Fragment,选择权完全在你手中。

希望通过这两个例子中的一个,你能够在你的场景中通过一个嵌套数组进行映射,更多关于React映射嵌套数组的资料请关注我们其它相关文章!

(0)

相关推荐

  • React循环遍历渲染数组和对象元素方式

    目录 循环遍历渲染数组和对象元素 遍历渲染数组 遍历渲染对象元素 遍历对象生成dom 项目场景 问题描述 补充 循环遍历渲染数组和对象元素 遍历渲染数组 1.单纯数组 const pureArr = ['a','b','c','d'] //假如我们想将上面的数组利用react渲染成一个列表,代码如下:{ {pureArr.map(item => ( <li key={item}>item</li> ))} 以上代码在codesandbox中运行结果如下: 2. 对象数组 co

  • React函数组件useContext useReducer自定义hooks

    目录 一.hooks(useContext) 二.hooks(useReducer) 三.hooks(useContext搭配useReducer使用) 四.自定义hooks 一.hooks(useContext) 接收一个 context 对象(React.createContext 的返回值)并返回该 context 的当前值.当前的 context 值由上层组件中距离当前组件最近的 <MyContext.Provider> 的 value prop 决定. 新建useContext.js

  • React 中的重新渲染类组件及函数组件

    目录 缘起 类组件 React 合成事件 定时器回调后触发 setState 异步函数后调触发 setState 原生事件触发 setState 修改不参与渲染的属性 只是调用 setState,页面会不会重新渲染 多次渲染的问题 测试代码 函数组件 React 合成事件 定时器回调 异步函数回调 原生事件 更新没使用的状态 小结 不同的情况 设置同样的 State React Hook 中避免多次渲染 将全部 state 合并成一个对象 使用 useReducer 状态直接用 Ref 声明,需

  • React函数组件和类组件的区别及说明

    目录 React函数组件和类组件区别 函数组件 类组件 区别 React函数式组件和类组件的优缺点 1.类组件的性能消耗比较大 2.函数式组件性能消耗小 React函数组件和类组件区别 定义组件有两个要求: 组件名称必须以大写字母开头 组件的返回值只能有一个根元素 函数组件 function Welcome (props) {   return <h1>Welcome {props.name}</h1> } ReactDOM.render(<Welcome name='rea

  • react使用useState修改对象或者数组的值无法改变视图的问题

    目录 使用useState修改对象或者数组的值无法改变视图 解决办法 关于useState使用及注意事项 一.基本使用 二.注意事项 使用useState修改对象或者数组的值无法改变视图 在react中使用useState无法改变视图,数据改变但是视图未改变 未渲染的代码如下: const [needLists,setNeedLists]=useState([]) const pressDownEnter=(e)=>{     if(e.keyCode===13){       needList

  • 使用react在修改state中的数组和对象数据的时候(setState)

    目录 react修改state的数组和对象数据的时候(setState) 需要注意 react修改数组对象的注意事项 删除数组中的指定元素 合并两个对象 修改多层级对象的值 react修改state的数组和对象数据的时候(setState) 首先在修改状态数据(state)的时候,我们要遵循react的规则,使用setState()方法去修改 此时修改的数据是一个数组或者是一个对象的时候,setState中传递一个对象是不能够满足的,此时就需要给setState中传递函数了! 此时函数中的参数s

  • react函数组件useState异步,数据不能及时获取到的问题

    目录 react useState异步,数据不能获取到 问题 解决方法一 react中useState的使用及注意事项 基本使用 注意事项 react useState异步,数据不能获取到 useState() 属于异步函数,在useState() 第一次存储的时候,值会存储不上 因为react中state的更新是异步的,我们setState后,react不会立刻对值进行改变,而是将其暂时放入pedding队列中.react会合并多个state,然后值render一次,所以不要在循环中使用use

  • React中映射一个嵌套数组实现demo

    目录 正文 平面+地图 使用嵌套地图 正文 嵌套数组本质上是一个数组的数组,你可以把它们想象成一个表格,或者一个二维网格.为了映射一个嵌套数组,你可以使用平面和映射数组函数的组合,或者使用映射中的映射. 你可能想使用哪种方法取决于你的情况,所以我将用一个例子来解释.如果你的数据只是一个一维数组,你可以简单地使用一个普通的地图,你可以通过这个教程查看. 平面+地图 flat函数将我们的二维数组转化为一维数组,然后我们可以简单地将其映射到上面以产生我们的组件.在这个例子中,我创建了一个简单的购物清单

  • 在React中写一个Animation组件为组件进入和离开加上动画/过度效果

    在React中写一个Animation组件为组件进入和离开加上动画/过度效果 问题 在单页面应用中,我们经常需要给路由的切换或者元素的挂载和卸载加上过渡效果,为这么一个小功能引入第三方框架,实在有点小纠结.不如自己封装. 思路 原理 以进入时 opacity: 0 --> opacity: 1  ,退出时 opacity: 0 --> opacity: 1 为例 元素挂载时 1.挂载元素dom 2.设置动画 opacity: 0 --> opacity: 1 元素卸载时 1.设置动画 o

  • React中的路由嵌套和手动实现路由跳转的方式详解

    目录 React的路由嵌套 手动路由的跳转 React的路由嵌套 接上一篇文章, 在上一篇文章中讲解了路由的基本介绍, 我再来介绍一下路由的其他用法 在开发中,路由之间是存在嵌套关系的. 这里我们假设Home页面中还有两个页面内容: 推荐列表和排行榜列表; 点击不同的链接可以跳转到不同的地方,显示不同的内容; <Routes> <Route path='/' element={<Navigate to="/home"/>}></Route>

  • 深入浅析React中diff算法

    React中diff算法的理解 diff算法用来计算出Virtual DOM中改变的部分,然后针对该部分进行DOM操作,而不用重新渲染整个页面,渲染整个DOM结构的过程中开销是很大的,需要浏览器对DOM结构进行重绘与回流,而diff算法能够使得操作过程中只更新修改的那部分DOM结构而不更新整个DOM,这样能够最小化操作DOM结构,能够最大程度上减少浏览器重绘与回流的规模. 虚拟DOM diff算法的基础是Virtual DOM,Virtual DOM是一棵以JavaScript对象作为基础的树,

  • 在React中如何优雅的处理事件响应详解

    前言 本文主要给大家介绍的是关于React处理事件响应的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍吧. React中定义一个组件,可以通过React.createClass或者ES6的class.本文讨论的React组件是基于class定义的组件.采用class的方式,代码结构更加清晰,可读性强,而且React官方也推荐使用这种方式定义组件. 处理事件响应是Web应用中非常重要的一部分.React中,处理事件响应的方式有多种. 一.使用箭头函数 先上代码: //代码1 class

  • java实现向有序数组中插入一个元素实例

    整理文档,搜刮出一个java实现向有序数组中插入一个元素,稍微整理精简一下做下分享 package cn.jbit.array; import java.util.*; public class Insert { public static void main(String[] args) { //字符排序 char[] chars = new char[9]; chars[0] = 'a'; chars[1] = 'c'; chars[2] = 'u'; chars[3] = 'b'; cha

  • Javascript中克隆一个数组的实现代码

    08年一家公司JS面试题,职位是javascript工程师(赴google) 面试官问我如何克隆一个数组,当时想了下js的Object没有clone方法,java的Object有. 那怎么得到一个新数组呢? 我当时回答:用一个loop将源数组元素依次push到新数组中.这是最简单的方法,但显然不是面试官想要的答案. 最后告知我:利用Array的slice方法.示例如下: 复制代码 代码如下: var ary = [1,2,3];//源数组 var ary2 = ary.slice(0);//克隆

  • C++通过自定义函数找出一个整数数组中第二大数的方法

    本文实例讲述了C++通过自定义函数找出一个整数数组中第二大数的方法.分享给大家供大家参考.具体实现方法如下: const int MINNUMBER = -32767 ; //2字节的Int 0x8000-1, //4字节的Int 0x80000000-1 -2147483647 int find_sec_max( int data[] , int count) { int maxnumber = data[0] ; int sec_max = MINNUMBER ; for ( int i =

  • php获取数组元素中头一个数组元素值的实现方法

    本文实例讲述了php获取数组元素中头一个数组元素值的实现方法.分享给大家供大家参考.具体如下: 在php的内置函数中,获取数组元素值的函数主要有 reset next current prev end 这几个函数. reset (PHP 3, PHP 4, PHP 5) 函数定义:mixed reset ( array &array ) 作用:该函数将 array 的内部指针倒回到第一个单元并返回第一个数组单元的值,如果数组为空则返回 FALSE,代码如下: 复制代码 代码如下: $array=

  • JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法

    今天在学习js中的数组时,遇到的输出一个数组中最大.最小值以及它们的下表,以下是自己的解决方法! <script type="text/javascript"> var arr = [14, 14, 53, 14, 14, 53, 67, 67]; var max = arr[0],min = arr[0]; var maxIndex = []; maxIndex[0] = 0; var minIndex = []; minIndex[0] = 0; var j = 1,

随机推荐