key应该是稳定的,且唯一的,尽量不要用索引作为key

都知道React组件渲染列表时需要为每个列表元素分配一个在列表中独一无二的key,key可以在DOM中的某些元素被增加或删除视乎帮助React识别哪些发生了变化,通常列表数据都会有id字段,习惯用id值作为key,当没有id或其他唯一标识时,也会用序列号索引index作为key,之前并没有觉得用index有什么不好之处,再次看文档发现序列号索引作为key有一些弊端。

如果列表可以重新排序,不建议使用索引作为key,因为会导致渲染变得很慢,如果不重排,没问题。

为什么变得很慢?

React通过对比算法来更新组件,使用key来匹配原本树的子节点和新树的子节点,比如以下列表,在开始插入元素:

<ul>
<li key='6'>6</li>
<li key='7'>7</li>
</ul> <ul>
<li key='5'>5</li>
<li key='6'>6</li>
<li key='7'>7</li>
</ul>

没有使用index作为key,React知道key为'5'的元素是新的,仅移动key为'6'、'7'的元素就可以了。

如果使用index作为key,上述列表的变化会导致key值的变化,列表元素不能复用,造成不必要的重建,也可能会以意想不到的方式更新,所以会变慢。

注意:不要使用不稳定的key(类似Math.random()生成的)

React中布尔值、Null和Undefined被忽略,数字0不会被忽略

React使用条件渲染时,通常用JavaScript的逻辑与&&,当showHeader为true时渲染<Header />,如下:

 <div>
{showHeader && <Header />}
</div>

但数字0不会像预期的哪样运行,如下:

  <div>
{props.messages.length &&
<MessageList messages={props.messages} />
}
</div>

props.messages为空数组时,仍然会渲染<MessageList />,要解决这个问题,确保 && 前面的表达式始终为布尔值:

  <div>
{props.messages.length > 0 &&
<MessageList messages={props.messages} />
}
</div>

使用PropTypes进行类型检查是很必要的

最开始写React的时候从来都不加PropTypes,觉得没什么必要,现在发现PropTypes进行类型检查是很必要的,如果父组件传给子组件的参数不符合PropTypes配置,控制台就会报错,给出错误信息,这样可以快速定位问题。

另外通过defaultProps为props定义默认值时,类型检查也会应用在 defaultProps 上面,因为类型检查发生在 defaultProps 赋值之后。

使用说明请查看官方文档:https://doc.react-china.org/docs/typechecking-with-proptypes.html

React中获取真实DOM节点或 React 元素时使用Refs

获取在 render 方法中创建的 DOM 节点或 React 元素时,最好使用“回调 ref”的方式,不要用DOM操作也不要用旧版 API:String 类型的 Refs

 render() {
return (
//回调ref
<input ref={input => this.inputRef = input}/>
//string类型的ref
<input ref=“inputRef”/>
);
}

不要在函数式组件中使用ref属性来进行回调函数的绑定,因为函数式组件是没有实例的,准确的说函数式组件不是一个真正的类

React.Fragment组件的使用

在React中组件返回多个元素时要被一个元素包裹,不然会报错,我们通常用div元素,这个div元素没有什么实际的意义,并且会在DOM中增加额外节点,建议用React.Fragment组件,不会增加额外的节点,目前key 是唯一可以传递给 Fragment 的属性。

  render() {
return (
<React.Fragment>
<h1>React 文档</h1>
<div>React内容</div>
</React.Fragment>
);
}

 关于 class 的问题

    在 React 中元素的 class 需要换成 className

    

图片路径的问题

      1 . 如果要使用相对路径引入图片有两种方法:( 相对路径用于请求 src 下面的图片)

        每个组件类中引入图片当使用相对路径的时候,这个图片必须放在src中。

         a . 直接在组件类的模板中通过 require("文件的相对路径") 引入

 <img src={require("../images/01.jpg")} alt="图片"/>

         b . 通过定义图片,在模板中调用

// 引入并定义图片
import pic from './images/01.jpg'; // 在模板中使用
<div className="App">
<img src={pic} alt="图片"/>
</div>

      2 . 如果在 public 中放了一张图片,我们会发现在地址栏上输 http://localhost:3000/01.jpg 能找到图片,说明 React 把 public 当做该项目的 web 容器。 所以,以后做项目时静态资源放在 public 中。

      因此,我们的 ajax 请求和 钩子函数 的路径就相对于 index.html , 下面是 ajax请求本地文件 aa.txt 实例

import React, { Component } from 'react';
// npm install axios 下载并引入 axios
import axios from "axios";
// 创建类组件 组件类的创建方法
//    第一 React.createClass()  最开始的
//    第二 class Heads extend Component{}
//    第三 构造函数
class Slide extends Component {
constructor(props){ // 在该组件类的标签中设置 props 值,这里设置的是 title
super(props);
this.state={ // 设置state
url:"http://localhost:3000/images/01.jpg"
}
}
render() {
return (
<div className="slide">
<div>
<img src={this.state.url} alt="图片"/>
</div>
</div>
);
}
componentDidMount(){
axios.get(this.props.title)
.then(function (res) {
console.log(res.data);
this.setState({
"url":res.data
})
}.bind(this))
.catch(function (err) {
console.log(err);
})
}
}
export default Slide;

     上面组件中设置 props 值

// title 与上面组件中的值对应
<Slide title="http://localhost:3000/txt/aa.txt"/>

. 事件 

        事件通常和 this  有关,下面是关于事件的例子

import React, { Component } from 'react';

class Heads extends Component {    //创建组建类
constructor(){
super()
this.state={
title:"welcom to China"
}
this.fn=this.fn.bind(this)
}
fn(){
// 事件往往和this有关
this.setState({
title:"Hello world!"
})
}
render() {
return (
<div className="Heads">
<h3 onClick={this.fn}>
{this.state.title}
</h3>
</div>
);
}
} export default Heads;

写react项目需要注意的的更多相关文章

  1. 写react项目要注意的事项

    1,className一定是大写字母开头,例如:App-logo,App,App-header. 2,有关react元素的更新,唯一办法是创建新元素,然后重新将其传入ReactDOM.render() ...

  2. 手把手教你用webpack3搭建react项目(开发环境和生产环境)(一)

    开发环境和生产环境整个配置源码在github上,源码地址:github-webpack-react 如果觉得有帮助,点个Star谢谢!! (一)是开发环境,(二)是生产环境. 一.首先创建packag ...

  3. 如何在React项目中直接使用WebAssembly

    前言 自从入坑WebAssembly以来,躺了很多坑,也浏览了很多资料,都没有看到很多能够直接在前端项目中使用WebAssembly的例子.即使有,我自己按照介绍的步骤一步一步来, 也会报各种错误,官 ...

  4. nginx代理部署Vue与React项目

    nginx代理部署Vue与React项目 一,介绍与需求 1.1,介绍 Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务.Nginx是由 ...

  5. 创建react项目的几种方法

    前言: 构建React项目的几种方式: 构建:create-react-app 快速脚手架 构建:generator-react-webpack 构建:webpack一步一步构建 1)构建:creat ...

  6. Docz 用 MDX 写 React UI 组件文档

    Docz 用 MDX 写 React UI 组件文档 前言 为了提升开发效率,创建一套 UI 组件库是一种较为有效的方式之一:可以减少重复工作.提高可复用,所以现在越来越多团队开始创建自己的 UI 组 ...

  7. 二手前端入门React项目

    个人对ReactJS这门技术比较感兴趣,在基友的帮助下成功创建了一个React标准前端工程,过程中遇到了不少麻烦,今天作为笔记一般记录一下遇到的问题和解决方案. 基础环境 手头一台Mac 使用OSX系 ...

  8. React项目的最佳实践

    项目代码 从零开始简书项目 ​ 从我第一次接触vue这个框架已经过了快一年的时间,陪伴我从前端小白到前端工程师,前端时间也是使用了 ts+vue这样的组合写代码,明显感觉vue与ts似乎没有产生比较好 ...

  9. 基于Ant Design UI框架的React项目

    概述 这款基于React开发的UI框架,界面非常简洁美观,在这篇文章中我主要为大家介绍一下如何用Ant开始搭建React项目 详细 代码下载:http://www.demodashi.com/demo ...

随机推荐

  1. 【LeetCode】266. Palindrome Permutation 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 日期 题目地址:https://leetcode ...

  2. 【LeetCode】1023. Camelcase Matching 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 正则+字典 日期 题目地址:https://leet ...

  3. 【LeetCode】883. Projection Area of 3D Shapes 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学计算 日期 题目地址:https://leetc ...

  4. 【操作系统】 DOS命令windows批处理batch编程——第一章

    参考网址: http://docs.30c.org/dosbat/index.html 很多情况下,我们只需要记住一条命令 help ,就能掌握整个DOS命令.比如直接输入 help 可以得到命令的帮 ...

  5. 「算法笔记」树形 DP

    一.树形 DP 基础 又是一篇鸽了好久的文章--以下面这道题为例,介绍一下树形 DP 的一般过程. POJ 2342 Anniversary party 题目大意:有一家公司要举行一个聚会,一共有 \ ...

  6. MADE: Masked Autoencoder for Distribution Estimation

    目录 概 主要内容 代码 Germain M., Gregor K., Murray I. and Larochelle H. MADE: Masked Autoencoder for Distrib ...

  7. Pytorch 图片载入

    目录 载入图片和坐标 Transforms Compose transforms 数据集的迭代 import os import torch import pandas as pd from skim ...

  8. 使用所学Spring知识,实现简易的图书查询系统功能。实现查询全部图书。 根据书籍编号查询信息。 根据书名查询书籍信息。 根据状态查询书籍信息。

    相关 知识 >>> 相关 练习 >>> 实现要求: 使用所学Spring知识,实现简易的图书查询系统功能. 要求如下: 查询全部图书. 根据书籍编号查询信息. 根据 ...

  9. Java高级程序设计笔记 • 【第3章 多线程(二)】

    全部章节   >>>> 本章目录 3.1 同步代码块 3.1 线程安全 3.1.1 模拟银行取款 3.1.2 同步代码块的使用 3.1.3 实践练习 3.2 同步方法 3.2. ...

  10. playwright--自动化(一):快速上手

    Playwright为现代 Web 应用程序提供可靠的端到端测试. 在JavaScript 和 TypeScript.Python..NET和Java 中都可以使用 Playwright 本人选择py ...