React 16官网 (main concepts) 浏览

2023-10-29

翻译一下官网 ,顺便了解一下React 16版本的新特性

照旧,从Hello World开始

ReactDOM.render(
  <h1>Hello, world!</h1>,
  document.getElementById('root')
);

在集成了React的必要的依赖,适配了jsx之后,页面会显示“ Hello World! ”
接下来介绍React的核心。

JSX

const element = <h1>Hello, world!</h1>;

element标签不是string也不是html元素,而是jsx,它是js的语法糖。React推荐使用jsx去render UI。jsx可能让你想起模板语言,但是它完全支持js语法。

为什么要用jsx

jsx不是react必须的,但是jsx可以更加便捷的处理虚拟DOM(处理事件,更新数据,渲染UI,并且规范的写法可以避免跨站攻击等)。更多人越来越适应和推荐jsx,毕竟是语法糖嘛!

jsx 如何render Object

const element = (
  <h1 className="greeting">
    Hello, world!
  </h1>
);
const element = React.createElement(
  'h1',
  {className: 'greeting'},
  'Hello, world!'
);

以上两段代码等效,最终生成的Object可以认为为

const element = {
  type: 'h1',
  props: {
    className: 'greeting',
    children: 'Hello, world!'
  }
};

React.createElement() 除了生成Object,也会对语法做校验,避免书写bug(可以看看element,结构简单时候还好,如果结构复杂,那么很容易书写错误,React.createElement()帮我们减少了创建对象的复杂度)

element对象叫做"React elements",你记忆理解为这种对象是一种描述,React读到这种描述信息,然后在浏览器构建真实的DOM并且监听他们的状态更新。

React elements

React elements是immutable(不可变的),一旦你创建了一个元素,你就不能修改它的属性或者子类,就好比是一个电影画面,不同时刻会描绘不同的画面。就我们所掌握的,更新UI的唯一方法是创建一个新的元素,然后通过ReactDOM.render()更新。
React只在某些条件下更新(对比之前创建的元素,比较属性和子类,只会更新state改变的dom)

Components and Props

组建其实就是函数

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

或者ES6写法

class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

两者是等效的

react是严格的,也有一套简单的原则:All React components must act like pure functions with respect to their props

state

state的更新是异步的
不能直接赋值。只能通过constructor更新(this.setState())更新

//之前没有注意过这种使用方式
this.setState((state, props) => ({
  counter: state.counter + props.increment
}));
// 或者
// Correct
this.setState(function(state, props) {
  return {
    counter: state.counter + props.increment
  };
});

处理事件

e.preventDefault(); // 阻止默认行为 ,cross-browser react遵循w3c标准并且做了兼容 。
不能用 return false去阻止(之前不知道或者未有尝试)

书写的规范

class LoggingButton extends React.Component {
  handleClick() {
    console.log('this is:', this);
  }

  render() {
    // This syntax ensures `this` is bound within handleClick
    return (
      <button onClick={(e) => this.handleClick(e)}>
        Click me
      </button>
    );
  }
}

这么写是为了绑定this。但是在render里面赋值事件有不好的地方,官网是这么解释的:

The problem with this syntax is that a different callback is created each time the LoggingButton renders. In most cases, this is fine. However, if this callback is passed as a prop to lower components, those components might do an extra re-rendering. We generally recommend binding in the constructor or using the class fields syntax, to avoid this sort of performance problem.

如果这个事件方法要作为prop传递给更低级的组件,这些组件可能要有额外的re-rendering,我们尽量使用箭头函数或者是在constructor里面声明方法来避免这种问题。

传递参数 (Passing Arguments to Event Handlers)

<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>
<button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>

两者等效,这里比较推荐bind,因为箭头函数(arrow function)需要传递e,bind方式会自动传递(forwarded)

tips

  1. It works because in JavaScript, true && expression always evaluates to expression, and false && expression always evaluates to false.
  2. Returning null from a component’s render method does not affect the firing of the component’s lifecycle methods. For instance componentDidUpdate will still be called.

Keys

Keys help React identify which items have changed, are added, or are removed. Keys should be given to the elements inside the array to give the elements a stable identity

不推荐使用index赋值key,且key只有在数组render的jsx元素当中才会有意义。且两个组件render的数据一致时候,key没有必要区分不同(例如List A element 和List B element render的li列表 key可以一致 ),key也不能当作props传递(自组件没法获取赋组件的key值)

规范

Keep in mind that if the map() body is too nested, it might be a good time to extract a component。

为了友好的render,尽量组件化(这里不止map,逻辑复杂也可以抽取,这个个人建议,拆分逻辑有助于提取和更新)

Form元素

html的form元素和React的表单元素有一些不同,因为表单元素通常是保持一些内部状态,比方说以下这段代码,表单元素就保留name属性

<form>
  <label>
    Name:
    <input type="text" name="name" />
  </label>
  <input type="submit" value="Submit" />
</form>

form组件被称为受控组件(controlled component)

受控组件(Controlled Components )

HTML中,input,textarea,select等通常基于用户的输入来保持和更新他们的状态,而在React当中,状态被作为组件本身的属性,并且只能通过setState()来更新。
React结合了这两者(既可以输入,又可以setState()),我们管这种元素(表单元素)叫做受控组件。

class NameForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {value: ''};

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange(event) {
    this.setState({value: event.target.value});
  }

  handleSubmit(event) {
    alert('A name was submitted: ' + this.state.value);
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input type="text" value={this.state.value} onChange={this.handleChange} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}

以上为React的实现

textarea 标签

HTML当中,textarea的用法如下:

<textarea>
  Hello there, this is some text in a text area
</textarea>

React当中,textarea 的内容都要赋值给value属性

<textarea value={this.state.value} onChange={this.handleChange} />

select 标签

HTML操作select的状态比较繁琐,要标记option标签的selected属性来说明选中项

<select>
  <option value="grapefruit">Grapefruit</option>
  <option value="lime">Lime</option>
  <option selected value="coconut">Coconut</option>
  <option value="mango">Mango</option>
</select>

React则很方便,同样给select添加value属性。

	<select value={this.state.value} onChange={this.handleChange}>
       <option value="grapefruit">Grapefruit</option>
         <option value="lime">Lime</option>
         <option value="coconut">Coconut</option>
         <option value="mango">Mango</option>
       </select>

其他的类似inputs 不再赘述

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

React 16官网 (main concepts) 浏览 的相关文章

  • css in js开发利器 - styled-components(样式组件)

    styled components 是一个常见的 css in js 类库 和所有同类型的类库一样 通过 js 赋能解决了原生 css 所不具备的能力 比如变量 循环 函数等 注意 有时候 React 版本和 styled componen
  • React仿写网易云音乐项目

    文章目录 一 项目功能说明 二 最终效果 三 文件目录结构说明 四 项目技术栈 五 核心技术 1 配置项目别名 craco craco 2 使用reset css进行 css 重置 3 使用CSS Sprites 精灵图 4 使用 memo
  • react项目中使用react-dnd实现列表的拖拽排序

    现在有一个新需求就是需要对一个列表 实现拖拽排序的功能 要实现的效果如下图 可以通过 react dnd 或者 react beautiful dnd 两种方式实现 今天先讲下使用react dnd是如何实现的 github地址 https
  • React 组件通讯

    目录 1 组件通讯 概念 1 组件的特点 2 知道组件通讯意义 总结 2 组件通讯 props 基本使用 1 传递数据和接收数据的过程 2 函数组件使用 props 3 类组件使用 props 总结 3 组件通讯 props 注意事项 1
  • 对useReducer的理解

    useReducer是React提供的一个高级Hook 它不像useEffect useState useRef等必须hook一样 没有它我们也可以正常完成需求的开发 但useReducer可以使我们的代码具有更好的可读性 可维护性 可预测
  • react的条件渲染(或者组件渲染)五种方式 --开发基础总结

    1 使用if的方式判断是否渲染某个组件 function UserGreeting props return h1 Welcome back h1 function GuestGreeting props return h1 Please
  • 如何在 Ubuntu 20.04 上使用 React 前端设置 Ruby on Rails v7 项目

    作者选择了电子前沿基金会接受捐赠作为为捐款而写程序 介绍 红宝石 on Rails是一个流行的服务器端 Web 应用程序框架 它为当今网络上存在的许多流行应用程序提供支持 例如GitHub Basecamp 声云 Airbnb and Tw
  • React页面设计初体验

    1 定制路由 export default login path login name login component layouts BlankLayout routes path login component Login Index
  • 组件间样式覆盖问题--CSS Modules

    1 组件间样式覆盖问题 问题 CityList 组件的样式 会影响 Map 组件的样式 原因 在配置路由时 CityList 和 Map 组件都被导入到项目中 那么组件的样式也就被导入到项目中了 如果组件之间样式名称相同 那么一个组件中的样
  • react组件状态同步-状态提升

    假设定义组件TemperatureInputSon import React from react class TemperatureInputSon extends React Component constructor props su
  • Ant Design Pro从零到一(认识AntD)

    废话 在我们第一次接触AntD的时候 会遇到两个东西 一个是Ant Design 另一个是Ant Design Pro 他们的官网分别是 Ant Design 一套企业级 UI 设计语言和 React 组件库 Ant Design Pro
  • React的超详细讲解

    React React的重点 webpack webpack 是一个现代 JavaScript 应用程序的静态模块打包器 module bundler 当 webpack 处理应用程序时 它会递归地构建一个依赖关系图 dependency
  • React解密:React Hooks函数之useCallback和useMemo

    之所以将useCallback和useMemo放到一起 从某种意义上说 他们都是性能优化的始作俑者 他们也有很多的共性 我们先来回顾一下class组件性能优化的点 调用 setState 就会触发组件的重新渲染 无论前后 state 是否相
  • React官方文档--Lifting State Up

    Lifting State Up 如果 几个组件需要同时影响并且修改同一个数据 我们建议将这个共享状态进行提升 给他们最近的共同祖先 在这个部分 我们将要创建一个温度计算器来判断水会不会在给定温度下沸腾 我们将从一个叫做BoilingVer
  • React、Vue2.x、Vue3.0的diff算法

    前言 本文章不讲解 vDom 实现 mount 挂载 以及 render 函数 只讨论三种 diff 算法 VNode 类型不考虑 component functional component Fragment Teleport 只考虑 E
  • ant design pro 代码学习(七) ----- 组件封装(登录模块)

    以登录模块为例 对ant design pro的组件封装进行相关分析 登录模块包含基础组件的封装 组件按模块划分 同类组件通过配置文件生成 跨层级组件直接数据通信等 相对来说还是具有一定的代表性 1 登录模块流程图 首先 全局了解一下登录模
  • hooks实践总结

    何为hooks 在React中hook是指不编写 class 的情况下使用 state 以及其他的 React 特性 而Vue3也推出了具有相同功能的组合式API 如果你用过Vue3就会知道在 setup 中你应该避免使用 this 因为h
  • 【React】 4课 react初识组件

    首先我们如1课创建一个文件夹在文件夹中安装react环境需要的配置文件 npm init y npm i babel standalone D npm i react react dom D 安装配置文件教程链接 https blog cs
  • React配置@src根路径

    第一种 直接修改node modules包中的webpack config js文件 找到node modules react scripts config webpack config js文件 修改其中alias中的配置 添加 src
  • React中渲染html结构---dangerouslySetInnerHTML

    dangerouslySetInnerHTML 胡子 语法绑定的内容全部作为普通文本渲染 渲染html结构基于 dangerouslySetInnerHTML dangerouslySetInnerHTML 是 React 标签的一个属性

随机推荐

  • SQL计算时间差

    一 DB2数据库计算时间差 1 DATEDIFF函数 语法 DATEDIFF 开始时间 结束时间 释义 DATEDIFF可以计算开始时间与结束时间的时间差 结果是天数 栗子 2 TIMESTAMPDIFF函数 语法 TIMESTAMPDIF
  • postman 中传 json格式的参数 的3种简单方式。

    1 当我们使用GET发送请求的时候会发现body部分是灰的 所以我们先选择post请求 2 在头部添加 key gt Content Type Value gt application json 3 这里有3种方式 第一种是使用raw 如图
  • 使用命令行查看MySql数据库、表和字段等信息

    前言 好久没玩数据库了 又重新学习了一下 把一些基础的东西记录下来 方便查阅 内容 1 输入密码 进入MySql数据库 2 show databases 查看有多少个数据库 注意 databases 后面带 s 3 use test 使用
  • chatGPT生成Flink程序

    以下是一个符合您需求的基本 Flink Maven 项目示例 其中包括 Kafka 和 MySQL 的连接 并使用了一个固定窗口任务和水位线设置为5秒 在 pom xml 文件中 添加以下依赖项
  • 运维部署工具无法使用 | FISCO BCOS开发问题排查

    标签 没有网络 找不到pip 运维部署工具 没有网络 问题描述 在没有网络的情况下 如何使用运维部署工具 解决方法 运维部署工具依赖configparser等模块 建议在可以连接外网的情况下配置运维部署工具 并生成节点配置文件夹 推送至内网
  • 避免Cocos2d-x编写的游戏在用eclipse生成安卓包时繁琐的写Android.mk文件

    示例代码 https gist github com zhongtao1992 还未验证效果 但是看起来不错 能一定程度上避免反复的添加 cpp文件 转载于 https www cnblogs com zhong dev p 4044610
  • vue 子组件向父组件传递参数 子传父

    子组件中写 this emit RowCount res data RowCount 父组件中写 getMFGLRowCount val 父组件中的方法 接收子组件传过来的参数值赋值给父组件的变量 this totalCount val a
  • html文档包括指明,web前端学习(2):开始编写HTML

    在第一章中 我们初步了解了上网的过程 同时也明白了所谓网页 其本质就是主要用HTML语言所写的一份文档 相信大多数人在了解HTML文件前 最先接触的是利用 记事本 所写的文档或者是利用办公软件 Word 所建的文档 身为初心者的你可能会问
  • java8 新特性 —— 接口内允许添加默认实现的方法

    Java 8 允许我们通过 default 关键字对接口中定义的抽象方法提供一个默认的实现 请看下面示例代码 定义一个公式接口 interface Formula 计算 double calculate int a 求平方根 default
  • 以太坊bootNode

    种子节点bootnode Stripped down version of our Ethereum client implementation that only takes part in the network node discov
  • C#-后端HTTP请求两种方式GET POST

    C 后端HTTP请求两种方式GET POST GET方式 public static object GetToJson string url string JsonStr HttpWebRequest req HttpWebRequest
  • 有关Bash Shell的几个重要知识

    Bash Shell属于Shell的一种 属于Shell中的字符Shell GLI Shell的定义 命令解释器 俗称外壳 对接操作系统和用户 指人机交互接口程序 起到承上 应用程序 启下 操作系统 的翻译作用 Shell的两大类 图形Sh
  • bugku[社工-初步收集]

    bugku 社工 初步收集 题目 打开环境 四处搜寻下 发现了个购买辅助并且可以下载 下载下来试试 emmmmmmm wireshark抓个流量包来看下 可以看到出现了pass与user base64解码得到 user bugkuku 16
  • [NCTF2019]SQLi:regexp正则注入

    文章目录 题目 regexp正则注入 1 模糊注入 2 布尔盲注的regexp注入 3 盲注脚本 4 使用 00进行注释 总结 收获 参考 题目 登陆框 给出后台查询语句sqlquery select from users where us
  • 【电源模块】TPS54331 DCDC降压芯片设计

    TPS54331 3A输出 28V输入 带Eco模式的降压DC DC转换器 TPS54331 3A输出 28V输入 带Eco模式的降压DC DC转换器 一 特征 二 描述 三 引脚分布及功能 四 TPS5423xx系列区别 五 典型应用 六
  • 基于Sketch Up软件校园建模案例分享

    Acknowledgements 由衷感谢覃婉柔 赵泽昊同学在本次课程实习中做出的巨大贡献 感谢本团队成员一起努力奋斗的岁月 一 建模地点 中国地质大学 武汉 未来城校区图书馆周边 中国地质大学 武汉 未来城图书馆介绍 图书馆位于中国地质大
  • unity不同分辨率适配摄像机

    竖屏游戏的时候 unity中摄像机是自动上下适配的 也就是说在不同分辨率下看到的上下看到的世界范围是一致的 比如在iphone6正常 那么在iphoneX上就有一种放大的效果 而正常的情况是在iphoneX上看到的宽度应该是一致的 也就是说
  • Html5 播放实时音频流

    Html5 播放实时音频流 项目需求 Web端播放实时音频流 折腾了两天后问题得以解决 记录下开发调试过程 方便后来者 首次想到是利用Audio标签 Audio标签可以直接播放MP3格式 服务端将实时音频流编码成MP3格式 通过Http方式
  • 力软敏捷开发框架7.0.6源码

    力软敏捷开发框架真正源码 从我所看到的情况来看 如今敏捷软件开发被广泛误解了 许多人认为敏捷 他们只需要像scrum这样的过程即可定义sprint和迭代的框架 他们会不断冲刺 直到精疲力尽 然后改变直至停滞 但是 当您问他们面向对象设计的原
  • React 16官网 (main concepts) 浏览

    翻译一下官网 顺便了解一下React 16版本的新特性 照旧 从Hello World开始 ReactDOM render h1 Hello world h1 document getElementById root 在集成了React的必