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事件机制有更清晰的认识和理解. 当然肯定会存在一些表述不清或者理解不够标准的地方,还请各位大神. ...
随机推荐
- Oracle 数据库 简单查询
select DISTINCT dept_id from s_emp; desc s_emp; ; --给入职3年以上员工发10万元年终奖 ; --列出职位是仓库管理员的名字和工资 select la ...
- Tomcat 一端口多项目,多端口多项目 server.xml
8080端口下项目的webURL为 http://localhost:8080/HelloWorld_spring/HelloController/helloWorld 8081端口下项目 ...
- C语言中的数组与指针
1. 数组的初始化 数组的初始化方法有很多,常用的方法有 定义时初始化 ]={,,}; 或 ]={}; //未初始化的元素全为0: 定义后遍历赋值初始化 int arr[3]; for(int i=0 ...
- 【工具推荐】截图工具 Snipaste
0. 说明 [官网介绍] Snipaste 是一个简单但强大的截图工具,也可以让你将截图贴回到屏幕上!下载并打开 Snipaste,按下 F1 来开始截图,再按 F3,截图就在桌面置顶显示了.就这么简 ...
- plupload 大文件分片上传与PHP分片合并探索
最近老大分给我了做一个电影cms系统,其中涉及到一个功能,使用七牛云的文件上传功能.七牛javascript skd,使用起来很方便,屏蔽了许多的技术细节.如果只满足与调用sdk,那么可能工作中也就没 ...
- jdk1.7环境配置
JDK1.7的环境配置(我的是jdk1.7,文件名写快了,忽略忽略) 官网下载自己需要的版本(ps:我这是朋友发给我的就不提供官网地址,去百度搜jdk就可以了) 下载下来除了改存放路径还有记得再jdk ...
- eclipse能正常启动tomcat,但是网页访问不了
参考网址https://blog.csdn.net/did_itmyway/article/details/62099930
- Spark项目之电商用户行为分析大数据平台之(二)CentOS7集群搭建
一.CentOS7集群搭建 1.1 准备3台centos7的虚拟机 IP及主机名规划如下: 192.168.123.110 spark1192.168.123.111 spark2192.168.12 ...
- docker devicemapper 问题
DOCKER_OPTS= "--storage-driver=devicemapper --storage-opt dm.basesize=50G --storage-opt dm.da ...
- C++的技术探究
C++深究 函数指针 double pam(int, double); // prototype double (*pf)(int, double); // declare function poin ...