react教程-井字棋案例扩展03

2023-11-17

使用两个循环来渲染出棋盘的格子,而不是在代码里写死(hardcode)

这个关键点是在于循环,react的循环是和vue不一样的, veu中的循环是直接写在节点上,但是react的循环,是通过数组遍历的方法,先遍历出虚拟的Dom节点,然后通过render函数挂载到外层节点上

//使用 Javascript 中的 map() 方法来遍历 numbers 数组。将数组中的每个元素变成 <li> 标签,
//最后我们将得到的数组赋值给 listItems:
const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) =>
  <li>{number}</li>
);


//把整个 listItems 插入到 <ul> 元素中,然后渲染进 DOM
ReactDOM.render(
  <ul>{listItems}</ul>,
  document.getElementById('root')
);

key 

key 帮助 React 识别哪些元素改变了,比如被添加或删除。因此你应当给数组中的每一个元素赋予一个确定的标识。在列表循环中,vue和react一样,都需要为元素绑定一个特定的key,用来进行一系列的判定操作。但是react的key放的地方有点不一样。

这是在 render 中定义的两个数组,row代表的是三行,Cell代表的是每个单元格。通过循环来将棋盘渲染出来。 renderSquare  这个方法就是用来渲染单元格的,可以看到,我们需要双层循环,第一行需要有0,1,2三个单元格,以此类推。

react的渲染格式其实是我比较写不习惯的,因为他的操作都需要包裹在一个 { } 内部,箭头函数的写法也和平常的不一样,=> 之后,不是 { } 作用域,也没有 return 返回。

let row = [0, 1, 2];
let Cell = [
  [0, 1, 2],
  [3, 4, 5],
  [6, 7, 8]
];
let checkerboard = row.map((item, index) => (
  <div className="board-row" key={index}>
    {Cell.map((item1, index1) =>
      index === index1
        ? item1.map((item2, index) => this.renderSquare(item2))
        : ""
    )}
  </div>
));

从代码里面可以看到,我做了两次循环,其实这个时候,棋盘就已经渲染出来了,但是控制台会报错:Each child in a list should have a unique "key" prop

这是因为,我只是在第一层循环的时候,添加了 key ,内部第二层循环的时候,是没有添加 key 的,所以会报错。

但是仔细看第二层循环,这里其实是调用的一个方法,这里并没有节点,那这个 key 绑定到哪里呢?

renderSquare() 渲染函数 :key绑定在渲染函数的节点上。

//渲染函数不变
  renderSquare(i) {
    return (
      /*  
        因为 state 是每隔组件私有的数据,不能直接通过 子组件 Square 来改变父组件的 state
        所以,我们可以在 子组件被点击的时候,传递一个事件,通过事件传递到父组件,进而改变父组件的数据
        相当于 Vue 的父子组件传值,父传子传Props,子传父,通过emit() 传递事件
        这样我们就在父组件内部向子组件传递了两个 prop,一个是当前 单元格的值,另一个是一个 onclick 事件 
      */
      <Square
        key={i}
        value={this.props.squares[i]}
        onClick={() => this.props.onClick(i)}
      />
    );
  }

如果不调用函数渲染的话,也可以直接写在 map 函数内部

let checkerboard = row.map((item, index) => (
  <div className="board-row" key={index}>
    {Cell.map((item1, index1) =>
      index === index1
        ? item1.map((item2, index) => (
            <Square
              key={item2}
              value={this.props.squares[item2]}
              onClick={() => this.props.onClick(item2)}
            />
          ))
        : ""
    )}
  </div>
));

 

总结:在 map 的时候,节点上都需要添加 key ,且元素的 key 只有放在就近的数组上下文中才有意义。

 

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

react教程-井字棋案例扩展03 的相关文章

随机推荐

  • 我的算法笔记(1)——冒泡排序

    我的算法笔记 1 冒泡排序 排序是指将一个无序序列按某个规则进行有序排列 而冒泡排序是排序算法中最基础的一种 现给出一个序列a 其中元素的个数为n 要求将他们按从小到大的顺序排序 冒泡排序的本质在于交换 即每次通过交换的方式把当前剩余元素的
  • BP神经网络阈值

    在基于神经网络的数据融合文章里 有改进权值和阈值 但是没有说清阈值到底是什么 神经网络是模仿大脑的神经元 当外界刺激达到一定的阈值时 神经元才会受到刺激 影响下一个神经元 简单来说 超过阈值 就会引起某一变化 不超过阈值 无论是多少 都不产
  • 【数据库实验】sql总结

    首先说明 以下大部分针对的是标准sql 目录 结构 关键词 关于模式 创建模式 删除模式 关于表 创建表 修改表 删除表 关于索引 建立索引 修改索引 删除索引 关于查询 几个点 指定列 全部列 经过计算的值 列的别名 方便查看 以及聚集函
  • 深度学习:将新闻报道按照不同话题性质进行分类

    深度学习的广泛运用之一就是对文本按照其内容进行分类 例如对新闻报道根据其性质进行划分是常见的应用领域 在本节 我们要把路透社自1986年以来的新闻数据按照46个不同话题进行划分 网络经过训练后 它能够分析一篇新闻稿 然后按照其报道内容 将其
  • Unity学习记录——模型与动画

    Unity学习记录 模型与动画 前言 本文是中山大学软件工程学院2020级3d游戏编程与设计的作业7 编程题 智能巡逻兵 1 学习参考 除去老师在课堂上讲的内容 本次作业代码与操作主要参考了 傅老師 Unity教學 DarkSouls複刻經
  • 使用QT绘制极坐标图表

    使用QT绘制极坐标图表 在数据可视化领域 极坐标图表是非常常见的一种图表类型 QT作为一个高效 易用的GUI框架 也提供了绘制极坐标图表的功能 下面我们就来看一下如何使用QT绘制极坐标图表 首先 我们需要创建一个QT项目 选择 QT Wid
  • 数据结构与算法——第一章绪论

    数据结构与算法 绪论 数据结构的研究对象 数据结构的表示 DS的第一个重要部分 逻辑结构 DS第二个重要部分 数据的存储结构 计算机如何存储 结点及结点关系 数据结构的发展概况 抽象数据型 抽象数据型的定义 数据类型 数据结构和抽象数据型
  • 牛客网--专项训练--软件测试(待补充)

    1 集成测试分为渐增组装测试和 非渐增组装测试 渐增组装测试 是测完一个再加上一个一起测试 非渐增组装测试 是一个一个的测试 2 海伦公式求三角形面积 等价类测试用例中无效等价类意思就是无法构成三角形的 3 白盒测试是对代码内部的逻辑测试
  • Python异步请求:异步编程的常见问题

    Python异步请求 异步编程的常见问题 异步编程的常见问题 在异步编程过程中 可能会遇到一些常见的问题 了解这些问题并掌握解决方法对于开发高效的异步应用程序至关重要 异常处理 在异步编程中 异常处理变得更加关键 在同步编程中 异常通常可以
  • IDEA中设置注释模板的方法

    IDEA中设置注释模板主要分为两个部分 分别是创建java文件时类的注释和方法的注释 这里为大家详细介绍一下方法 按MyEclipse的风格设置 MyEclipse的请看 MyEclipse中设置注释模板的方法 大家可以根据自己的习惯生成自
  • [Monana] Windows/Linux/mac下Anaconda3 Python3配置Tensorflow最简明教程~(只用一步)

    Authored by MonanaHe Contact me via hemonan vip 163 com 0 写在前面的话 为什么我敢说这是最简明的教程 网上很多人用conda安装tf 而且是单独装一个tensorflow的环境 这样
  • 2023华为OD机试真题(java 100%通过)【最多获得的短信条数/动态规划】

    题目内容 某云短信厂商 为庆祝国庆 推出充值优惠活动 现在给出客户预算 和优惠售价序列 求最多可获得的短信总条数 输入描述 第一行客户预算M 其中 0 M 10 6 第二行给出售价表 P1 P2 Pn 其中 1 n 100 Pi为充值 i
  • 最全Android 开发和安全系列工具

    阿里聚安全出品 史上最全Android 开发和安全系列工具 作者 菜刀文 关注 2017 02 20 00 08 字数 4554 阅读 725 评论 1 喜欢 29 作者 阿里聚安全 地址 https zhuanlan zhihu com
  • flex布局最后一行列表左对齐的方法

    使用flex布局两端对齐 但是最后一行元素居中会很丑 所以可以让最后一行元素左对齐 方法如下 改之前 html div class list box div class item div gt div css list box displa
  • SIP 抓包后获取媒体内容备忘(解析RTP)

    SIP呼叫并抓包 从网上找免费的sip 软中端 两个转中端建立呼叫且抓包 详情可以参考 https blog csdn net liuxingrui4p article details 96709136 spm 1001 2014 3001
  • C++ 编译报错“jump to label”

    C 编译报错 jump to label 分析 解决方法 如何在Eclipse中添加编译选项 分析 void func int a 0 a goto label label int b 0 return 这样的代码是有问题的 因为C 编译规
  • Python计算机视觉编程(八)图像检索

    图像检索 BOW模型 基于BOW的图像检索 特征提取 视觉词典 TF IDF 常用参数 图像检索 具体实现流程 BOW模型 Bag of words models模型 词袋模型 词袋模型对于给定的两个文档 进行分割可以建构出一个有n个元素词
  • L2-040 哲哲打游戏 (25 分)(分析题目意思,读懂题)

    哲哲是一位硬核游戏玩家 最近一款名叫 达诺达诺 的新游戏刚刚上市 哲哲自然要快速攻略游戏 守护硬核游戏玩家的一切 为简化模型 我们不妨假设游戏有 N 个剧情点 通过游戏里不同的操作或选择可以从某个剧情点去往另外一个剧情点 此外 游戏还设置了
  • Ubuntu常用环境配置

    配置软件源 切换清华源 sudo sed i s http archive ubuntu com https mirrors tuna tsinghua edu cn g etc apt sources list sudo sed i s
  • react教程-井字棋案例扩展03

    使用两个循环来渲染出棋盘的格子 而不是在代码里写死 hardcode 这个关键点是在于循环 react的循环是和vue不一样的 veu中的循环是直接写在节点上 但是react的循环 是通过数组遍历的方法 先遍历出虚拟的Dom节点 然后通过r