React半科普文
什么是React
以下是官方定义,反正我是没看懂。google了下,大家都称之“前端UI开发框架”,勉强这么叫着吧。可以看下这篇文章对react的介绍,本文更多的是覆盖react的入门实践。
A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES
本文提到的例子可以在这里找到:github链接
getting started
getting-started.html里的例子比较简单,首先引入 react.js、JSXTransformer.js,然后通过 React.render() 方法即可。语法细节什么的可以先不管。
需要注意的点是,最后一段script标签,上面声明了 type="text/jsx",也就是说并不是通常的直接解析执行的脚本,JSXTransformer.js 会对其进行预编译后再执行。
<!DOCTYPE html>
<html>
<head>
<title>getting started</title>
<script src="build/react.js"></script>
<script src="build/JSXTransformer.js"></script>
</head>
<body> <div id="example"></div>
<script type="text/jsx">
React.render(
<h1>Hello, world!</h1>,
document.getElementById('example')
);
</script>
</body>
</html>
好了,看下效果吧。
文件分离
根据以往养成的好习惯,直觉的感觉到,这里应该将组件的定义跟 html 页面分离,不然以后页面肯定就乱糟糟了。示例请查看 separate-file.html
修改后的html文件,瞬间清爽很多。同样需要注意 type="text/jsx"
<!DOCTYPE html>
<html>
<head>
<title>demo</title>
<script src="build/react.js"></script>
<script src="build/JSXTransformer.js"></script>
</head>
<body> <div id="example"></div> <script type="text/jsx" src="js/helloworld.js"></script>
</body>
</html>
处理后的 helloworld.js,其实内容一点变化都没有
React.render(
<h1>Hello, world!</h1>,
document.getElementById('example')
);
好了,查看效果。双击 separate-file.html,这时看到页面是空白的,同时控制台还有错误信息。
肿么办呢?相信有经验的兄弟知道咋整了。这里偷个懒,直接用fis起个本地服务器。在2015.04.09-react/ 根路径下运行
Server端编译
之前提到,JSXTransformer.js 会对标志 type="text/jsx" 的script 进行预编译后再执行,那么在浏览器端很可能就会遇到性能问题(没验证过)。React 的开发团队当然也考虑到这个问题了,于是也提供了server端的编译工具。
请查看 server-build-without-transform.html 。这里我们已经把 JSXTransformer.js 的依赖去掉。相对应的,我们需要在server端做一定的编译工作。
<!DOCTYPE html>
<html>
<head>
<title>demo</title>
<script src="build/react.js"></script>
<!-- <script src="build/JSXTransformer.js"></script> -->
</head>
<body> <div id="example"></div> <script src="js-build/helloworld.js"></script>
</body>
</html>
挺简单的,安装 react-tools,然后运行相应命令即可
npm install -g react-tools
jsx --watch js/ js-build/
可以看到,js/helloworld.js 已经被编译成 js-build/helloworld.js。我们看下编译后的文件
编译后的文件。可以看到,都是浏览器可以理解的语法。你也可以一开始就这样编写,不过保证你会抓狂。
React.render(
React.createElement("h1", null, "Hello, world!"),
document.getElementById('example')
);
定义一个组件
下面定义一个极简的组件 来做说明,示例代码可以查看 define-a-component.html。从代码可以看到:
- 通过
React.createClass()来定义一个组件,该方法需要定义render方法来返回组件对应的 dom 结构 - 通过
React.render()来调用组件。该方法传入两个参数,分别是 对应的组件,父级节点。
<!DOCTYPE html>
<html>
<head>
<title>getting started</title>
<script src="build/react.js"></script>
<script src="build/JSXTransformer.js"></script>
</head>
<body> <div id="example"></div>
<script type="text/jsx">
var HelloComponent = React.createClass({
render: function(){
return (
<div>
<h1>Hello World</h1>
<p>I am Hello World Component</p>
</div>
);
}
}); React.render(
<HelloComponent />,
document.getElementById('example')
);
</script>
</body>
</html>
示例效果如下:
刚接触React组件定义的同学,可能会踩中下面的坑。比如把前面的组件定义改成。区别在于去掉了组件最外层的包裹节点 <div>
var HelloComponent = React.createClass({
render: function(){
return (
<h1>Hello World</h1>
<p>I am Hello World Component</p>
);
}
});
再次访问 http://127.0.0.1:8080/define-a-component.html 会有如下错误提示。错误信息比较明确了,不再赘述,乖乖加上包裹节点就好了
使用property
在定义一个组件时,我们通常会暴露一定的配置项,提高组件的可复用性。这里简单示范下如何实现,具体代码可查看 using-properties.html。
关键代码如下,还是比较直观的。使用组件时,就跟使用浏览器内置的组件那样给属性赋值。在组件定义的内部代码实现中,通过 this.props.xx 来取到对应的值即可。
<script type="text/jsx">
var HelloComponent = React.createClass({
render: function(){
return (
<div>
<h1>Title is: {this.props.title}</h1>
<p>Content is: {this.props.content}</p>
</div>
);
}
});
React.render(
<HelloComponent title="hello" content="world" />,
document.getElementById('example')
);
</script>
组件嵌套
推荐看下 Thinking in React 这篇文章。要实现文中提到的 搭积木式的开发模式,组件的嵌套使用是必不可少的。下面示范下,具体代码查看 compose-components.html。
<!DOCTYPE html>
<html>
<head>
<title>demo</title>
<script src="build/react.js"></script>
<script src="build/JSXTransformer.js"></script>
</head>
<body> <div id="example"></div> <script type="text/jsx"> var Title = React.createClass({
render: function(){
return (
<h1>This is Title</h1>
);
}
}); var Content = React.createClass({
render: function(){
return (
<p>This is Content</p>
);
}
}); // Article组件包含了 Title、Content 组件
var Article = React.createClass({
render: function() {
return (
<div class="article">
<Title />
<Content />
</div>
);
}
}); React.render(
<Article />,
document.getElementById('example')
);
</script>
</body>
</html>
组件更新
在React的体系中,组件的UI会随着组件状态的变化(state)进行更新。从围观的代码层面来说,是 setState() 方法被调用时,组件的UI会刷新。简单例子可以参考 update-if-state-chagne.html。例子可能不是很恰当,就表达那么个意思。
其中有两个方法简单介绍下:
getInitialState:返回组件的初始状态。componentDidMount:当组件渲染完成后调用的方法。
ps:React的组件更新机制是最大的亮点之一。看似全量刷新,实际内部是基于Virtual DOM机制的局部刷新,开发者无需再编写大量的重复代码来更新局部的dom节点。
Virtual DOM以及局部刷新实现机制,这里就不展开了,可参考 http://calendar.perfplanet.com/2013/diff/
<!DOCTYPE html>
<html>
<head>
<title>demo</title>
<script src="build/react.js"></script>
<script src="build/JSXTransformer.js"></script>
</head>
<body> <div id="example"></div>
<script type="text/jsx"> var HelloComponent = React.createClass({
getInitialState: function(){
return {
title: 'title1',
content: 'content1'
};
},
componentDidMount: function(){
var that = this;
setTimeout(function(){
that.setState({
title:'title2',
content:'content2'
});
}, 2000);
},
render: function(){
return (
<div>
<h1>Title is: {this.state.title}</h1>
<p>Content is: {this.state.content}</p>
</div>
);
}
}); React.render(
<HelloComponent />,
document.getElementById('example')
); </script>
</body>
</html>
访问 http://127.0.0.1:8080/update-if-state-chage.html ,刚打开时,展示如下
2000ms后,界面刷新。
Virtual DOM
已经有人写过了,这里直接附上参考链接:http://calendar.perfplanet.com/2013/diff/
react native
TODO 待填坑
React半科普文的更多相关文章
- Hadoop科普文——常见的45个问题解答(CSDN)
Hadoop科普文——常见的45个问题解答 1.Hadoop集群可以运行的3个模式? 单机(本地)模式 伪分布式模式 全分布式模式 2. 单机(本地)模式中的注意点? 在单机模式(standalon ...
- Codeforces Round #311 (Div. 2) E. Ann and Half-Palindrome 字典树/半回文串
E. Ann and Half-Palindrome Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contes ...
- React Router API文档
React Router API文档 一.<BrowserRouter> 使用HTML5历史记录API(pushState,replaceState和popstate事件)的<Rou ...
- Docz 用 MDX 写 React UI 组件文档
Docz 用 MDX 写 React UI 组件文档 前言 为了提升开发效率,创建一套 UI 组件库是一种较为有效的方式之一:可以减少重复工作.提高可复用,所以现在越来越多团队开始创建自己的 UI 组 ...
- 科普文:从人人网看网络科学(Network Science)的X个经典问题
转:https://zr9558.wordpress.com/2013/12/05/科普文:从人人网看网络科学(network-science)的x个经典问/ 长文,写了N个小时写完的.你肯定能看懂, ...
- 使用dumi生成react组件库文档并发布到github pages
周末两天玩了下号称西湖区东半球最牛逼的react文档站点生成工具dumi,顺带结合github pages生成了react-uni-comps文档站, 一套弄下来,感觉真香,现在还只是浅尝,高级的特性 ...
- 前端科普文—为什么<!DOCTYPE> 不可或缺
When question comes 你一定在 HTML 页面最前面看到过这样一行代码(比如 百度): <!DOCTYPE html> 或者说类似这样的(比如 博客园-韩子迟 PS:博客 ...
- 【网络安全】Dos攻击科普文
目录 DOS攻击 什么是DOS攻击 攻击手段分类 具体的攻击方式举例 优秀博客参考 DDOS攻击 DOS攻击 什么是DOS攻击 DOS是Denial of Service的简称,用中文简单翻译就是拒绝 ...
- 【React】354- 一文吃透 React 事件机制原理
大纲 主要分为4大块儿,主要是结合源码对 react事件机制的原理 进行分析,希望可以让你对 react事件机制有更清晰的认识和理解. 当然肯定会存在一些表述不清或者理解不够标准的地方,还请各位大神. ...
随机推荐
- centos7安装mysql5.7修改设置密码策略
centos7操作系统在安装mysql5.7社区版之后会有默认密码,通过grep命令在mysqld.log文件中即可找到,如下所示: 标识位置即在初始化安装时mysql的默认密码,然后通过mysql ...
- scp 利用 ssh 协议 复制文件
有时候,我们使用 scp 命令可以解决我们很多问题: NAME scp — secure copy (remote file copy program) 使用举例:拷贝当前文件,到 系统 10.66. ...
- wget 的 使用方法
问题: 最近在使用 wget ,感觉有很多的功能都不会,现在进行写一篇文章,更新一些wget的使用技巧,防止以后忘记的时候,重新回来进行查阅. 正文: 现在经常使用: curl -O url 下载文件 ...
- 怎么查看自己电脑的IP地址
1/2 使用Windows+R键打开“运行”窗口,然后输入CMD进入命令提示窗口 进入命令窗口之后,输入:ipconfig/all 回车即可看到整个电脑的详细的IP配置信息 1/3 使用网络状态查看I ...
- 乘风破浪:LeetCode真题_040_Combination Sum II
乘风破浪:LeetCode真题_040_Combination Sum II 一.前言 这次和上次的区别是元素不能重复使用了,这也简单,每一次去掉使用过的元素即可. 二.Combination Sum ...
- 关于MVC开发时,无法找到area的问题记录
解决方法: 检查area=admin 的dll是否生成,一般都是admin域生成dll导致
- Android友盟推送
当前版本号:v3.0.5 1.下载SDK解压并导入(import module,compile project(':PushSDK')),里面有demo,用demo的包名去官网添加一个应用,然后替换d ...
- centos限制远程尝试密码次数
CentOS中有一个pam_tally2.so的PAM模块,来限定用户的登录失败次数,如果次数达到设置的阈值,则锁定用户.编译PAM的配置文件 # vim /etc/pam.d/login添加: au ...
- 【FRM123】Wrong Way Risk
https://www.investopedia.com/articles/investing/102015/introduction-wrong-way-risk.asp https://www.r ...
- day2-课堂代码
# 字符串常用属性和操作 # a = 'aa' # b = 'bb' # c = 'cc' # d = a + b + c # print(d) # age = 50 # print('田老师的年龄是 ...