Facebook 本身有提供 Test Utilities,但由于不够好用,所以目前主流开发社群比较倾向使用 Airbnb 团队开发的 enzyme,其可以与市面上常见的测试工具(Mocha、Karma、Jest 等)搭配使用。其中 Jest 是 Facebook 所开发的单元测试工具,其主要基于 Jasmine 所建立的测试框架。Jest 除了支援 JSDOM 外,也可以自动模拟 (mock) 透过 require() 进来的模组,让开发者可以更专注在目前被测试的模组中。

Component PropType 防呆机制

在 React 设计时除了提供 props 预设值设定(Default Prop Values)外,也提供了 Prop 的验证(Validation)机制,让整个 Component 设计更加稳健:

//  注意组件开头第一个字母都要大写class MyComponent extends React.Component {
        // render 是 Class based 组件唯一必须的方法(method)
        render() {
                return (
                        <div>Hello, World!</div>
                );
        }
}

// PropTypes 验证,若传入的 props type 不符合将会显示错误MyComponent.propTypes = {
  todo: React.PropTypes.object,
  name: React.PropTypes.string,
}

// Prop 预设值,若对应 props 没传入值将会使用 default 值MyComponent.defaultProps = {
 todo: {}, 
 name: '',

}
 
 
 
 
 

Component 就像个状态机(State Machine),而且也有生命周期(Life Cycle)

Component 就像个状态机(State Machine),根据不同的 state(透过 setState() 修改)和 props(由父元素传入),Component 会出现对应的显示结果。而人有生老病死,组件也有生命周期。透过操作生命周期处理函数,可以在对应的时间点进行 Component 需要的处理,关于更详细的组件生命周期介绍我们会再下一个章节进行更一步说明。
 

一律重绘(Always Redraw)和单向资料流(Unidirectional Data Flow)

在 React 世界中,props 和 state 是影响 React Component 长相的重要要素。其中 props 都是由父元素所传进来,不能更改,若要更改 props 则必须由父元素进行更改。而 state 则是根据使用者互动而产生的不同状态,主要是透过 setState() 方法进行修改。当 React 发现 props 或是 state 更新时,就会重绘整个 UI。当然你也可以使用 forceUpdate() 去强迫重绘 Component。而 React 透过整合 Flux 或 Flux-like(例如:Redux)可以更具体实现单向资料流(Unidirectional Data Flow),让资料流的管理更为清晰。
 
 
 
 
 
 

在 JavaScript 里写 CSS:Inline Style

在 React Component 中 CSS 使用 Inline Style 写法,全都封装在 JavaScript 当中:

const divStyle = {
  color: 'red',
  backgroundImage: 'url(' + imgUrl + ')',
};

ReactDOM.render(<div style={divStyle}>Hello World!</div>, document.getElementById('app'));

React 思路认为使用 Component 比起模版(Template)和显示逻辑(Display Logic)更能实现关注点分离的概念,而搭配 JSX 可以实现声明式 Declarative(注重 what to),而非命令式 Imperative(注重 how to)的程式撰写方式:
 

以 Facebook 上面按赞功能来说,若是命令式 Imperative 写法大约会是长这样:

if(userLikes()) {
if(!hasBlueLike()) {
removeGrayLike();
addBlueLike();
}
} else {
if(hasBlueLike()) {
removeBlueLike();
addGrayLike();
}
}

若是声明式 Declarative 则是会长这样:

if(this.state.liked) {
  return (<BlueLike />);
} else {
  return (<GrayLike />);

}
 
 
js中map函数
 
 

map 方法可以方便的迭代数组,map 方法会迭代数组中的每一个元素,并根据回调函数来处理每一个元素,最后返回一个新数组。注意,这个方法不会改变原始数组。

在我们的例子中,回调函数只有一个参数,即数组中元素的值 (val 参数) ,但其实,你的回调函数也可以支持多个参数,譬如:元素的索引index、原始数组arr。

使用 map 方法来为 oldArray 中的每一项增加3,并且在 newArray 中保存它们。 oldArray 不应该被改变。

代码:

var oldArray = [1,2,3,4,5];

var newArray = oldArray.map(function(val){return val+3;});
 
 

3. 转换成 JavaScript

JSX 最终会转换成浏览器可以读取的 JavaScript,以下为其规则:

React.createElement(
string/ReactClass, // 表示 HTML 元素或是 React Component
[object props], // 属性值,用物件表示
[children] // 接下来参数皆为元素子元素
)

解析前(特别注意在 JSX 中使用 JavaScript 表达式时使用 {} 括起,如下方范例的 text,里面对应的是变数。若需希望放置一般文字,请加上 ''):

var text = 'Hello React';
<h1>{text}</h1><h1>{'text'}</h1>

解析完后:

var text = 'Hello React';
React.createElement("h1", null, "Hello React!");
另外要特别要注意的是由于 JSX 最终会转成 JavaScript 且每一个 JSX 节点都对应到一个 JavaScript 函数,所以在 Component 的 render 方法中只能回传一个根节点(Root Nodes)。例如:若有多个 <div> 要 render 请在外面包一个 Component 或 <div><span> 元素

5. 属性

在 HTML 中,我们可以透过标签上的属性来改变标签外观样式,在 JSX 中也可以,但要注意 class 和 for 由于为 JavaScript 保留关键字用法,因此在 JSX 中使用 className 和 htmlFor 替代。
class HelloMessage extends React.Component {
  render() {
    return (
      <div className="message">
        <p>Hello React!</p>
      </div>
    );
  }
}

Boolean 属性

在 JSX 中预设只有属性名称但没设值为 true,例如以下第一个 input 标签 disabled 虽然没设值,但结果和下面的 input 为相同:

<input type="button" disabled />;
<input type="button" disabled={true} />;

反之,若是没有属性,则预设预设为 false

<input type="button" />;

<input type="button" disabled={false} />;
 
 

6. 扩展属性

在 ES6 中使用 ... 是迭代物件的意思,可以把所有物件对应的值迭代出来设定属性,但要注意后面设定的属性会盖掉前面相同属性:

var props = {
  style: "width:20px",
  className: "main",
  value: "yo", 
}

<HelloMessage  {...props} value="yo" />

// 等于以下React.createElement("h1", React._spread({}, props, {value: "yo"}), "Hello React!");
 

7. 自定义属性

若是希望使用自定义属性,可以使用 data-

<HelloMessage data-attr="xd" />
 

8. 显示 HTML

通常为了避免资讯安全问题,我们会过滤掉 HTML,若需要显示的话可以使用:
<div>{{_html: '<h1>Hello World!!</h1>'}}</div>
 

9. 样式使用

在 JSX 中使用外观样式方法如下,第一个 {} 是 JSX 语法,第二个为 JavaScript 物件。与一般属性值用 - 分隔不同,为驼峰式命名写法:

<HelloMessage style={{ color: '#FFFFFF', fontSize: '30px'}} />
 

10. 事件处理

事件处理为前端开发的重头戏,在 JSX 中透过 inline 事件的绑定来监听并处理事件(注意也是驼峰式写法),更多事件处理方法请参考官网

<HelloMessage onClick={this.onBtn} />
 

Ch03 React/JSX/Component 簡介的更多相关文章

  1. [React] Spread Component Props in JSX with React

    You often find duplication between the name of a prop and a variable you will assign to the prop. JS ...

  2. React(JSX语法)-----JSX基本语法

    JSX------HTML tags vs React Components: 1.To render a html tag,just use lower-case tag names in JSX; ...

  3. 在react jsx中,为什么使用箭头函数和bind容易出现问题

    在之前的文章中,已经说明如何避免在react jsx中使用箭头函数和bind(https://medium.freecodecamp.o... 但是没有提供一个清晰的demo展示为什么要这样做. 现在 ...

  4. Airbnb React/JSX 编码规范

    Airbnb React/JSX 编码规范 算是最合理的React/JSX编码规范之一了 内容目录 基本规范 Class vs React.createClass vs stateless 命名 声明 ...

  5. React:JSX 深入

    React入门的的时候,我们(我自己啦)喜欢都跟着例子来,用标签的语法写JSX,比如:<Mycomponent  key={this.props.id}  onClick={this.props ...

  6. 【go】脑补框架 Express beego tornado Flux reFlux React jsx jpg-ios出品

    http://goexpresstravel.com/ 今天 Express 的作者 TJ Holowaychuk 发了一篇文章,正式宣告和 Node.js 拜拜了,转向 Go 语言. Go vers ...

  7. Scripting Languages 簡介

    Scripting Languages 簡介 何謂 Scripting? 命令稿語言 scripting language 是什麼? 很難給一個嚴格的定義; 不妨看看最具代表性的幾個例子: perl, ...

  8. React & styled component

    React & styled component https://www.styled-components.com/#your-first-styled-component tagged t ...

  9. Source Tree 簡介

    Table of Contents 1. 什麼是 Source Tree ? 1.1. 下載 1.2. SourceTree 介面簡介 1.3. git 指令/狀態圖 2. SourceTrees 超 ...

随机推荐

  1. 九度oj 题目1066:字符串排序

    题目1066:字符串排序 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6487 解决:2670 题目描述: 输入一个长度不超过20的字符串,对所输入的字符串,按照ASCII码的大小从小到 ...

  2. RabbitMQ-基本概念(一)

    整体架构模型 Producer 消息生产者,生产者创建消息然后发布到RabbitM中,消息一般包含2个部分 消息体(payload)和标签 消息体就是带有业务逻辑结构的数据,消息标签用来表述这条消息, ...

  3. noip模拟赛 柜(暴力)

    分析:暴力的方法是非常显然的,从起点走一次,从终点走一次,路径相交的点即为所求,但是这样存图都很难存下,而且如果数据极端可能要求R*C次,时间空间都受不了.如果不需要记录整张图,并且一次能移动很多步就 ...

  4. 【GC概述以及查看堆内存使用】Java内存管理和GC学习

    内存划分 1.JAVA内存主要划分为方法栈.方法区.堆. 2.方法栈上内存会自动释放: 3.方法区上主要加载了类的元信息.静态变量.常量.改区域又称为持久代(Perm Gen),默认是最小16M,最大 ...

  5. PostGIS学习相关术语

    POI 兴趣点(英语:point of interest,通常缩写成POI)乃是电子地图上的某个地标.景点,用以标示出该地所代表的政府部门.各行各业之商业机构(加油站.百货公司.超市.餐厅.酒店.便利 ...

  6. 5、Java并发性和多线程-相同线程

    以下内容转自http://tutorials.jenkov.com/java-concurrency/same-threading.html(使用谷歌翻译): 相同线程(同一线程)是一种并发模型,其中 ...

  7. css3 transform对其他样式影响,(尤其是position:flixed)

    1.transform 会为当前元素添加 position : relative 特性: 当 magin 为负值的时候,就会覆盖到前面的 元素, 然而如果给前面元素添加了transform 属性后,前 ...

  8. [Vue] Props Validations

    Components can specify requirements for its props, such as the types you’ve already seen. If a requi ...

  9. Spring技术内幕:Spring AOP的实现原理(五)

    7.Advice通知的实现 AopProxy代理对象生成时,其拦截器也一并生成.以下我们来分析下Aop是怎样对目标对象进行增强的.在为AopProxy配置拦截器的实现中,有一个取得拦截器配置过程,这个 ...

  10. (寻找第K小的数&amp;&amp;寻找第K小的数的和)

    这一篇博客以一些OJ上的题目为载体,讲一下寻找第K小的数的方法 方法一: 先将数据排列好,然后,然后return a[k]或者将前K个数加起来 方法二: 基于高速排序.如,一次高速排序将某一个数放到了 ...