Ch03 React/JSX/Component 簡介
Component PropType 防呆机制
在 React 设计时除了提供 props 预设值设定(Default Prop Values)外,也提供了 Prop 的验证(Validation)机制,让整个 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)
setState() 修改)和 props(由父元素传入),Component 会出现对应的显示结果。而人有生老病死,组件也有生命周期。透过操作生命周期处理函数,可以在对应的时间点进行 Component 需要的处理,关于更详细的组件生命周期介绍我们会再下一个章节进行更一步说明。一律重绘(Always Redraw)和单向资料流(Unidirectional Data Flow)
在 JavaScript 里写 CSS:Inline Style
在 React Component 中 CSS 使用 Inline Style 写法,全都封装在 JavaScript 当中:
color: 'red',
backgroundImage: 'url(' + imgUrl + ')',
};
ReactDOM.render(<div style={divStyle}>Hello World!</div>, document.getElementById('app'));
Declarative(注重 what to),而非命令式 Imperative(注重 how to)的程式撰写方式:
以 Facebook 上面按赞功能来说,若是命令式 Imperative 写法大约会是长这样:
if(userLikes()) {
if(!hasBlueLike()) {
removeGrayLike();
addBlueLike();
}
} else {
if(hasBlueLike()) {
removeBlueLike();
addGrayLike();
}
}
若是声明式 Declarative 则是会长这样:
return (<BlueLike />);
} else {
return (<GrayLike />);
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!");
render 方法中只能回传一个根节点(Root Nodes)。例如:若有多个 <div> 要 render 请在外面包一个 Component 或 <div>、<span> 元素5. 属性
class 和 for 由于为 JavaScript 保留关键字用法,因此在 JSX 中使用 className 和 htmlFor 替代。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:
6. 扩展属性
在 ES6 中使用 ... 是迭代物件的意思,可以把所有物件对应的值迭代出来设定属性,但要注意后面设定的属性会盖掉前面相同属性:
style: "width:20px",
className: "main",
value: "yo",
}
<HelloMessage {...props} value="yo" />
7. 自定义属性
若是希望使用自定义属性,可以使用 data-:
8. 显示 HTML
9. 样式使用
在 JSX 中使用外观样式方法如下,第一个 {} 是 JSX 语法,第二个为 JavaScript 物件。与一般属性值用 - 分隔不同,为驼峰式命名写法:
10. 事件处理
事件处理为前端开发的重头戏,在 JSX 中透过 inline 事件的绑定来监听并处理事件(注意也是驼峰式写法),更多事件处理方法请参考官网
Ch03 React/JSX/Component 簡介的更多相关文章
- [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 ...
- React(JSX语法)-----JSX基本语法
JSX------HTML tags vs React Components: 1.To render a html tag,just use lower-case tag names in JSX; ...
- 在react jsx中,为什么使用箭头函数和bind容易出现问题
在之前的文章中,已经说明如何避免在react jsx中使用箭头函数和bind(https://medium.freecodecamp.o... 但是没有提供一个清晰的demo展示为什么要这样做. 现在 ...
- Airbnb React/JSX 编码规范
Airbnb React/JSX 编码规范 算是最合理的React/JSX编码规范之一了 内容目录 基本规范 Class vs React.createClass vs stateless 命名 声明 ...
- React:JSX 深入
React入门的的时候,我们(我自己啦)喜欢都跟着例子来,用标签的语法写JSX,比如:<Mycomponent key={this.props.id} onClick={this.props ...
- 【go】脑补框架 Express beego tornado Flux reFlux React jsx jpg-ios出品
http://goexpresstravel.com/ 今天 Express 的作者 TJ Holowaychuk 发了一篇文章,正式宣告和 Node.js 拜拜了,转向 Go 语言. Go vers ...
- Scripting Languages 簡介
Scripting Languages 簡介 何謂 Scripting? 命令稿語言 scripting language 是什麼? 很難給一個嚴格的定義; 不妨看看最具代表性的幾個例子: perl, ...
- React & styled component
React & styled component https://www.styled-components.com/#your-first-styled-component tagged t ...
- Source Tree 簡介
Table of Contents 1. 什麼是 Source Tree ? 1.1. 下載 1.2. SourceTree 介面簡介 1.3. git 指令/狀態圖 2. SourceTrees 超 ...
随机推荐
- Codeforces Round #239(Div. 2) 做后扯淡玩
今天补了下 cf 239div2 顿时信心再度受挫 老子几乎已经木有时间了啊 坐着等死的命.哎!!! 到现在还只能做大众题,打铁都不行. 每次D题都是有思路敲错,尼玛不带这么坑爹的. 哎!不写了,写这 ...
- A + B Problem Too
Problem Description This problem is also a A + B problem,but it has a little difference,you should d ...
- Mutual Training for Wannafly Union #5
A(UVA12336) 题意:给一个n*m(n,m<=1e5)的棋盘,棋盘上有一些障碍点不能放棋子,现在要在棋盘上放4个棋子,满足A->B->C->D->A,其中走的规则 ...
- 模拟赛 Problem 3 经营与开发(exploit.cpp/c/pas)
Problem 3 经营与开发(exploit.cpp/c/pas) [题目描述] 4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以“EX”为开头的英语单词. eXpl ...
- mysql bin-log 设置
mysql 的事物日至为 [root@localhost mysql]# ls -ldtr mysql-bin.* -rw-rw---- mysql mysql 4月 : mysql-bin. -rw ...
- CN Internet
来自为知笔记(Wiz)
- HDU 3008 DP
基础DP题 打BOSS BOSS和自己都有100点血.玩家先手 每回合能够选择施放技能攻击(耗蓝,共n种)或者普通攻击(不耗蓝,伤害为1),BOSS每回合会攻击自己q点血,每回合自己会恢复t点法力 ...
- Android中apk动态载入技术研究(2)android插件化及实现
了解了android中类载入的前期知识点后,来看看android中DexClassLoader详细的实现 详细载入流程例如以下: 宿主程序会到文件系统比方SD卡中去载入APK[1],然 ...
- Centos 7 nginx-1.12.0编译安装
参考:http://www.nginx.cn/install 也不知道我的系统是否有这些依赖包,试试吧?缺少哪些我就装哪些吧,多踏点坑总是能学到点东西的. 获取nginx包 http://ngin ...
- 第一章--linux基础
(一):linux系统根文件夹结构 Unix-like系统中的"文件系统"的概念包含两个意思,第一个是"根文件系统",第二个是"存储类文件系统&quo ...